diff --git a/autosave.Makefile b/autosave.Makefile
index 97b3c6342a4a1ff7d0e8128df168bbdcc223bbaf..bc6c1f15136bd1020a1b4d7e58f272536ef701c3 100644
--- a/autosave.Makefile
+++ b/autosave.Makefile
@@ -73,7 +73,7 @@ DBDS    += $(ASAPPSRC)/asSupport.dbd
 
 SCRIPTS += $(wildcard ../iocsh/*.iocsh)
 
-TEMPLATES += $(ASAAPDB)/save_restoreStatus.db
+TEMPLATES += ../template/save_restoreStatus.db
 TEMPLATES += $(ASAAPDB)/configMenu.db
 
 TEMPLATES += $(ASAAPDB)/configMenuNames.req
diff --git a/patch/001-disable-extra-save-sets.p0.patch b/patch/001-disable-extra-save-sets.p0.patch
new file mode 100644
index 0000000000000000000000000000000000000000..675623c62c16b04079e2e8640caf6e83c660745f
--- /dev/null
+++ b/patch/001-disable-extra-save-sets.p0.patch
@@ -0,0 +1,13 @@
+diff --git asApp/src/save_restore.c asApp/src/save_restore.c
+index 594c039..0e31d2b 100644
+--- asApp/src/save_restore.c
++++ asApp/src/save_restore.c
+@@ -280,7 +280,7 @@ epicsExportAddress(int, save_restoreDebug);
+ 
+ STATIC struct chlist *lptr = NULL;				/* save-set listhead */
+ STATIC int listLock = 0;						/* replaces long-term holding of sr_mutex */
+-#define NUM_STATUS_PV_SETS 8
++#define NUM_STATUS_PV_SETS 2
+ STATIC int statusPvsInUse[NUM_STATUS_PV_SETS] = {0};
+ STATIC epicsMutexId	sr_mutex = NULL;			/* mut(ual) ex(clusion) for list of save sets */
+ int mustSetPermissions = 0;                                    /* use fchmod() only if save_restoreSet_FilePermissions is used */
diff --git a/patch/002-rename-autosave-pvs.p0.patch b/patch/002-rename-autosave-pvs.p0.patch
new file mode 100644
index 0000000000000000000000000000000000000000..566df51fd936794ef6c542e28be14c1ad3481c8d
--- /dev/null
+++ b/patch/002-rename-autosave-pvs.p0.patch
@@ -0,0 +1,67 @@
+diff --git asApp/src/save_restore.c asApp/src/save_restore.c
+index 594c039..bdf103f 100644
+--- asApp/src/save_restore.c
++++ asApp/src/save_restore.c
+@@ -884,35 +884,35 @@ STATIC int save_restore(void)
+ 	/* Build names for save_restore general status PV's with status_prefix */
+ 	if (save_restoreUseStatusPVs && *status_prefix && (*SR_status_PV == '\0')) {
+ 		strNcpy(SR_status_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_status_PV, "SR_status", PV_NAME_LEN-1-strlen(SR_status_PV));
++		strncat(SR_status_PV, "AutosaveStatus", PV_NAME_LEN-1-strlen(SR_status_PV));
+ 		strNcpy(SR_heartbeat_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_heartbeat_PV, "SR_heartbeat", PV_NAME_LEN-1-strlen(SR_heartbeat_PV));
++		strncat(SR_heartbeat_PV, "Heartbeat", PV_NAME_LEN-1-strlen(SR_heartbeat_PV));
+ 		strNcpy(SR_statusStr_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_statusStr_PV, "SR_statusStr", PV_NAME_LEN-1-strlen(SR_statusStr_PV));
++		strncat(SR_statusStr_PV, "WorstCaseStatus", PV_NAME_LEN-1-strlen(SR_statusStr_PV));
+ 		strNcpy(SR_recentlyStr_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_recentlyStr_PV, "SR_recentlyStr", PV_NAME_LEN-1-strlen(SR_recentlyStr_PV));
++		strncat(SR_recentlyStr_PV, "MostRecentStatus", PV_NAME_LEN-1-strlen(SR_recentlyStr_PV));
+ 		TATTLE(ca_search(SR_status_PV, &SR_status_chid), "save_restore: ca_search(%s) returned %s", SR_status_PV);
+ 		TATTLE(ca_search(SR_heartbeat_PV, &SR_heartbeat_chid), "save_restore: ca_search(%s) returned %s", SR_heartbeat_PV);
+ 		TATTLE(ca_search(SR_statusStr_PV, &SR_statusStr_chid), "save_restore: ca_search(%s) returned %s", SR_statusStr_PV);
+ 		TATTLE(ca_search(SR_recentlyStr_PV, &SR_recentlyStr_chid), "save_restore: ca_search(%s) returned %s", SR_recentlyStr_PV);
+ 
+ 		strNcpy(SR_rebootStatus_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_rebootStatus_PV, "SR_rebootStatus", PV_NAME_LEN-1-strlen(SR_rebootStatus_PV));
++		strncat(SR_rebootStatus_PV, "RebootStatus", PV_NAME_LEN-1-strlen(SR_rebootStatus_PV));
+ 		strNcpy(SR_rebootStatusStr_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_rebootStatusStr_PV, "SR_rebootStatusStr", PV_NAME_LEN-1-strlen(SR_rebootStatusStr_PV));
++		strncat(SR_rebootStatusStr_PV, "RebootStatus-Msg", PV_NAME_LEN-1-strlen(SR_rebootStatusStr_PV));
+ 		strNcpy(SR_rebootTime_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_rebootTime_PV, "SR_rebootTime", PV_NAME_LEN-1-strlen(SR_rebootTime_PV));
++		strncat(SR_rebootTime_PV, "RebootTime", PV_NAME_LEN-1-strlen(SR_rebootTime_PV));
+ 		TATTLE(ca_search(SR_rebootStatus_PV, &SR_rebootStatus_chid), "save_restore: ca_search(%s) returned %s", SR_rebootStatus_PV);
+ 		TATTLE(ca_search(SR_rebootStatusStr_PV, &SR_rebootStatusStr_chid), "save_restore: ca_search(%s) returned %s", SR_rebootStatusStr_PV);
+ 		TATTLE(ca_search(SR_rebootTime_PV, &SR_rebootTime_chid), "save_restore: ca_search(%s) returned %s", SR_rebootTime_PV);
+ 
+ 		/* disable support */
+ 		strNcpy(SR_disable_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_disable_PV, "SR_disable", PV_NAME_LEN-1-strlen(SR_disable_PV));
++		strncat(SR_disable_PV, "Disable", PV_NAME_LEN-1-strlen(SR_disable_PV));
+ 		TATTLE(ca_search(SR_disable_PV, &SR_disable_chid), "save_restore: ca_search(%s) returned %s", SR_disable_PV);
+ 
+ 		strNcpy(SR_disableMaxSecs_PV, status_prefix, PV_NAME_LEN);
+-		strncat(SR_disableMaxSecs_PV, "SR_disableMaxSecs", PV_NAME_LEN-1-strlen(SR_disableMaxSecs_PV));
++		strncat(SR_disableMaxSecs_PV, "DisableMaxSeconds", PV_NAME_LEN-1-strlen(SR_disableMaxSecs_PV));
+ 		TATTLE(ca_search(SR_disableMaxSecs_PV, &SR_disableMaxSecs_chid), "save_restore: ca_search(%s) returned %s", SR_disableMaxSecs_PV);
+ 
+ 
+@@ -1175,7 +1175,7 @@ STATIC int save_restore(void)
+ 				if (*status_prefix && (plist->status_PV[0] == '\0') && (plist->statusPvIndex < NUM_STATUS_PV_SETS)) {
+ 					/*** Build PV names ***/
+ 					/* make common portion of PVname strings */
+-					n = (PV_NAME_LEN-1) - epicsSnprintf(plist->status_PV, PV_NAME_LEN-1, "%sSR_%1d_", status_prefix, plist->statusPvIndex);
++					n = (PV_NAME_LEN-1) - epicsSnprintf(plist->status_PV, PV_NAME_LEN-1, "%sPass%1d-", status_prefix, plist->statusPvIndex);
+ 					strNcpy(plist->name_PV, plist->status_PV, PV_NAME_LEN);
+ 					strNcpy(plist->save_state_PV, plist->status_PV, PV_NAME_LEN);
+ 					strNcpy(plist->statusStr_PV, plist->status_PV, PV_NAME_LEN);
+@@ -1184,7 +1184,7 @@ STATIC int save_restore(void)
+ 					strncat(plist->status_PV, "Status", n);
+ 					strncat(plist->name_PV, "Name", n);
+ 					strncat(plist->save_state_PV, "State", n);
+-					strncat(plist->statusStr_PV, "StatusStr", n);
++					strncat(plist->statusStr_PV, "Status-Msg", n);
+ 					strncat(plist->time_PV, "Time", n);
+ 					/* connect with PV's */
+ 					TATTLE(ca_search(plist->status_PV, &plist->status_chid), "save_restore: ca_search(%s) returned %s", plist->status_PV);
diff --git a/template/save_restoreStatus.db b/template/save_restoreStatus.db
new file mode 100644
index 0000000000000000000000000000000000000000..df6cfd62bc19576666e860516ddb680eff62a088
--- /dev/null
+++ b/template/save_restoreStatus.db
@@ -0,0 +1,217 @@
+record(bo, "$(P)Heartbeat") {
+    alias("$(P)SR_heartbeat")
+
+    field(DESC, "Autosave heartbeat")
+    field(DTYP, "Soft Channel")
+    field(ZNAM, "0")
+    field(ONAM, "1")
+    field(FLNK, "$(P)Trigger")
+}
+
+record(bo, "$(P)Trigger") {
+    field(DTYP, "Soft Channel")
+    field(DOL,  "1")
+    field(UDF,  "0")
+    field(ZNAM, "0")
+    field(ONAM, "1")
+    field(OUT,  "$(P)DeadIfZero.VAL PP")
+}
+
+record(bo, "$(P)DeadIfZero") {
+    alias("$(P)SR_deadIfZero")
+
+    field(DESC, "Val = One if autosave loop is running")
+    field(DTYP, "Soft Channel")
+    field(ZNAM, "0")
+    field(ONAM, "1")
+    field(HIGH, "$(DEAD_SECONDS=300)")
+}
+
+record(mbbo, "$(P)RebootStatus") {
+    alias("$(P)SR_rebootStatus")
+
+    field(DTYP, "Soft Channel")
+    field(NOBT, "3")
+    field(ONVL, "1")
+    field(TWVL, "2")
+    field(THVL, "3")
+    field(FRVL, "4")
+    field(ZRST, "No Status")
+    field(ONST, "Failure")
+    field(TWST, "Warning")
+    field(THST, "Seq Fail")
+    field(FRST, "Ok")
+    field(ONSV, "MAJOR")
+    field(TWSV, "MINOR")
+    field(THSV, "MAJOR")
+}
+
+record(mbbo, "$(P)AutosaveStatus") {
+    alias("$(P)SR_status")
+
+    field(DESC, "Worst-case autosave status")
+    field(DTYP, "Soft Channel")
+    field(NOBT, "3")
+    field(ONVL, "1")
+    field(TWVL, "2")
+    field(THVL, "3")
+    field(FRVL, "4")
+    field(ZRST, "No Status")
+    field(ONST, "Failure")
+    field(TWST, "Warning")
+    field(THST, "Seq Fail")
+    field(FRST, "Ok")
+    field(ONSV, "MAJOR")
+    field(TWSV, "MINOR")
+    field(THSV, "MAJOR")
+}
+
+record(stringout, "$(P)MostRecentStatus") {
+    alias("$(P)SR_recentlyStr")
+
+    field(DESC, "Most recent status")
+    field(DTYP, "Soft Channel")
+    field(VAL,  "Status unknown")
+}
+
+record(stringout, "$(P)RebootStatus-Msg") {
+    alias("$(P)SR_rebootStatusStr")
+
+    field(DESC, "Most recent reboot status")
+    field(DTYP, "Soft Channel")
+    field(VAL,  "Status unknown")
+}
+
+record(stringout, "$(P)RebootTime") {
+    alias("$(P)SR_rebootTime")
+
+    field(DESC, "Last autosave reboot time")
+    field(DTYP, "Soft Channel")
+    field(VAL,  "Not yet saved")
+}
+
+record(stringout, "$(P)WorstCaseStatus") {
+    alias("$(P)SR_statusStr")
+
+    field(DESC, "Worst-case autosave status string")
+    field(DTYP, "Soft Channel")
+    field(VAL,  "Status unknown")
+}
+
+record(stringout, "$(P)Pass0-Name") {
+    alias("$(P)SR_0_Name")
+
+    field(DESC, "Name of pass 0 request file")
+    field(VAL,  "Not In Use")
+    field(DTYP, "Soft Channel")
+}
+
+record(longout, "$(P)Pass0-Method") {
+    alias("$(P)SR_0_State")
+
+    field(DESC, "Method for pass 0 save restore")
+    field(DTYP, "Soft Channel")
+}
+
+record(mbbo, "$(P)Pass0-Status") {
+    alias("$(P)SR_0_Status")
+
+    field(DESC, "Status of pass 0 save restore")
+    field(DTYP, "Soft Channel")
+    field(NOBT, "3")
+    field(ONVL, "1")
+    field(TWVL, "2")
+    field(THVL, "3")
+    field(FRVL, "4")
+    field(ZRST, "No Status")
+    field(ONST, "Failure")
+    field(TWST, "Warning")
+    field(THST, "Seq Fail")
+    field(FRST, "Ok")
+    field(ONSV, "MAJOR")
+    field(TWSV, "MINOR")
+    field(THSV, "MAJOR")
+}
+
+record(stringout, "$(P)Pass0-Status-Msg") {
+    alias("$(P)SR_0_StatusStr")
+
+    field(DESC, "Status of pass 0 save restore")
+    field(DTYP, "Soft Channel")
+    field(VAL,  "Status unknown")
+}
+
+record(stringout, "$(P)Pass0-Time") {
+    alias("$(P)SR_0_Time")
+
+    field(DESC, "Timestamp of pass 0 save restore")
+    field(DTYP, "Soft Channel")
+    field(VAL,  "Not yet saved")
+}
+
+record(stringout, "$(P)Pass1-Name") {
+    alias("$(P)SR_1_Name")
+
+    field(DESC, "Name of pass 1 request file")
+    field(VAL,  "Not In Use")
+    field(DTYP, "Soft Channel")
+}
+
+record(longout, "$(P)Pass1-State") {
+    alias("$(P)SR_1_State")
+
+    field(DESC, "Method for pass 1 save restore")
+    field(DTYP, "Soft Channel")
+}
+
+record(mbbo, "$(P)Pass1-Status") {
+    alias("$(P)SR_1_Status")
+
+    field(DESC, "Status of pass 1 save restore")
+    field(DTYP, "Soft Channel")
+    field(NOBT, "3")
+    field(ONVL, "1")
+    field(TWVL, "2")
+    field(THVL, "3")
+    field(FRVL, "4")
+    field(ZRST, "No Status")
+    field(ONST, "Failure")
+    field(TWST, "Warning")
+    field(THST, "Seq Fail")
+    field(FRST, "Ok")
+    field(ONSV, "MAJOR")
+    field(TWSV, "MINOR")
+    field(THSV, "MAJOR")
+}
+
+record(stringout, "$(P)Pass1-Status-Msg") {
+    alias("$(P)SR_1_StatusStr")
+
+    field(DESC, "Status of pass 1 save restore")
+    field(DTYP, "Soft Channel")
+    field(VAL,  "Status unknown")
+}
+
+record(stringout, "$(P)Pass1-Time") {
+    alias("$(P)SR_1_Time")
+
+    field(DESC, "Timestamp of pass 1 save restore")
+    field(DTYP, "Soft Channel")
+    field(VAL,  "Not yet saved")
+}
+
+record(longout, "$(P)DisableMaxSeconds") {
+    alias("$(P)SR_disableMaxSecs")
+
+    field(DESC, "Length of time to disable autosave")
+    field(DTYP, "Soft Channel")
+}
+
+record(bo, "$(P)Disable") {
+    alias("$(P)SR_disable")
+
+    field(DESC, "Disable autosave support")
+    field(DTYP, "Soft Channel")
+    field(ZNAM, "Enable")
+    field(ONAM, "Disable")
+}