diff --git a/iocBoot/iocxxx/st.cmd.Cygwin b/iocBoot/iocxxx/st.cmd.Cygwin
index 8c00b172a8516da5d2d1752b0b9adf70228a1d00..395f9e52429f44d7b9440f3729b8f6e74c46bbf5 100644
--- a/iocBoot/iocxxx/st.cmd.Cygwin
+++ b/iocBoot/iocxxx/st.cmd.Cygwin
@@ -1,212 +1,40 @@
-# Cygwin startup script
-
-# For devIocStats
-epicsEnvSet("ENGINEER","engineer")
-epicsEnvSet("LOCATION","location")
-epicsEnvSet("GROUP","group")
-
-< envPaths
-
-# save_restore.cmd needs the full path to the startup directory, which
-# envPaths currently does not provide
-epicsEnvSet(STARTUP,$(TOP)/iocBoot/$(IOC))
-
-# Increase size of buffer for error logging from default 1256
-errlogInit(20000)
-
-# Specify largest array CA will transport
-# Note for N sscanRecord data points, need (N+1)*8 bytes, else MEDM
-# plot doesn't display
-#epicsEnvSet EPICS_CA_MAX_ARRAY_BYTES 64008
-
-# set the protocol path for streamDevice
-epicsEnvSet("STREAM_PROTOCOL_PATH", ".")
-
-################################################################################
-# Tell EPICS all about the record types, device-support modules, drivers,
-# etc. in the software we just loaded (xxx.munch)
-dbLoadDatabase("../../dbd/iocxxxCygwin.dbd")
-iocxxxCygwin_registerRecordDeviceDriver(pdbbase)
-
-#< areaDetector.cmd
-
-### save_restore setup
-# We presume a suitable initHook routine was compiled into xxx.munch.
-# See also create_monitor_set(), after iocInit() .
-< save_restore.cmd
-
-# serial support
-#< serial.cmd
-
-# Motors
-#dbLoadTemplate("basic_motor.substitutions")
-#dbLoadTemplate("motor.substitutions")
-dbLoadTemplate("softMotor.substitutions")
-#dbLoadTemplate("pseudoMotor.substitutions")
-< motorSim.cmd
-
-### Allstop, alldone
-#var motorUtil_debug,1
-dbLoadRecords("$(MOTOR)/db/motorUtil.db", "P=xxx:")
-
-### streamDevice example
-#dbLoadRecords("$(TOP)/xxxApp/Db/streamExample.db","P=xxx:,PORT=serial1")
-
-### Scan-support software
-# crate-resident scan.  This executes 1D, 2D, 3D, and 4D scans, and caches
-# 1D data, but it doesn't store anything to disk.  (See 'saveData' below for that.)
-dbLoadRecords("$(SSCAN)/sscanApp/Db/standardScans.db","P=xxx:,MAXPTS1=2000,MAXPTS2=1000,MAXPTS3=10,MAXPTS4=10,MAXPTSH=2000")
-dbLoadRecords("$(SSCAN)/sscanApp/Db/saveData.db","P=xxx:")
-
-# A set of scan parameters for each positioner.  This is a convenience
-# for the user.  It can contain an entry for each scannable thing in the
-# crate.
-dbLoadTemplate("scanParms.substitutions")
-
-### Slits
-dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=xxx:,SLIT=Slit1V,mXp=m3,mXn=m4")
-dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=xxx:,SLIT=Slit1H,mXp=m5,mXn=m6")
-
-# X-ray Instrumentation Associates Huber Slit Controller
-# supported by a customized version of the SNL program written by Pete Jemian
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/xia_slit.db", "P=xxx:, HSC=hsc1:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/xia_slit.db", "P=xxx:, HSC=hsc2:")
-#dbLoadRecords("$(IP)/ipApp/Db/generic_serial.db", "P=xxx:,C=0,SERVER=serial7")
-
-
-### 2-post mirror
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/2postMirror.db","P=xxx:,Q=M1,mDn=m18,mUp=m17,LENGTH=0.3")
-
-### User filters
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=xxx:,Q=fltr1:,MOTOR=m1,LOCK=fltr_1_2:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=xxx:,Q=fltr2:,MOTOR=m2,LOCK=fltr_1_2:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterLock.db","P=xxx:,Q=fltr2:,LOCK=fltr_1_2:,LOCK_PV=xxx:DAC1_1.VAL")
-
-# XIA shutter
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/XIA_shutter.db","P=xxx:,S=shutter1,PORT=serial2,ADDRESS=0123")
-
-### Optical tables
-#tableRecordDebug=1
-dbLoadRecords("$(OPTICS)/opticsApp/Db/table.db","P=xxx:,Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=SRI")
-
-# Io calculation
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/Io.db","P=xxx:Io:")
-
-### Monochromator support ###
-# Kohzu and PSL monochromators: Bragg and theta/Y/Z motors
-# standard geometry (geometry 1)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=xxx:,M_THETA=m9,M_Y=m10,M_Z=m11,yOffLo=17.4999,yOffHi=17.5001")
-# modified geometry (geometry 2)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=xxx:,M_THETA=m9,M_Y=m10,M_Z=m11,yOffLo=4,yOffHi=36")
-
-# Spherical grating monochromator
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/SGM.db","P=xxx:,N=1,M_x=m7,M_rIn=m6,M_rOut=m8,M_g=m9")
-
-# 4-bounce high-resolution monochromator
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=xxx:,N=1,M_PHI1=m9,M_PHI2=m10")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=xxx:,N=2,M_PHI1=m11,M_PHI2=m12")
-
-### Orientation matrix, four-circle diffractometer (see seq program 'orient' below)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/orient.db", "P=xxx:,O=1,PREC=4")
-#dbLoadTemplate("orient_xtals.substitutions")
-
-# Load single element Canberra AIM MCA and ICB modules
-#< canberra_1.cmd
-
-# Load 13 element detector software
-#< canberra_13.cmd
-
-# Load 3 element detector software
-#< canberra_3.cmd
-
-### Stuff for user programming ###
-dbLoadRecords("$(CALC)/calcApp/Db/userCalcs10.db","P=xxx:")
-dbLoadRecords("$(CALC)/calcApp/Db/userCalcOuts10.db","P=xxx:")
-dbLoadRecords("$(CALC)/calcApp/Db/userStringCalcs10.db","P=xxx:")
-dbLoadRecords("$(CALC)/calcApp/Db/userArrayCalcs10.db","P=xxx:,N=2000")
-dbLoadRecords("$(CALC)/calcApp/Db/userTransforms10.db","P=xxx:")
-dbLoadRecords("$(CALC)/calcApp/Db/userAve10.db","P=xxx:")
-# string sequence (sseq) records
-dbLoadRecords("$(CALC)/calcApp/Db/userStringSeqs10.db","P=xxx:")
-# 4-step measurement
-dbLoadRecords("$(STD)/stdApp/Db/4step.db", "P=xxx:")
-# interpolation
-dbLoadRecords("$(CALC)/calcApp/Db/interp.db", "P=xxx:,N=2000")
-# array test
-dbLoadRecords("$(CALC)/calcApp/Db/arrayTest.db", "P=xxx:,N=2000")
-
-# pvHistory (in-crate archive of up to three PV's)
-dbLoadRecords("$(STD)/stdApp/Db/pvHistory.db","P=xxx:,N=1,MAXSAMPLES=1440")
-
-# resettable timer
-dbLoadRecords("$(STD)/stdApp/Db/timer.db","P=xxx:,N=1")
-
-# Slow feedback
-dbLoadTemplate "pid_slow.substitutions"
-
-# PID-based feedback
-#dbLoadTemplate "fb_epid.substitutions"
-
-# Miscellaneous PV's, such as burtResult
-dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=xxx:")
-#dbLoadRecords("$(STD)/stdApp/Db/VXstats.db","P=xxx:")
-dbLoadRecords("$(DEVIOCSTATS)/db/ioc.db","IOCNAME=xxx, TODFORMAT=%m/%d/%Y %H:%M:%S")
-
-### Load database record for alive heartbeating support.
-# RHOST specifies the IP address that receives the heartbeats.
-#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=xxx:,RHOST=X.X.X.X")
-
-###############################################################################
-iocInit
-###############################################################################
-
-# write all the PV names to a local file
-dbl > dbl-all.txt
-
-### startup State Notation Language programs
-#seq &kohzuCtl, "P=xxx:, M_THETA=m9, M_Y=m10, M_Z=m11, GEOM=1, logfile=kohzuCtl.log"
-#seq &hrCtl, "P=xxx:, N=1, M_PHI1=m9, M_PHI2=m10, logfile=hrCtl1.log"
-
-# Keithley 2000 series DMM
-# channels: 10, 20, or 22;  model: 2000 or 2700
-#seq &Keithley2kDMM,("P=xxx:, Dmm=D1, channels=22, model=2700")
-
-# X-ray Instrumentation Associates Huber Slit Controller
-# supported by a SNL program written by Pete Jemian and modified (TMM) for use with the
-# sscan record
-#seq  &xia_slit, "name=hsc1, P=xxx:, HSC=hsc1:, S=xxx:seriala[6]"
-
-# Orientation-matrix
-#seq &orient, "P=xxx:orient1:,PM=xxx:,mTTH=m9,mTH=m10,mCHI=m11,mPHI=m12"
-
-# Io calculation
-#seq &Io, "P=xxx:Io:,MONO=xxx:BraggEAO,VSC=xxx:scaler1"
-
-# Start PF4 filter sequence program
-#seq pf4,"name=pf1,P=xxx:,H=pf4:,B=A,M=xxx:BraggEAO,B1=xxx:Unidig1Bo3,B2=xxx:Unidig1Bo4,B3=xxx:Unidig1Bo5,B4=xxx:Unidig1Bo6"
-#seq pf4,"name=pf2,P=xxx:,H=pf4:,B=B,M=xxx:BraggEAO,B1=xxx:Unidig1Bo7,B2=xxx:Unidig1Bo8,B3=xxx:Unidig1Bo9,B4=xxx:Unidig1Bo10"
-
-# Start Femto amplifier sequence programs
-#seq femto,"name=fem1,P=xxx:,H=fem01:,F=seq01:,G1=xxx:Unidig1Bo6,G2=xxx:Unidig1Bo7,G3=xxx:Unidig1Bo8,NO=xxx:Unidig1Bo10"
-
-### Start up the autosave task and tell it what to do.
-# The task is actually named "save_restore".
-# Note that you can reload these sets after creating them: e.g., 
-# reload_monitor_set("auto_settings.req",30,"P=xxx:")
-#save_restoreDebug=20
-#
-# save positions every five seconds
-create_monitor_set("auto_positions.req",5,"P=xxx:")
-# save other things every thirty seconds
-create_monitor_set("auto_settings.req",30,"P=xxx:")
-
-### Start the saveData task.
-saveData_Init("saveData.req", "P=xxx:")
-
-# motorUtil (allstop & alldone)
-motorUtilInit("xxx:")
-
-dbcar(0,1)
-
-# print the time our boot was finished
-date
+# Cygwin startup script
+
+< envPaths
+
+# Increase size of buffer for error logging from default 1256
+errlogInit(20000)
+
+################################################################################
+# Tell EPICS all about the record types, device-support modules, drivers,
+# etc. in the software we just loaded (xxx.munch)
+dbLoadDatabase("../../dbd/iocxxxCygwin.dbd")
+iocxxxCygwin_registerRecordDeviceDriver(pdbbase)
+
+epicsEnvSet("PLATFORM", "softioc")
+
+< common.iocsh
+
+# < $(PLATFORM)/areaDetector.cmd
+# < $(PLATFORM)/serial.cmd
+
+# soft scaler for testing
+< common/softScaler.cmd
+
+< common/motorSim.cmd
+
+# devIocStats
+dbLoadRecords("$(DEVIOCSTATS)/db/ioc.db","IOCNAME=xxx, TODFORMAT=%m/%d/%Y %H:%M:%S")
+
+###############################################################################
+iocInit
+###############################################################################
+
+# write all the PV names to a local file
+dbl > dbl-all.txt
+
+# Diagnostic: CA links in all records
+dbcar(0,1)
+
+# print the time our boot was finished
+date
diff --git a/iocBoot/iocxxx/st.cmd.Linux b/iocBoot/iocxxx/st.cmd.Linux
index dc3e6fb974f92ecee45ed0346f0868586753e073..610e96c2a95b3addd4e04928c195f8590457a62d 100644
--- a/iocBoot/iocxxx/st.cmd.Linux
+++ b/iocBoot/iocxxx/st.cmd.Linux
@@ -1,238 +1,39 @@
 # Linux startup script
 
