diff --git a/src/seq/seqCom.h b/src/seq/seqCom.h
index 555b71e9e0ff740e18d048f547c1eb253657dc3d..f818b765c8c5e8a2a84f5ed810e5664f1547de9e 100644
--- a/src/seq/seqCom.h
+++ b/src/seq/seqCom.h
@@ -94,9 +94,9 @@ epicsShareFunc seqBool seq_pvPutComplete(SS_ID, VAR_ID,
 epicsShareFunc void seq_pvGetCancel(SS_ID, VAR_ID, unsigned);
 epicsShareFunc void seq_pvPutCancel(SS_ID, VAR_ID, unsigned);
 epicsShareFunc pvStat seq_pvAssign(SS_ID, VAR_ID, const char *);
-epicsShareFunc pvStat seq_pvMonitor(SS_ID, VAR_ID);
+epicsShareFunc pvStat seq_pvMonitor(SS_ID, VAR_ID, unsigned);
 epicsShareFunc void seq_pvSync(SS_ID, VAR_ID, unsigned, EV_ID);
-epicsShareFunc pvStat seq_pvStopMonitor(SS_ID, VAR_ID);
+epicsShareFunc pvStat seq_pvStopMonitor(SS_ID, VAR_ID, unsigned);
 /* pv info */
 epicsShareFunc char *seq_pvName(SS_ID, VAR_ID);
 epicsShareFunc unsigned seq_pvCount(SS_ID, VAR_ID);
diff --git a/src/seq/seq_if.c b/src/seq/seq_if.c
index 0841a79a83b1eaa19540f587bee86fe29dd505c1..a613576fd6a67f3a01b7a9ae78301ceb7ffd94cb 100644
--- a/src/seq/seq_if.c
+++ b/src/seq/seq_if.c
@@ -692,53 +692,77 @@ epicsShareFunc pvStat seq_pvAssign(SS_ID ss, VAR_ID varId, const char *pvName)
 /*
  * Initiate a monitor.
  */
-epicsShareFunc pvStat seq_pvMonitor(SS_ID ss, VAR_ID varId)
+epicsShareFunc pvStat seq_pvMonitor(SS_ID ss, VAR_ID varId, unsigned length)
 {
 	PROG	*sp = ss->prog;
-	CHAN	*ch = sp->chan + varId;
-	DBCHAN	*dbch = ch->dbch;
+	pvStat	status = pvStatOK;
+	unsigned i;
 
-	if (!dbch && optTest(sp, OPT_SAFE))
+	for (i=0; i<length; i++)
 	{
+		CHAN	*ch = sp->chan + varId + i;
+		DBCHAN	*dbch = ch->dbch;
+
+		if (!dbch && optTest(sp, OPT_SAFE))
+		{
+			ch->monitored = TRUE;
+			continue;
+		}
+		if (!dbch)
+		{
+			errlogSevPrintf(errlogMajor,
+				"pvMonitor(%s): user error (not assigned to a PV)\n",
+				ch->varName
+			);
+			return pvStatERROR;
+		}
 		ch->monitored = TRUE;
-		return pvStatOK;
-	}
-	if (!dbch)
-	{
-		errlogSevPrintf(errlogMajor,
-			"pvMonitor(%s): user error (variable not assigned)\n",
-			ch->varName
-		);
-		return pvStatERROR;
+		status = seq_camonitor(ch, TRUE);
+		if (status != pvStatOK)
+		{
+			pv_call_failure(dbch, metaPtr(ch,ss), status);
+			break;
+		}
 	}
-	ch->monitored = TRUE;
-	return seq_camonitor(ch, TRUE);
+	return status;
 }
 
 /*
  * Cancel a monitor.
  */
-epicsShareFunc pvStat seq_pvStopMonitor(SS_ID ss, VAR_ID varId)
+epicsShareFunc pvStat seq_pvStopMonitor(SS_ID ss, VAR_ID varId, unsigned length)
 {
 	PROG	*sp = ss->prog;
-	CHAN	*ch = sp->chan + varId;
-	DBCHAN	*dbch = ch->dbch;
+	pvStat	status = pvStatOK;
+	unsigned i;
 
-	if (!dbch && optTest(sp, OPT_SAFE))
+	for (i=0; i<length; i++)
 	{
+		CHAN	*ch = sp->chan + varId + i;
+		DBCHAN	*dbch = ch->dbch;
+
+		if (!dbch && optTest(sp, OPT_SAFE))
+		{
+			ch->monitored = FALSE;
+			continue;
+		}
+		if (!dbch)
+		{
+			errlogSevPrintf(errlogMajor,
+				"pvStopMonitor(%s): user error (not assigned to a PV)\n",
+				ch->varName
+			);
+			return pvStatERROR;
+		}
 		ch->monitored = FALSE;
-		return pvStatOK;
-	}
-	if (!dbch)
-	{
-		errlogSevPrintf(errlogMajor,
-			"pvStopMonitor(%s): user error (variable not assigned)\n",
-			ch->varName
-		);
-		return pvStatERROR;
+		status =  seq_camonitor(ch, FALSE);
+		if (status != pvStatOK)
+		{
+			pv_call_failure(dbch, metaPtr(ch,ss), status);
+			break;
+		}
 	}
-	ch->monitored = FALSE;
-	return seq_camonitor(ch, FALSE);
+	return status;
 }
 
 /*