diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html
index 111c604d3..3a3f0d3be 100644
--- a/documentation/RELEASE_NOTES.html
+++ b/documentation/RELEASE_NOTES.html
@@ -584,6 +584,11 @@ of its CALLBACK objects.
+Add osiSockOptMcastLoop_t and osiSockTest
+
+Added a new OS-independent typedef for multicast socket options, and a test
+file to check their correct operation.
+
Support for CONFIG_SITE.local in Base
This feature is mostly meant for use by developers; configuration
diff --git a/src/std/rec/test/regressLinkMS.db b/src/std/rec/test/regressLinkMS.db
deleted file mode 100644
index 612c18afa..000000000
--- a/src/std/rec/test/regressLinkMS.db
+++ /dev/null
@@ -1,13 +0,0 @@
-record(ai, "alarm") {
- field(HIGH, 1)
- field(HSV, MINOR)
- field(HIHI, 2)
- field(HHSV, MAJOR)
- field(FLNK, "latch")
-}
-
-record(calc, "latch") {
- field(INPA, "alarm NPP MS")
- field(INPB, "latch NPP MS")
- field(CALC, "A")
-}
diff --git a/src/std/rec/test/softTest.c b/src/std/rec/test/softTest.c
deleted file mode 100644
index d92bf64dd..000000000
--- a/src/std/rec/test/softTest.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/*************************************************************************\
-* Copyright (c) 2017 UChicago Argonne LLC, as operator of Argonne
-* National Laboratory.
-* EPICS BASE is distributed subject to a Software License Agreement found
-* in file LICENSE that is included with this distribution.
-\*************************************************************************/
-
-#include
-
-#include "dbAccess.h"
-#include "dbStaticLib.h"
-#include "dbTest.h"
-#include "dbUnitTest.h"
-#include "errlog.h"
-#include "registryFunction.h"
-#include "subRecord.h"
-#include "testMain.h"
-
-static
-void checkDtyp(const char *rec)
-{
- char dtyp[16];
-
- strcpy(dtyp, rec);
- strcat(dtyp, ".DTYP");
-
- testdbGetFieldEqual(dtyp, DBF_LONG, 0); /* Soft Channel = 0 */
-}
-
-static
-void checkInput(const char *rec, int value)
-{
- char proc[16];
-
- testDiag("Checking record '%s'", rec);
-
- strcpy(proc, rec);
- strcat(proc, ".PROC");
-
- testdbPutFieldOk(proc, DBF_CHAR, 1);
-
- testdbGetFieldEqual(rec, DBF_LONG, value);
-}
-
-static
-void testGroup0(void)
-{
- const char ** rec;
- const char * records[] = {
- "ai0", "bi0", "di0", "ii0", "li0", "lsi0", "mi0", "si0", NULL
- };
-
- testDiag("============ Starting %s ============", EPICS_FUNCTION);
-
- testdbPutFieldOk("source", DBF_LONG, 1);
- for (rec = records; *rec; rec++) {
- checkInput(*rec, 1);
- checkDtyp(*rec);
- }
-
- testdbPutFieldOk("source", DBF_LONG, 0);
- for (rec = records; *rec; rec++) {
- checkInput(*rec, 0);
- }
-}
-
-static
-void testGroup1(void)
-{
- const char ** rec;
- const char * records[] = {
- "bi1",
- "ai1", "di1", "ii1", "li1", "lsi1", "mi1", "si1", NULL
- };
- int init = 1; /* bi1 initializes to 1 */
-
- testDiag("============ Starting %s ============", EPICS_FUNCTION);
-
- for (rec = records; *rec; rec++) {
- checkInput(*rec, init);
- init = 9; /* remainder initialize to 9 */
- }
-}
-
-int dest;
-
-static
-long destSubr(subRecord *prec)
-{
- dest = prec->val;
- return 0;
-}
-
-static
-void checkOutput(const char *rec, int value)
-{
- testDiag("Checking record '%s'", rec);
-
- testdbPutFieldOk(rec, DBF_LONG, value);
-
- testOk(dest == value, "value %d output -> %d", value, dest);
-}
-
-static
-void testGroup2(void)
-{
- const char ** rec;
- const char * records[] = {
- "ao0", "bo0", "io0", "lo0", "lso0", "mo0", "so0", NULL,
- };
-
- testDiag("============ Starting %s ============", EPICS_FUNCTION);
-
- for (rec = records; *rec; rec++) {
- checkOutput(*rec, 1);
- checkDtyp(*rec);
- }
- checkOutput("do0.B0", 1);
- checkDtyp("do0");
-
- for (rec = records; *rec; rec++) {
- checkOutput(*rec, 0);
- }
- checkOutput("do0.B0", 0);
-}
-
-static
-void testGroup3(void)
-{
- const char ** rec;
- const char * records[] = {
- "ao1", "bo1", "do1.B0", "io1", "lo1", "lso1", "mo1", "so1", NULL,
- };
-
- testDiag("============ Starting %s ============", EPICS_FUNCTION);
-
- for (rec = records; *rec; rec++) {
- checkOutput(*rec, 0);
- }
-}
-
-void recTestIoc_registerRecordDeviceDriver(struct dbBase *);
-
-MAIN(softTest)
-{
- testPlan(114);
-
- testdbPrepare();
- testdbReadDatabase("recTestIoc.dbd", NULL, NULL);
-
- recTestIoc_registerRecordDeviceDriver(pdbbase);
- registryFunctionAdd("destSubr", (REGISTRYFUNCTION) destSubr);
-
- testdbReadDatabase("softTest.db", NULL, NULL);
-
- eltc(0);
- testIocInitOk();
- eltc(1);
-
- testGroup0();
- testGroup1();
- testGroup2();
- testGroup3();
-
- testIocShutdownOk();
- testdbCleanup();
-
- return testDone();
-}
diff --git a/src/std/rec/test/softTest.db b/src/std/rec/test/softTest.db
deleted file mode 100644
index 010a47a5c..000000000
--- a/src/std/rec/test/softTest.db
+++ /dev/null
@@ -1,227 +0,0 @@
-# Group 0 are input records with INP being a DB link to 'source'.
-# Processing them reads that value.
-
-record(longin, "source") {}
-
-record(ai, "ai0") {
- field(DTYP, "Soft Channel")
- field(INP, "source")
-}
-record(bi, "bi0") {
- field(DTYP, "Soft Channel")
- field(INP, "source")
- field(ZNAM, "Zero")
- field(ONAM, "One")
-}
-record(int64in, "ii0") {
- field(DTYP, "Soft Channel")
- field(INP, "source")
-}
-record(longin, "li0") {
- field(DTYP, "Soft Channel")
- field(INP, "source")
-}
-record(mbbiDirect, "di0") {
- field(DTYP, "Soft Channel")
- field(NOBT, 4)
- field(INP, "source")
-}
-record(mbbi, "mi0") {
- field(DTYP, "Soft Channel")
- field(NOBT, 4)
- field(INP, "source")
- field(ZRST, "Zero")
- field(ONST, "One")
- field(TWST, "Two")
- field(THST, "Three")
- field(FRST, "Four")
- field(FVST, "Five")
- field(SXST, "Six")
- field(SVST, "Seven")
- field(EIST, "Eight")
- field(NIST, "Nine")
- field(TEST, "Ten")
- field(ELST, "Eleven")
- field(TWST, "Twelve")
- field(TTST, "Thirteen")
- field(FTST, "Fourteen")
- field(FFST, "Fifteen")
-}
-record(lsi, "lsi0") {
- field(DTYP, "Soft Channel")
- field(SIZV, 40)
- field(INP, "source")
-}
-record(stringin, "si0") {
- field(DTYP, "Soft Channel")
- field(INP, "source")
-}
-
-# Group 1 are input records with INP being a non-zero constant.
-# Processing them succeeds but does not change VAL.
-
-record(ai, "ai1") {
- field(DTYP, "Soft Channel")
- field(INP, {const:9})
-}
-record(bi, "bi1") {
- field(DTYP, "Soft Channel")
- field(INP, {const:1})
- field(ZNAM, "Zero")
- field(ONAM, "One")
-}
-record(int64in, "ii1") {
- field(DTYP, "Soft Channel")
- field(INP, {const:9})
-}
-record(longin, "li1") {
- field(DTYP, "Soft Channel")
- field(INP, {const:9})
-}
-record(mbbiDirect, "di1") {
- field(DTYP, "Soft Channel")
- field(NOBT, 4)
- field(INP, {const:9})
-}
-record(mbbi, "mi1") {
- field(DTYP, "Soft Channel")
- field(NOBT, 4)
- field(INP, {const:9})
- field(ZRST, "Zero")
- field(ONST, "One")
- field(TWST, "Two")
- field(THST, "Three")
- field(FRST, "Four")
- field(FVST, "Five")
- field(SXST, "Six")
- field(SVST, "Seven")
- field(EIST, "Eight")
- field(NIST, "Nine")
- field(TEST, "Ten")
- field(ELST, "Eleven")
- field(TWST, "Twelve")
- field(TTST, "Thirteen")
- field(FTST, "Fourteen")
- field(FFST, "Fifteen")
-}
-record(lsi, "lsi1") {
- field(DTYP, "Soft Channel")
- field(SIZV, 40)
- field(INP, {const:"9"})
-}
-record(stringin, "si1") {
- field(DTYP, "Soft Channel")
- field(INP, {const:"9"})
-}
-
-
-# Group 2 are output records with OUT being a DB link to 'dest' with PP.
-# Putting a value to them writes that value to 'dest'.
-
-record(sub, "dest") {
- field(SNAM, "destSubr")
-}
-
-record(ao, "ao0") {
- field(DTYP, "Soft Channel")
- field(OUT, "dest PP")
-}
-record(bo, "bo0") {
- field(DTYP, "Soft Channel")
- field(OUT, "dest PP")
- field(ZNAM, "Zero")
- field(ONAM, "One")
-}
-record(int64out, "io0") {
- field(DTYP, "Soft Channel")
- field(OUT, "dest PP")
-}
-record(longout, "lo0") {
- field(DTYP, "Soft Channel")
- field(OUT, "dest PP")
-}
-record(mbboDirect, "do0") {
- field(DTYP, "Soft Channel")
- field(NOBT, 4)
- field(OUT, "dest PP")
-}
-record(mbbo, "mo0") {
- field(DTYP, "Soft Channel")
- field(NOBT, 4)
- field(OUT, "dest PP")
- field(ZRST, "Zero")
- field(ONST, "One")
- field(TWST, "Two")
- field(THST, "Three")
- field(FRST, "Four")
- field(FVST, "Five")
- field(SXST, "Six")
- field(SVST, "Seven")
- field(EIST, "Eight")
- field(NIST, "Nine")
- field(TEST, "Ten")
- field(ELST, "Eleven")
- field(TWST, "Twelve")
- field(TTST, "Thirteen")
- field(FTST, "Fourteen")
- field(FFST, "Fifteen")
-}
-record(lso, "lso0") {
- field(DTYP, "Soft Channel")
- field(OUT, "dest PP")
- field(SIZV, 40)
-}
-record(stringout, "so0") {
- field(DTYP, "Soft Channel")
- field(OUT, "dest PP")
-}
-
-
-# Group 3 are output records with OUT being empty (a constant link).
-# Putting a value to them must succeed.
-
-record(ao, "ao1") {
- field(DTYP, "Soft Channel")
-}
-record(bo, "bo1") {
- field(DTYP, "Soft Channel")
- field(ZNAM, "Zero")
- field(ONAM, "One")
-}
-record(int64out, "io1") {
- field(DTYP, "Soft Channel")
-}
-record(longout, "lo1") {
- field(DTYP, "Soft Channel")
-}
-record(mbboDirect, "do1") {
- field(DTYP, "Soft Channel")
- field(NOBT, 4)
-}
-record(mbbo, "mo1") {
- field(DTYP, "Soft Channel")
- field(NOBT, 4)
- field(ZRST, "Zero")
- field(ONST, "One")
- field(TWST, "Two")
- field(THST, "Three")
- field(FRST, "Four")
- field(FVST, "Five")
- field(SXST, "Six")
- field(SVST, "Seven")
- field(EIST, "Eight")
- field(NIST, "Nine")
- field(TEST, "Ten")
- field(ELST, "Eleven")
- field(TWST, "Twelve")
- field(TTST, "Thirteen")
- field(FTST, "Fourteen")
- field(FFST, "Fifteen")
-}
-record(lso, "lso1") {
- field(DTYP, "Soft Channel")
- field(SIZV, 40)
-}
-record(stringout, "so1") {
- field(DTYP, "Soft Channel")
-}