-##########################  ############################################################################
-# environment variable      description
-##########################  ############################################################################
-# PREFIX		    prefix used for all PVs in this IOC
-# EPICS_DB_INCLUDE_PATH     search path for database files
-# EPICS_CA_MAX_ARRAY_BYTES  Specify largest array CA will transport
-# IOCBOOT		    absolute directory path in which this file is located
-# RHOST                     specifies the IP address that receives the alive record heartbeats
-##########################  ############################################################################
-
-epicsEnvSet("PREFIX", "xxx:")
-
-### For alive
-epicsEnvSet("RHOST", "1.2.3.4")
-epicsEnvSet("IOCBOOT", $(TOP)/iocBoot/$(IOC))
-
-### For devIocStats
-epicsEnvSet("ENGINEER","engineer")
-epicsEnvSet("LOCATION","location")
-epicsEnvSet("GROUP","group")
-epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(DEVIOCSTATS)/db")
-
 < envPaths
 
-# save_restore.cmd needs the full path to the startup directory, which
-# envPaths currently does not provide
-epicsEnvSet(STARTUP,$(TOP)/iocBoot/$(IOC))
-
 # Increase size of buffer for error logging from default 1256
 errlogInit(20000)
 
-# Specify largest array CA will transport
-# Note for N doubles, need N*8 bytes+some overhead
-epicsEnvSet EPICS_CA_MAX_ARRAY_BYTES 64010
-
 ################################################################################
 # Tell EPICS all about the record types, device-support modules, drivers,
 # etc. in the software we just loaded (xxx.munch)
 dbLoadDatabase("../../dbd/iocxxxLinux.dbd")
 iocxxxLinux_registerRecordDeviceDriver(pdbbase)
 
