diff --git a/src/seq/seqCom.h b/src/seq/seqCom.h
index 577f7f7563ac4a9cce9919164718abfbfc5e30be..f4ba80ee6301fe8a6094f21c0d8c8b2e2395e468 100644
--- a/src/seq/seqCom.h
+++ b/src/seq/seqCom.h
@@ -55,7 +55,7 @@ typedef struct _seq_vars SEQ_VARS;	/* struct defined in generated code */
 typedef char string[MAX_STRING_SIZE];	/* representation of SNL string type */
 
 /* these typedefs make the code more self documenting */
-typedef unsigned EV_ID;			/* identifier for an event */
+typedef unsigned EF_ID;			/* identifier for an event */
 typedef unsigned CH_ID;		/* identifier for a pv */
 typedef int seqBool;
 
@@ -68,10 +68,10 @@ typedef struct seqProgram seqProgram;	/* struct defined in generated code */
  */
 
 /* event flag operations */
-epicsShareFunc void seq_efSet(SS_ID, EV_ID);
-epicsShareFunc seqBool seq_efTest(SS_ID, EV_ID);
-epicsShareFunc seqBool seq_efClear(SS_ID, EV_ID);
-epicsShareFunc seqBool seq_efTestAndClear(SS_ID, EV_ID);
+epicsShareFunc void seq_efSet(SS_ID, EF_ID);
+epicsShareFunc seqBool seq_efTest(SS_ID, EF_ID);
+epicsShareFunc seqBool seq_efClear(SS_ID, EF_ID);
+epicsShareFunc seqBool seq_efTestAndClear(SS_ID, EF_ID);
 /* pv operations */
 epicsShareFunc pvStat seq_pvGet(SS_ID, CH_ID, enum compType, double tmo);
 epicsShareFunc pvStat seq_pvGetMultiple(SS_ID, CH_ID,
@@ -89,7 +89,7 @@ epicsShareFunc void seq_pvGetCancel(SS_ID, CH_ID, unsigned);
 epicsShareFunc void seq_pvPutCancel(SS_ID, CH_ID, unsigned);
 epicsShareFunc pvStat seq_pvAssign(SS_ID, CH_ID, const char *);
 epicsShareFunc pvStat seq_pvMonitor(SS_ID, CH_ID, unsigned);
-epicsShareFunc void seq_pvSync(SS_ID, CH_ID, unsigned, EV_ID);
+epicsShareFunc void seq_pvSync(SS_ID, CH_ID, unsigned, EF_ID);
 epicsShareFunc pvStat seq_pvStopMonitor(SS_ID, CH_ID, unsigned);
 /* pv info */
 epicsShareFunc char *seq_pvName(SS_ID, CH_ID);
@@ -132,6 +132,7 @@ epicsShareFunc epicsThreadId seq(seqProgram *, const char *, unsigned);
 #define USER_VAR		SEQ_VARS
 #define UserVar			_seq_vars
 #define VAR_ID			CH_ID
+#define EV_ID			EF_ID
 #define seq_pvFreeQ		seq_pvFlushQ
 #define DEFAULT_QUEUE_SIZE	100	/* number of elements */
 
diff --git a/src/seq/seqPvt.h b/src/seq/seqPvt.h
index 2848bf602480a707718e54f154d326e357036c52..9bcf04aff87a8da3fadc2f917844e0f10f9ea8be 100644
--- a/src/seq/seqPvt.h
+++ b/src/seq/seqPvt.h
@@ -94,7 +94,7 @@ struct channel
 
 	/* dynamic channel data (assigned at runtime) */
 	DBCHAN		*dbch;		/* channel assigned to a named db pv */
-	EV_ID		syncedTo;	/* event flag id if synced */
+	EF_ID		syncedTo;	/* event flag id if synced */
 	CHAN		*nextSynced;	/* next channel synced to same flag */
 	QUEUE		queue;		/* queue if queued */
 	boolean		monitored;	/* whether channel is monitored */
@@ -218,7 +218,7 @@ struct pvreq
 void sequencer(void *arg);
 void ss_write_buffer(CHAN *ch, void *val, PVMETA *meta, boolean dirtify);
 void ss_read_buffer(SSCB *ss, CHAN *ch, boolean dirty_only);
-void ss_read_buffer_selective(PROG *sp, SSCB *ss, EV_ID ev_flag);
+void ss_read_buffer_selective(PROG *sp, SSCB *ss, EF_ID ev_flag);
 void ss_wakeup(PROG *sp, unsigned eventNum);
 
 /* seq_mac.c */
diff --git a/src/seq/seq_if.c b/src/seq/seq_if.c
index 69a60de5f6aa2c21278505fb7c4690f90b507b04..2f63201bfdd45b03b8426cfede72bdd67e8aac66 100644
--- a/src/seq/seq_if.c
+++ b/src/seq/seq_if.c
@@ -769,7 +769,7 @@ epicsShareFunc pvStat seq_pvStopMonitor(SS_ID ss, CH_ID chId, unsigned length)
  * Synchronize pv with an event flag.
  * ev_flag == 0 means unSync.
  */
-epicsShareFunc void seq_pvSync(SS_ID ss, CH_ID chId, unsigned length, EV_ID new_ev_flag)
+epicsShareFunc void seq_pvSync(SS_ID ss, CH_ID chId, unsigned length, EF_ID new_ev_flag)
 {
 	PROG	*sp = ss->prog;
 	unsigned i;
@@ -780,7 +780,7 @@ epicsShareFunc void seq_pvSync(SS_ID ss, CH_ID chId, unsigned length, EV_ID new_
 	for (i=0; i<length; i++)
 	{
 		CHAN	*this_ch = sp->chan + chId + i;
-		EV_ID	old_ev_flag = this_ch->syncedTo;
+		EF_ID	old_ev_flag = this_ch->syncedTo;
 
 		if (old_ev_flag != new_ev_flag)
 		{
@@ -937,13 +937,12 @@ epicsShareFunc epicsTimeStamp seq_pvTimeStamp(SS_ID ss, CH_ID chId)
  * Set an event flag, then wake up each state
  * set that might be waiting on that event flag.
  */
-epicsShareFunc void seq_efSet(SS_ID ss, EV_ID ev_flag)
+epicsShareFunc void seq_efSet(SS_ID ss, EF_ID ev_flag)
 {
 	PROG	*sp = ss->prog;
 
-	DEBUG("efSet: sp=%p, ss=%p, ev_flag=%d\n", sp, ss,
-		ev_flag);
-	assert(ev_flag > 0 && ev_flag <= ss->prog->numEvFlags);
+	DEBUG("efSet: sp=%p, ev_flag=%d\n", sp, ev_flag);
+	assert(ev_flag > 0 && ev_flag <= sp->numEvFlags);
 
 	epicsMutexMustLock(sp->lock);
 
@@ -956,10 +955,25 @@ epicsShareFunc void seq_efSet(SS_ID ss, EV_ID ev_flag)
 	epicsMutexUnlock(sp->lock);
 }
 
+/*
+ * Initialize an event flag.
+ */
+epicsShareFunc void seq_efInit(PROG_ID sp, EF_ID ev_flag, unsigned val)
+{
+	assert(ev_flag > 0 && ev_flag <= sp->numEvFlags);
+
+	epicsMutexMustLock(sp->lock);
+	if (val)
+		bitSet(sp->evFlags, ev_flag);
+	else
+		bitClear(sp->evFlags, ev_flag);
+	epicsMutexUnlock(sp->lock);
+}
+
 /*
  * Return whether event flag is set.
  */
-epicsShareFunc boolean seq_efTest(SS_ID ss, EV_ID ev_flag)
+epicsShareFunc boolean seq_efTest(SS_ID ss, EF_ID ev_flag)
 /* event flag */
 {
 	PROG	*sp = ss->prog;
@@ -983,7 +997,7 @@ epicsShareFunc boolean seq_efTest(SS_ID ss, EV_ID ev_flag)
 /*
  * Clear event flag.
  */
-epicsShareFunc boolean seq_efClear(SS_ID ss, EV_ID ev_flag)
+epicsShareFunc boolean seq_efClear(SS_ID ss, EF_ID ev_flag)
 {
 	PROG	*sp = ss->prog;
 	boolean	isSet;
@@ -1006,7 +1020,7 @@ epicsShareFunc boolean seq_efClear(SS_ID ss, EV_ID ev_flag)
  * Atomically test event flag against outstanding events, then clear it
  * and return whether it was set.
  */
-epicsShareFunc boolean seq_efTestAndClear(SS_ID ss, EV_ID ev_flag)
+epicsShareFunc boolean seq_efTestAndClear(SS_ID ss, EF_ID ev_flag)
 {
 	PROG	*sp = ss->prog;
 	boolean	isSet;
@@ -1063,7 +1077,7 @@ epicsShareFunc boolean seq_pvGetQ(SS_ID ss, CH_ID chId)
 	PROG	*sp = ss->prog;
 	CHAN	*ch = sp->chan + chId;
 	void	*var = valPtr(ch,ss);
-	EV_ID	ev_flag = ch->syncedTo;
+	EF_ID	ev_flag = ch->syncedTo;
 	PVMETA	*meta = metaPtr(ch,ss);
 	boolean	was_empty;
 	struct getq_cp_arg arg = {ch, var, meta};
@@ -1100,7 +1114,7 @@ epicsShareFunc void seq_pvFlushQ(SS_ID ss, CH_ID chId)
 {
 	PROG	*sp = ss->prog;
 	CHAN	*ch = sp->chan + chId;
-	EV_ID	ev_flag = ch->syncedTo;
+	EF_ID	ev_flag = ch->syncedTo;
 	QUEUE	queue = ch->queue;
 
 	DEBUG("pvFlushQ: pv name=%s, count=%d\n",
diff --git a/src/seq/seq_snc.h b/src/seq/seq_snc.h
index 0e6987c72c2cee818a5952564b1aa479930896bc..5d59c7e8ac03e5599ea559c242e48fd1ea532466 100644
--- a/src/seq/seq_snc.h
+++ b/src/seq/seq_snc.h
@@ -85,7 +85,7 @@ struct seqChan
 	enum prim_type_tag varType;	/* variable (base) type */
 	unsigned	count;		/* element count for arrays */
 	unsigned	eventNum;	/* event number for this channel */
-	EV_ID		efId;		/* event flag id if synced */
+	EF_ID		efId;		/* event flag id if synced */
 	seqBool		monitored;	/* whether channel should be monitored */
 	unsigned	queueSize;	/* syncQ queue size (0=not queued) */
 	unsigned	queueIndex;	/* syncQ queue index */
@@ -130,6 +130,8 @@ struct seqProgram
 	unsigned	numQueues;	/* number of syncQ queues */
 };
 
+epicsShareFunc void seq_efInit(PROG_ID sp, EF_ID ev_flag, unsigned val);
+
 /* called by generated main and registrar routines */
 epicsShareFunc void seqRegisterSequencerProgram(seqProgram *p);
 epicsShareFunc void seqRegisterSequencerCommands(void);
diff --git a/src/seq/seq_task.c b/src/seq/seq_task.c
index f63e71b213971b52d7bc33159417b1a1dcccd671..7b6e3b995ca21e7f56523340e8fc2391ba2957fe 100644
--- a/src/seq/seq_task.c
+++ b/src/seq/seq_task.c
@@ -197,7 +197,7 @@ static void ss_read_all_buffer(PROG *sp, SSCB *ss)
  * NOTE: calling code must take sp->lock, as we traverse
  * the list of channels synced to this event flag.
  */
-void ss_read_buffer_selective(PROG *sp, SSCB *ss, EV_ID ev_flag)
+void ss_read_buffer_selective(PROG *sp, SSCB *ss, EF_ID ev_flag)
 {
 	CHAN *ch = sp->syncedChans[ev_flag];
 	while (ch)