diff --git a/require.c b/require.c
index 3541550af86035ababa68bc87d9bf11c93cc4185..584da63799a2a6d54ae7aab17e76e23a2dcffc05 100644
--- a/require.c
+++ b/require.c
@@ -13,7 +13,11 @@
 #include <epicsVersion.h>
 #ifndef BASE_VERSION
 /* This is R3.14.* */
+#include <iocsh.h>
 extern int iocshCmd (const char *cmd);
+#include <dbAccess.h>
+#include <epicsExit.h>
+#include <epicsExport.h>
 #endif
 
 int dbLoadDatabase(char *filename, char *path, char *substitutions);
@@ -246,3 +250,32 @@ int libversionShow(char* pattern)
     symEach(sysSymTbl, (FUNCPTR)printIfLibversion, (int)pattern);
     return OK;
 }
+
+#ifndef BASE_VERSION
+static const iocshArg requireArg0 = { "module", iocshArgString };
+static const iocshArg requireArg1 = { "version", iocshArgString };
+static const iocshArg * const requireArgs[2] = { &requireArg0, &requireArg1 };
+static const iocshFuncDef requireDef = { "require", 2, requireArgs };
+static void requireFunc (const iocshArgBuf *args)
+{
+    if (require (args[0].sval, args[1].sval) != 0
+        && !interruptAccept)
+    {
+        /* require failed in startup script before iocInit */
+        fprintf (stderr, "Aborting startup script\n");
+        epicsExit (1);
+    }
+}
+
+static void requireRegister(void)
+{
+    static int firstTime = 1;
+    if (firstTime) {
+        iocshRegister (&requireDef, requireFunc);
+        firstTime = 0;
+    }
+}
+
+epicsExportRegistrar(requireRegister);
+
+#endif
diff --git a/require.dbd b/require.dbd
new file mode 100644
index 0000000000000000000000000000000000000000..fd7c58b7cc99c3ff8b408598b7c7821280c8c4e7
--- /dev/null
+++ b/require.dbd
@@ -0,0 +1 @@
+registrar(requireRegister)