-### save_restore setup
-< save_restore.cmd
+epicsEnvSet("PLATFORM", "softioc")
 
-# Access Security
-dbLoadRecords("$(TOP)/xxxApp/Db/Security_Control.db","P=$(PREFIX)")
-asSetFilename("$(TOP)/iocBoot/accessSecurity.acf")
-asSetSubstitutions("P=$(PREFIX)")
+< common.iocsh
 
-### caputRecorder
-
-# trap listener
-dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputPoster.db","P=$(PREFIX),N=300")
-doAfterIocInit("registerCaputRecorderTrapListener('xxx:caputRecorderCommand')")
-
-# GUI database
-dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputRecorder.db","P=$(PREFIX),N=300")
-
-# second copy of GUI database
-#dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputRecorder.db","P=xxxA:,N=300")
-
-# if you have hdf5 and szip, you can use this
-#< areaDetector.cmd
+# < $(PLATFORM)/serial.cmd
 
 # soft scaler for testing
-< softScaler.cmd
-
-# user-assignable ramp/tweak
-dbLoadRecords("$(STD)/stdApp/Db/ramp_tweak.db","P=$(PREFIX),Q=rt1")
-
-# serial support
-#< serial.cmd
-
-# Motors
-#dbLoadTemplate("basic_motor.substitutions")
-#dbLoadTemplate("motor.substitutions")
-dbLoadTemplate("softMotor.substitutions")
-dbLoadTemplate("pseudoMotor.substitutions")
-< motorSim.cmd
-# motorUtil (allstop & alldone)
-dbLoadRecords("$(MOTOR)/db/motorUtil.db", "P=$(PREFIX)")
-# Run this after iocInit:
-doAfterIocInit("motorUtilInit('$(PREFIX)')")
-
-### Scan-support software
-# crate-resident scan.  This executes 1D, 2D, 3D, and 4D scans, and caches
-# 1D data, but it doesn't store anything to disk.  (See 'saveData' below for that.)
-dbLoadRecords("$(SSCAN)/sscanApp/Db/standardScans.db","P=$(PREFIX),MAXPTS1=1000,MAXPTS2=1000,MAXPTS3=1000,MAXPTS4=1000,MAXPTSH=1000")
-dbLoadRecords("$(SSCAN)/sscanApp/Db/saveData.db","P=$(PREFIX)")
-# Run this after iocInit:
-doAfterIocInit("saveData_Init(saveData.req, 'P=$(PREFIX)')")
-dbLoadRecords("$(SSCAN)/sscanApp/Db/scanProgress.db","P=$(PREFIX)scanProgress:")
-# Run this after iocInit:
-doAfterIocInit("seq &scanProgress, 'S=$(PREFIX), P=$(PREFIX)scanProgress:'")
-
-# configMenu example.
-dbLoadRecords("$(AUTOSAVE)/asApp/Db/configMenu.db","P=$(PREFIX),CONFIG=scan1")
-# Note that the request file MUST be named $(CONFIG)Menu.req
-# If the macro CONFIGMENU is defined with any value, backup (".savB") and
-# sequence files (".savN") will not be written.  We don't want these for configMenu.
-# Run this after iocInit:
-doAfterIocInit("create_manual_set('scan1Menu.req','P=$(PREFIX),CONFIG=scan1,CONFIGMENU=1')")
-# You could make scan configurations read-only:
-#dbLoadRecords("$(AUTOSAVE)/asApp/Db/configMenu.db","P=$(PREFIX),CONFIG=scan1,ENABLE_SAVE=0")
-
-# read-only configMenu example.  (Read-only, because we're not calling create_manual_set().)
-#dbLoadRecords("$(AUTOSAVE)/asApp/Db/configMenu.db","P=$(PREFIX),CONFIG=scan2")
-
-# A set of scan parameters for each positioner.  This is a convenience
-# for the user.  It can contain an entry for each scannable thing in the
-# crate.
-dbLoadTemplate("scanParms.substitutions")
-
-### Slits
-dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=$(PREFIX),SLIT=Slit1V,mXp=m3,mXn=m4")
-dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=$(PREFIX),SLIT=Slit1H,mXp=m5,mXn=m6")
-
-# X-ray Instrumentation Associates Huber Slit Controller
-# supported by a customized version of the SNL program written by Pete Jemian
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/xia_slit.db", "P=$(PREFIX), HSC=hsc1:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/xia_slit.db", "P=$(PREFIX), HSC=hsc2:")
-#dbLoadRecords("$(IP)/ipApp/Db/generic_serial.db", "P=$(PREFIX),C=0,SERVER=serial7")
-# Run this after iocInit:
-#doAfterIocInit("seq  &xia_slit, 'name=hsc1, P=$(PREFIX), HSC=hsc1:, S=$(PREFIX)seriala[6]'")
-
-### 2-post mirror
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/2postMirror.db","P=$(PREFIX),Q=M1,mDn=m1,mUp=m2,LENGTH=0.3")
-
-### User filters
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=$(PREFIX),Q=fltr1:,MOTOR=m1,LOCK=fltr_1_2:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=$(PREFIX),Q=fltr2:,MOTOR=m2,LOCK=fltr_1_2:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterLock.db","P=$(PREFIX),Q=fltr2:,LOCK=fltr_1_2:,LOCK_PV=$(PREFIX)DAC1_1.VAL")
+< common/softScaler.cmd
 
