diff --git a/src/seq/seqCom.h b/src/seq/seqCom.h
index 37ec9a1f8a41e47b1cd5120ff8d8d75cf38712ef..ad99b3e9246bb33411efcc148b8bc311b5b9cc46 100644
--- a/src/seq/seqCom.h
+++ b/src/seq/seqCom.h
@@ -89,6 +89,8 @@ epicsShareFunc seqBool seq_pvGetComplete(SS_ID, VAR_ID,
 	unsigned, seqBool, seqBool*);
 epicsShareFunc seqBool seq_pvPutComplete(SS_ID, VAR_ID,
 	unsigned, seqBool, seqBool*);
+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 void seq_pvSync(SS_ID, VAR_ID, unsigned, EV_ID);
diff --git a/src/seq/seq_if.c b/src/seq/seq_if.c
index 71c62bffafb52ea70a4b5930fb9a6c1e7a0ecb8b..ce1625fecf67419d68ef46c819b59ccfde0ab3ae 100644
--- a/src/seq/seq_if.c
+++ b/src/seq/seq_if.c
@@ -297,6 +297,37 @@ epicsShareFunc boolean seq_pvGetComplete(
 	return any?anyDone:allDone;
 }
 
+/*
+ * Cancel the last asynchronous get request.
+ */
+epicsShareFunc void seq_pvGetCancel(
+	SS_ID		ss,
+	VAR_ID		varId,
+	unsigned	length)
+{
+	PROG		*sp = ss->prog;
+	unsigned	n;
+
+	for (n = 0; n < length; n++)
+	{
+		epicsEventId	getSem = ss->getSem[varId+n];
+		CHAN		*ch = ss->prog->chan + varId + n;
+
+		if (!ch->dbch)
+		{
+		        if (!optTest(sp, OPT_SAFE))
+			        errlogSevPrintf(errlogMinor,
+				        "pvGetCancel(%s): user error (variable not assigned)\n",
+				        ch->varName);
+		}
+		else
+		{
+			ss->getReq[varId] = NULL;
+			epicsEventSignal(getSem);
+		}
+	}
+}
+
 /* -------------------------------------------------------------------------- */
 
 struct putq_cp_arg {
@@ -615,6 +646,37 @@ epicsShareFunc boolean seq_pvPutComplete(
 	return any?anyDone:allDone;
 }
 
+/*
+ * Cancel the last asynchronous put request.
+ */
+epicsShareFunc void seq_pvPutCancel(
+	SS_ID		ss,
+	VAR_ID		varId,
+	unsigned	length)
+{
+	PROG		*sp = ss->prog;
+	unsigned	n;
+
+	for (n = 0; n < length; n++)
+	{
+		epicsEventId	putSem = ss->putSem[varId+n];
+		CHAN		*ch = ss->prog->chan + varId + n;
+
+		if (!ch->dbch)
+		{
+		        if (!optTest(sp, OPT_SAFE))
+			        errlogSevPrintf(errlogMinor,
+				        "pvPutCancel(%s): user error (variable not assigned)\n",
+				        ch->varName);
+		}
+		else
+		{
+			ss->putReq[varId] = NULL;
+			epicsEventSignal(putSem);
+		}
+	}
+}
+
 /* -------------------------------------------------------------------------- */
 
 /*
diff --git a/src/snc/builtin.c b/src/snc/builtin.c
index ada599be98afbcc091ee5edb44790f33b667aba6..7d666fffc4e3132a275630e3f7d6cc08f26095fb 100644
--- a/src/snc/builtin.c
+++ b/src/snc/builtin.c
@@ -68,6 +68,7 @@ static struct func_symbol func_symbols[] =
     {"pvFlushQ",        FT_PV,      FALSE,  0,          FALSE,          FALSE,  FALSE},
     {"pvFreeQ",         FT_PV,      FALSE,  0,          FALSE,          FALSE,  FALSE},
     {"pvGet",           FT_PV,      FALSE,  1,          FALSE,          FALSE,  FALSE},
+    {"pvGetCancel",     FT_PV,      TRUE,   0,          FALSE,          FALSE,  FALSE},
     {"pvGetComplete",   FT_PV,      TRUE,   2,          FALSE,          FALSE,  FALSE},
     {"pvGetQ",          FT_PV,      FALSE,  0,          FALSE,          FALSE,  FALSE},
     {"pvIndex",         FT_PV,      FALSE,  0,          FALSE,          FALSE,  FALSE},
@@ -75,6 +76,7 @@ static struct func_symbol func_symbols[] =
     {"pvMonitor",       FT_PV,      FALSE,  0,          FALSE,          FALSE,  FALSE},
     {"pvName",          FT_PV,      FALSE,  0,          FALSE,          FALSE,  FALSE},
     {"pvPut",           FT_PV,      FALSE,  1,          FALSE,          FALSE,  FALSE},
+    {"pvPutCancel",     FT_PV,      TRUE,   0,          FALSE,          FALSE,  FALSE},
     {"pvPutComplete",   FT_PV,      TRUE,   2,          FALSE,          FALSE,  FALSE},
     {"pvSeverity",      FT_PV,      FALSE,  0,          FALSE,          FALSE,  FALSE},
     {"pvStatus",        FT_PV,      FALSE,  0,          FALSE,          FALSE,  FALSE},