diff --git a/iocBoot/iocLinux/st.cmd b/iocBoot/iocLinux/st.cmd
index 021774e9873bbd603281ee306a7a1c6450945184..fd97e1e402ca879393268317e4403cbdd5147697 100644
--- a/iocBoot/iocLinux/st.cmd
+++ b/iocBoot/iocLinux/st.cmd
@@ -1,115 +1,164 @@
-# vxWorks startup script
+# Linux startup script
 
-# Read environment variables
 < envPaths
 
 # save_restore.cmd needs the full path to the startup directory, which
 # envPaths currently does not provide
 epicsEnvSet(STARTUP,$(TOP)/iocBoot/$(IOC))
 
-################################################################################
-# Tell EPICS all about the record types, device-support modules, drivers,
-# etc. in the software we just loaded (xxx.munch)
-dbLoadDatabase("../../dbd/iocxxx.dbd")
-iocxxx_registerRecordDeviceDriver(pdbbase)
-
 # Increase size of buffer for error logging from default 1256
-errlogInit(5000)
-
-# debug sseq record
-#var sseqRecDebug,10
- 
-# need more entries in wait/scan-record channel-access queue?
-#var recDynLinkQsize, 1024
+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
 
+################################################################################
+# Tell EPICS all about the record types, device-support modules, drivers,
+# etc. in the software we just loaded (xxx.munch)
+dbLoadDatabase("../../dbd/iocxxx.dbd")
+iocxxx_registerRecordDeviceDriver(pdbbase)
+
 ### save_restore setup
-# We presume a suitable initHook routine was compiled into the executable.
+# We presume a suitable initHook routine was compiled into xxx.munch.
 # See also create_monitor_set(), after iocInit() .
 < save_restore.cmd
 
-# interpolation
-dbLoadRecords("$(CALC)/calcApp/Db/interp.db", "P=xxx:,N=2000")
+# serial support
+< serial.cmd
+
+# Motors
+#dbLoadTemplate("basic_motor.substitutions")
+dbLoadTemplate("motor.substitutions")
+dbLoadTemplate("softMotor.substitutions")
+dbLoadTemplate("pseudoMotor.substitutions")
+
+### Allstop, alldone
+# This database must agree with the motors and other positioners you've actually loaded.
+# Several versions (e.g., all_com_32.db) are in stdApp/Db
+dbLoadRecords("$(STD)/stdApp/Db/all_com_16.db","P=xxx:")
 
+### Insertion-device control
+#dbLoadRecords("$(STD)/stdApp/Db/IDctrl.db","P=xxx:,xx=02us")
+
+# sample-wheel
+dbLoadRecords("$(STD)/stdApp/Db/sampleWheel.db", "P=xxx:,ROWMOTOR=xxx:m7,ANGLEMOTOR=xxx:m8")
 
 ### 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/scan.db","P=xxx:,MAXPTS1=4000,MAXPTS2=200,MAXPTS3=10,MAXPTS4=10,MAXPTSH=4000")
+dbLoadRecords("$(SSCAN)/sscanApp/Db/scan.db","P=xxx:,MAXPTS1=8000,MAXPTS2=1000,MAXPTS3=10,MAXPTS4=10,MAXPTSH=8000")
+
+# 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")
+
+# under development...
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit_soft.db","P=xxx:,SLIT=Slit2V,mXp=m13,mXn=m14")
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit_soft.db","P=xxx:,SLIT=Slit2H,mXp=m15,mXn=m16")
+
+# 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")
 
-# 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")
 
-# 2-post mirror
-#dbLoadRecords("$(OPTICS)/opticsApp/Db/2postMirror.db","P=xxx:,Q=M1,mDn=m1,mUp=m2,LENGTH=0.3")
+### 2-post mirror
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/2postMirror.db","P=xxx:,Q=M1,mDn=m18,mUp=m17,LENGTH=0.3")
 
-# User filters
+### 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
-#var 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")
+### 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")
 
 ### 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")
+#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=m1,M_Y=m2,M_Z=m3,yOffLo=4,yOffHi=36")
+#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=m1,M_rIn=m2,M_rOut=m3,M_g=m4")
+#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")
+#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")
+
+# 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/userTransforms10.db","P=xxx:")
 # extra userCalcs (must also load userCalcs10.db for the enable switch)
 dbLoadRecords("$(CALC)/calcApp/Db/userCalcN.db","P=xxx:,N=I_Detector")
-#dbLoadRecords("$(CALC)/calcApp/Db/userAve10.db","P=xxx:")
+dbLoadRecords("$(CALC)/calcApp/Db/userAve10.db","P=xxx:")
 # string sequence (sseq) record
 dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq1")
 dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq2")
 dbLoadRecords("$(STD)/stdApp/Db/yySseq.db","P=xxx:,S=Sseq3")
 # 4-step measurement
-#dbLoadRecords("$(STD)/stdApp/Db/4step.db", "P=xxx:")
-
-### serial support ###
-
-# generic serial ports
-#dbLoadRecords("$(IP)/ipApp/Db/generic_serial.db", "P=xxx:,C=0,SERVER=serial1")
-#dbLoadRecords("$(IP)/ipApp/Db/generic_serial.db", "P=xxx:,C=0,SERVER=serial2")
+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")
 
-# serial O/I block (generic serial record with format and parse string calcs)
-# on epics/mpf processor
-#dbLoadRecords("$(IP)/ipApp/Db/serial_OI_block.db","P=xxx:,N=0_1,C=0,SERVER=serial5")
-# on stand-alone mpf processor
-#dbLoadRecords("$(IP)/ipApp/Db/serial_OI_block.db","P=xxx:,N=1_1,C=0,SERVER=serial5")
+# Slow feedback
+dbLoadTemplate "pid_slow.substitutions"
 
 # Miscellaneous PV's, such as burtResult
 dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=xxx:")
+#dbLoadRecords("$(STD)/stdApp/Db/VXstats.db","P=xxx:")
+
+### Queensgate piezo driver
+#dbLoadRecords("$(IP)/ipApp/Db/pzt_3id.db","P=xxx:")
+#dbLoadRecords("$(IP)/ipApp/Db/pzt.db","P=xxx:")
 
+### Queensgate Nano2k piezo controller
+#dbLoadRecords("$(STD)/stdApp/Db/Nano2k.db","P=xxx:,S=s1")
 
 ###############################################################################
 iocInit
 
 ### startup State Notation Language programs
-#seq &kohzuCtl, "P=xxx:, M_THETA=m1, M_Y=m2, M_Z=m3, GEOM=1, logfile=kohzuCtl.log"
-#seq &hrCtl, "P=xxx:, N=1, M_PHI1=m1, M_PHI2=m2, logfile=hrCtl1.log"
+#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]"
 
 ### 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:")
@@ -117,15 +166,7 @@ create_monitor_set("auto_positions.req",5,"P=xxx:")
 create_monitor_set("auto_settings.req",30,"P=xxx:")
 
 ### Start the saveData task.
-# saveData_MessagePolicy
-# 0: wait forever for space in message queue, then send message
-# 1: send message only if queue is not full
-# 2: send message only if queue is not full and specified time has passed (SetCptWait()
-#    sets this time.)
-# 3: if specified time has passed, wait for space in queue, then send message
-# else: don't send message
-#var "debug_saveData" 2
-#saveData_MessagePolicy = 2
-#saveData_SetCptWait_ms(100)
 saveData_Init("saveData.req", "P=xxx:")
-#saveData_PrintScanInfo("xxx:scan1")
+
+dbcar(0,1)
+