-### Optical tables
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/table.db","P=$(PREFIX),Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=SRI")
-dbLoadRecords("$(OPTICS)/opticsApp/Db/table.db","P=$(PREFIX),Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=NEWPORT")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/table.db","P=$(PREFIX),Q=Table2,T=table2,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=SRI")
-
-# Io calculation
-dbLoadRecords("$(OPTICS)/opticsApp/Db/Io.db","P=$(PREFIX)Io:")
-
-### Monochromator support ###
-# Kohzu and PSL monochromators: Bragg and theta/Y/Z motors
-# standard geometry (geometry 1)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=$(PREFIX),M_THETA=m1,M_Y=m2,M_Z=m3,yOffLo=17.4999,yOffHi=17.5001")
-# Run this after iocInit:
-#doAfterIocInit("seq &kohzuCtl, 'P=$(PREFIX), M_THETA=m1, M_Y=m2, M_Z=m3, GEOM=1, logfile=kohzuCtl.log'")
-# modified geometry (geometry 2)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=$(PREFIX),M_THETA=m1,M_Y=m2,M_Z=m2,yOffLo=4,yOffHi=36")
-# Run this after iocInit:
-#doAfterIocInit("seq &kohzuCtl, 'P=$(PREFIX), M_THETA=m1, M_Y=m2, M_Z=m3, GEOM=2, logfile=kohzuCtl.log'")
-
-# Spherical grating monochromator
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/SGM.db","P=$(PREFIX),N=1,M_x=m7,M_rIn=m6,M_rOut=m8,M_g=m9")
-
-# 4-bounce high-resolution monochromator
-dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=$(PREFIX),N=1,M_PHI1=m4,M_PHI2=m5")
-# Run this after iocInit:
-doAfterIocInit("seq &hrCtl, 'P=$(PREFIX), N=1, M_PHI1=m4, M_PHI2=m5, logfile=hrCtl.log'")
-
-### Orientation matrix, four-circle diffractometer (see seq program 'orient' below)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/orient.db", "P=$(PREFIX),O=1,PREC=4")
-#dbLoadTemplate("orient_xtals.substitutions")
-# Run this after iocInit:
-#doAfterIocInit("seq &orient, 'P=$(PREFIX)orient1:,PM=$(PREFIX),mTTH=m9,mTH=m10,mCHI=m11,mPHI=m12'")
-
-# Load single element Canberra AIM MCA and ICB modules
-#< canberra_1.cmd
-
-# Load 13 element detector software
-#< canberra_13.cmd
-
-# Load 3 element detector software
-#< canberra_3.cmd
-
-### Stuff for user programming ###
-< calc.cmd
-
-# 4-step measurement
-dbLoadRecords("$(STD)/stdApp/Db/4step.db", "P=$(PREFIX),Q=4step:")
-
-# Slow feedback
-dbLoadTemplate "pid_slow.substitutions"
-dbLoadTemplate "async_pid_slow.substitutions"
-#dbLoadTemplate "fb_epid.substitutions"
-
-# Miscellaneous PV's, such as burtResult
-dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=$(PREFIX)")
+< common/motorSim.cmd
 
 # devIocStats
 dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db","IOC=xxx")
 
-### Queensgate piezo driver
-#dbLoadRecords("$(IP)/ipApp/Db/pzt.db","P=$(PREFIX)")
-
-### Queensgate Nano2k piezo controller
-#dbLoadRecords("$(STD)/stdApp/Db/Nano2k.db","P=$(PREFIX),S=s1")
-
-### Load database records for Femto amplifiers
-#dbLoadRecords("$(STD)/stdApp/Db/femto.db","P=$(PREFIX),H=fem01:,F=seq01:")
-# Run this after iocInit:
-#doAfterIocInit("seq femto,'name=fem1,P=$(PREFIX),H=fem01:,F=seq01:,G1=$(PREFIX)Unidig1Bo6,G2=$(PREFIX)Unidig1Bo7,G3=$(PREFIX)Unidig1Bo8,NO=$(PREFIX)Unidig1Bo10'")
-
-### Load database records for dual PF4 filters
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/pf4common.db","P=$(PREFIX),H=pf4:,A=A,B=B")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/pf4bank.db","P=$(PREFIX),H=pf4:,B=A")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/pf4bank.db","P=$(PREFIX),H=pf4:,B=B")
-# Run this after iocInit:
-#doAfterIocInit("seq pf4,'name=pf1,P=$(PREFIX),H=pf4:,B=A,M=$(PREFIX)userTran10.I,B1=$(PREFIX)userTran10.A,B2=$(PREFIX)userTran10.B,B3=$(PREFIX)userTran10.C,B4=$(PREFIX)userTran10.D'")
-#doAfterIocInit("seq pf4,'name=pf2,P=$(PREFIX),H=pf4:,B=B,M=$(PREFIX)userTran10.I,B1=$(PREFIX)userTran10.E,B2=$(PREFIX)userTran10.F,B3=$(PREFIX)userTran10.G,B4=$(PREFIX)userTran10.H'")
-
-### Load database records for alternative PF4-filter support
-#dbLoadTemplate "filter.substitutions"
-# Run this after iocInit:
-#doAfterIocInit("seq filterDrive,'NAME=filterDrive,P=$(PREFIX),R=filter:,NUM_FILTERS=16'")
-
-### Load database record for alive heartbeating support.
-# RHOST specifies the IP address that receives the heartbeats.
-#dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=$(PREFIX),RHOST=X.X.X.X")
-
 ###############################################################################
 iocInit
 ###############################################################################
 
-### write all the PV names to a local file
+# write all the PV names to a local file
 dbl > dbl-all.txt
 
-### also report these environment variables to the alive server
-#dbpf("$(PREFIX)alive.ENV8", "IOCBOOT")
+# Diagnostic: CA links in all records
+dbcar(0,1)
 
-### Report  states of database CA links
-dbcar(*,1)
-
-### print the time our boot was finished
+# print the time our boot was finished
 date
-
diff --git a/iocBoot/iocxxx/st.cmd.Win32 b/iocBoot/iocxxx/st.cmd.Win32
new file mode 100644
index 0000000000000000000000000000000000000000..979ff51c8a6afda2346010ddd3efcd3ba49fbfea
--- /dev/null
+++ b/iocBoot/iocxxx/st.cmd.Win32
@@ -0,0 +1,39 @@
+# Windows startup script
+
+< envPaths
+
+# Increase size of buffer for error logging from default 1256
+errlogInit(20000)
+
+################################################################################
+# Tell EPICS all about the record types, device-support modules, drivers,
+# etc. in the software we just loaded (xxx.munch)
+dbLoadDatabase("../../dbd/iocxxxWin32.dbd")
+iocxxxWin32_registerRecordDeviceDriver(pdbbase)
+
+epicsEnvSet("PLATFORM", "softioc")
+
+< common.iocsh
+
+# < $(PLATFORM)/serial.cmd
+
+# soft scaler for testing
+< common/softScaler.cmd
+
+< common/motorSim.cmd
+
+# devIocStats
+dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminSoft.db","IOC=xxx")
+
+###############################################################################
+iocInit
+###############################################################################
+
+# write all the PV names to a local file
+dbl > dbl-all.txt
+
+# Diagnostic: CA links in all records
+dbcar(0,1)
+
+# print the time our boot was finished
+date
diff --git a/iocBoot/iocxxx/st.cmd.vxWorks b/iocBoot/iocxxx/st.cmd.vxWorks
index f808ecdbfaa694189571b8f4021c8a0bf2114c65..b0b9efc7eeed630423e3f1bd1c24a9b7f63e51b0 100644
--- a/iocBoot/iocxxx/st.cmd.vxWorks
+++ b/iocBoot/iocxxx/st.cmd.vxWorks
@@ -2,13 +2,6 @@
 
 sysVmeMapShow
 
-# For devIocStats
-#epicsEnvSet("ENGINEER", "engineer")
-#epicsEnvSet("LOCATION", "location")
-putenv("ENGINEER=engineer")
-putenv("LOCATION=location")
-putenv("GROUP=group")
-
 cd ""
 < ../nfsCommands
 < cdCommands
@@ -39,255 +32,50 @@ errlogInit(20000)
 # need more entries in wait/scan-record channel-access queue?
 recDynLinkQsize = 1024
 
-# Specify largest array CA will transport
-# Note for N sscanRecord data points, need (N+1)*8 bytes, else MEDM
-# plot doesn't display
-putenv "EPICS_CA_MAX_ARRAY_BYTES=64008"
-
-# set the protocol path for streamDevice
-epicsEnvSet("STREAM_PROTOCOL_PATH", ".")
-
 ################################################################################
 # Tell EPICS all about the record types, device-support modules, drivers,
 # etc. in the software we just loaded (xxx.munch)
 dbLoadDatabase("$(TOP)/dbd/iocxxxVX.dbd")
 iocxxxVX_registerRecordDeviceDriver(pdbbase)
 
-### save_restore setup
-< save_restore.cmd
-
-### Access Security
-dbLoadRecords("$(TOP)/xxxApp/Db/Security_Control.db","P=xxx:")
-iocsh
-asSetFilename("$(TOP)/iocBoot/accessSecurity.acf")
-exit
-asSetSubstitutions("P=xxx:")
-
-### caputRecorder
+shellPromptSet "iocvxWorks> "
+iocLogDisable=0
 
-# trap listener
-dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputPoster.db","P=xxx:,N=300")
-doAfterIocInit("registerCaputRecorderTrapListener('xxx:caputRecorderCommand')")
+iocsh 
 
-# GUI database
-dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputRecorder.db","P=xxx:,N=300")
+epicsEnvSet("PLATFORM", "vxWorks")
 
-# second copy of GUI database
-#dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputRecorder.db","P=xxxA:,N=300")
+< common.iocsh
 
 # Industry Pack support
-< industryPack.cmd
-
+< $(PLATFORM)/industryPack.cmd
 
 # gpib support
-#< gpib.cmd
+#< $(PLATFORM)/gpib.cmd
 
 # VME devices
-< vme.cmd
+< $(PLATFORM)/vme.cmd
 
 # CAMAC hardware
-#<camac.cmd
-
-#< areaDetector.cmd
-
-# Motors
-#dbLoadTemplate("basic_motor.substitutions")
-dbLoadTemplate("motor.substitutions")
-#dbLoadTemplate("softMotor.substitutions")
-#dbLoadTemplate("pseudoMotor.substitutions")
-
-### Allstop, alldone
-dbLoadRecords("$(MOTOR)/db/motorUtil.db", "P=xxx:")
-doAfterIocInit("motorUtilInit('xxx:')")
-
-### streamDevice example
-#dbLoadRecords("$(TOP)/xxxApp/Db/streamExample.db","P=xxx:,PORT=serial1")
-
-### Insertion-device control
-#dbLoadRecords("$(STD)/stdApp/Db/IDctrl.db","P=xxx:,xx=02us")
-
-### Scan-support software
-# crate-resident scan.  This executes 1D, 2D, 3D, and 4D scans, and caches
-# 1D data, but it doesn't store anything to disk.  (See 'saveData' below for that.)
-putenv "SDB=$(SSCAN)/sscanApp/Db/standardScans.db"
-dbLoadRecords("$(SDB)","P=xxx:,MAXPTS1=1000,MAXPTS2=1000,MAXPTS3=100,MAXPTS4=100,MAXPTSH=100")
-#dbLoadRecords("$(SSCAN)/sscanApp/Db/scanAux.db","P=xxx:,S=scanAux,MAXPTS=100")
-
-# Start the saveData task.  If you start this task, scan records mentioned
-# in saveData.req will *always* write data files.  There is no programmable
-# disable for this software.
-dbLoadRecords("$(SSCAN)/sscanApp/Db/saveData.db","P=xxx:")
-doAfterIocInit("saveData_Init('saveData.req', 'P=xxx:')")
-
-dbLoadRecords("$(SSCAN)/sscanApp/Db/scanProgress.db","P=xxx:scanProgress:")
-doAfterIocInit("seq &scanProgress, 'S=xxx:, P=xxx:scanProgress:'")
-
-# configMenu example.  See create_manual_set() command after iocInit.
-#dbLoadRecords("$(AUTOSAVE)/asApp/Db/configMenu.db","P=xxx:,CONFIG=scan1")
-#doAfterIocInit("create_manual_set('scan1Menu.req','P=xxx:,CONFIG=scan1,CONFIGMENU=1')")
-
-# A set of scan parameters for each positioner.  This is a convenience
-# for the user.  It can contain an entry for each scannable thing in the
-# crate.
-dbLoadTemplate("scanParms.substitutions")
-
-### Slits (If not supplied, RELTOCENTER defaults to zero)
-dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=xxx:,SLIT=Slit1V,mXp=m3,mXn=m4,RELTOCENTER=0")
-dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=xxx:,SLIT=Slit1H,mXp=m5,mXn=m6,RELTOCENTER=0")
-
-### X-ray Instrumentation Associates Huber Slit Controller
-# supported by a customized version of the SNL program written by Pete Jemian
-# (Uses asyn record loaded separately)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/xia_slit.db", "P=xxx:, HSC=hsc1:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/xia_slit.db", "P=xxx:, HSC=hsc2:")
-#doAfterIocInit("seq  &xia_slit, 'name=hsc1, P=xxx:, HSC=hsc1:, S=xxx:asyn_6'")
-#doAfterIocInit("seq  &xia_slit, 'name=hsc2, P=xxx:, HSC=hsc2:, S=xxx:asyn_6'")
-
-### 2-post mirror
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/2postMirror.db","P=xxx:,Q=M1,mDn=m1,mUp=m2,LENGTH=0.3")
-
-### User filters
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=xxx:,Q=fltr1:,MOTOR=m1,LOCK=fltr_1_2:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterMotor.db","P=xxx:,Q=fltr2:,MOTOR=m2,LOCK=fltr_1_2:")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/filterLock.db","P=xxx:,Q=fltr2:,LOCK=fltr_1_2:,LOCK_PV=xxx:DAC1_1.VAL")
-
-### Optical tables
-putenv "DIR=$(OPTICS)/opticsApp/Db"
-dbLoadRecords("$(DIR)/table.db","P=xxx:,Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=SRI")
-
-### Io calculation
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/Io.db","P=xxx:Io:")
-#doAfterIocInit("seq &Io, 'P=xxx:Io:,MONO=xxx:BraggEAO,VSC=xxx:scaler1'")
-
-### Monochromator support ###
-
-### Kohzu and PSL monochromators: Bragg and theta/Y/Z motors
-# standard geometry (geometry 1)
-dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=xxx:,M_THETA=m1,M_Y=m2,M_Z=m3,yOffLo=17.4999,yOffHi=17.5001")
-doAfterIocInit("seq &kohzuCtl, 'P=xxx:, M_THETA=m1, M_Y=m2, M_Z=m3, GEOM=1, logfile=kohzuCtl.log'")
-
-# modified geometry (geometry 2)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/kohzuSeq.db","P=xxx:,M_THETA=m1,M_Y=m2,M_Z=m3,yOffLo=4,yOffHi=36")
-#doAfterIocInit("seq &kohzuCtl, 'P=xxx:, M_THETA=m1, M_Y=m2, M_Z=m3, GEOM=2, logfile=kohzuCtl.log'")
-# Example of specifying offset limits
-#doAfterIocInit("epicsThreadSleep(5.)")
-#doAfterIocInit("dbpf xxx:kohzu_yOffsetAO.DRVH 17.51")
-#doAfterIocInit("dbpf xxx:kohzu_yOffsetAO.DRVL 17.49")
-
-### Spherical grating monochromator
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/SGM.db","P=xxx:,N=1,M_x=m7,M_rIn=m6,M_rOut=m8,M_g=m9")
-
-### 4-bounce high-resolution monochromator
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=xxx:,N=1,M_PHI1=m1,M_PHI2=m2")
-#doAfterIocInit("dbpf 'xxx:HR1CtlDebug','1'")
-#doAfterIocInit("seq &hrCtl, 'P=xxx:, N=1, M_PHI1=m4, M_PHI2=m5, logfile=hrCtl.log'")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=xxx:,N=2,M_PHI1=m11,M_PHI2=m12")
-
-### multilayer monochromator: Bragg and theta/Y/Z motors
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/ml_monoSeq.db","P=xxx:")
-#doAfterIocInit("seq &ml_monoCtl, 'P=xxx:, M_THETA=m1, M_THETA2=m2, M_Y=m3, M_Z=m4, Y_OFF=35., GEOM=1'")
-
-### Orientation matrix, four-circle diffractometer (see seq program 'orient' below)
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/orient.db", "P=xxx:,O=1,PREC=6")
-#dbLoadTemplate("orient_xtals.substitutions")
-#doAfterIocInit("seq &orient, 'P=xxx:orient1:,PM=xxx:,mTTH=m13,mTH=m14,mCHI=m15,mPHI=m16'")
-
-# Coarse/Fine stage
-dbLoadRecords("$(OPTICS)/opticsApp/Db/CoarseFineMotor.db","P=xxx:cf1:,PM=xxx:,CM=m7,FM=m8")
-
-# Load single element Canberra AIM MCA and ICB modules
-#< canberra_1.cmd
-
-# Load 13 element detector software
-#< canberra_13.cmd
-
-# Load 3 element detector software
-#< canberra_3.cmd
-
-### Stuff for user programming ###
-< calc.cmd
-
-# 4-step measurement
-dbLoadRecords("$(STD)/stdApp/Db/4step.db", "P=xxx:,Q=4step:")
-
-# user-assignable ramp/tweak
-dbLoadRecords("$(STD)/stdApp/Db/ramp_tweak.db","P=xxx:,Q=rt1")
-
-# pvHistory (in-crate archive of up to three PV's)
-dbLoadRecords("$(STD)/stdApp/Db/pvHistory.db","P=xxx:,N=1,MAXSAMPLES=1440")
-
-# software timer
-dbLoadRecords("$(STD)/stdApp/Db/timer.db","P=xxx:,N=1")
-
-# Slow feedback
-dbLoadTemplate "pid_slow.substitutions"
-dbLoadTemplate "async_pid_slow.substitutions"
-
-# Miscellaneous PV's, such as burtResult
-dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=xxx:")
+#< $(PLATFORM)/camac.cmd
 
 # devIocStats
 dbLoadRecords("$(DEVIOCSTATS)/db/iocAdminVxWorks.db","IOC=xxx")
 
-### Queensgate piezo driver
-#dbLoadRecords("$(IP)/ipApp/Db/pzt_3id.db","P=xxx:")
-#dbLoadRecords("$(IP)/ipApp/Db/pzt.db","P=xxx:,PORT=")
-
-### Queensgate Nano2k piezo controller
-#dbLoadRecords("$(STD)/stdApp/Db/Nano2k.db","P=xxx:,S=s1")
-
-### Load database records for Femto amplifiers
-#dbLoadRecords("$(STD)/stdApp/Db/femto.db","P=xxx:,H=fem01:,F=seq01:")
-putenv "FBO=xxx:Unidig1Bo"
-#doAfterIocInit("seq &femto,'name=fem1,P=xxx:,H=fem01:,F=seq01:,G1=$(FBO)6,G2=$(FBO)7,G3=$(FBO)8,NO=$(FBO)10'")
-
-### Load database records for dual PF4 filters
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/pf4common.db","P=xxx:,H=pf4:,A=A,B=B")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/pf4bank.db","P=xxx:,H=pf4:,B=A")
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/pf4bank.db","P=xxx:,H=pf4:,B=B")
-# Start PF4 filter sequence programs
-#        name = what user will call it
-#        P    = prefix of database and sequencer
-#        H    = hardware (i.e. pf4)
-#        B    = bank indicator (i.e. A,B)
-#        M    = Monochromatic-beam energy PV
-#        BP   = Filter control bit PV prefix
-#        B1   = Filter control bit 0 number
-#        B2   = Filter control bit 1 number
-#        B3   = Filter control bit 2 number
-#        B4   = Filter control bit 3 number
-#doAfterIocInit("seq &pf4,'name=pf1,P=xxx:,H=pf4:,B=A,M=xxx:BraggEAO,BP=xxx:Unidig1Bo,B1=3,B2=4,B3=5,B4=6'")
-#doAfterIocInit("seq &pf4,'name=pf2,P=xxx:,H=pf4:,B=B,M=xxx:BraggEAO,BP=xxx:Unidig1Bo,B1=7,B2=8,B3=9,B4=10'")
-
-### Load database records for alternative PF4-filter support
-dbLoadTemplate "filter.substitutions"
-#doAfterIocInit("seq &filterDrive,'NAME=filterDrive,P=xxx:,R=filter:,NUM_FILTERS=16'")
-
-# trajectory scan
-#dbLoadRecords("$(MOTOR)/motorApp/Db/trajectoryScan.db","P=xxx:,R=traj1:,NAXES=2,NELM=300,NPULSE=300")
-#doAfterIocInit("seq &MAX_trajectoryScan, 'P=xxx:,R=traj1:,M1=m1,M2=m2,M3=m3,M4=m4,M5=m5,M6=m6,M7=m7,M8=m8,PORT=none'")
-
-### Load database record for alive heartbeating support.
-# RHOST specifies the IP address that receives the heartbeats.
-dbLoadRecords("$(ALIVE)/aliveApp/Db/alive.db", "P=xxx:,RHOST=164.54.100.11")
-
 ###############################################################################
-# Set shell prompt
-shellPromptSet "iocvxWorks> "
-iocLogDisable=0
 iocInit
 ###############################################################################
 
-# write all the PV names to a local file
-dbl > dbl-all.txt
-memShow
-
 # If memory allocated at beginning free it now
 ##free(mem)
 
-# Diagnostic: CA links in all records
-#dbcar(0,1)
+memShow
 
+# write all the PV names to a local file
+dbl > dbl-all.txt
+
+# Diagnostic: CA links in all records
+dbcar(0,1)
 
 # print the time our boot was finished
 date