diff --git a/iocBoot/iocLinux/Makefile b/iocBoot/iocLinux/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..cec915677152f5d23825ec3bd57ca9757622f311
--- /dev/null
+++ b/iocBoot/iocLinux/Makefile
@@ -0,0 +1,5 @@
+TOP = ../..
+include $(TOP)/configure/CONFIG
+ARCH = linux-x86
+TARGETS = envPaths
+include $(TOP)/configure/RULES.ioc
diff --git a/iocBoot/iocLinux/README b/iocBoot/iocLinux/README
new file mode 100644
index 0000000000000000000000000000000000000000..1060b5e6b9aff50dcf088d243a1fbe242fd352bb
--- /dev/null
+++ b/iocBoot/iocLinux/README
@@ -0,0 +1,5 @@
+Assuming the EPICS_HOST_ARCH environment variable is set correctly,
+start the ioc from this directory by executing the following command.
+
+../../bin/${EPICS_HOST_ARCH}/xxx st.cmd
+
diff --git a/iocBoot/iocLinux/auto_positions.req b/iocBoot/iocLinux/auto_positions.req
new file mode 100644
index 0000000000000000000000000000000000000000..5e89c536b6f99aea3213faf4af534427df4b4ee6
--- /dev/null
+++ b/iocBoot/iocLinux/auto_positions.req
@@ -0,0 +1,16 @@
+$(P)m1.OFF
+$(P)m1.DVAL
+$(P)m2.OFF
+$(P)m2.DVAL
+$(P)m3.OFF
+$(P)m3.DVAL
+$(P)m4.OFF
+$(P)m4.DVAL
+$(P)m5.OFF
+$(P)m5.DVAL
+$(P)m6.OFF
+$(P)m6.DVAL
+$(P)m7.OFF
+$(P)m7.DVAL
+$(P)m8.OFF
+$(P)m8.DVAL
diff --git a/iocBoot/iocLinux/auto_settings.req b/iocBoot/iocLinux/auto_settings.req
new file mode 100644
index 0000000000000000000000000000000000000000..bba57ad789a9d27c2d4bb5049223b6ff7e3140ca
--- /dev/null
+++ b/iocBoot/iocLinux/auto_settings.req
@@ -0,0 +1,41 @@
+file motor_settings.req P=$(P),M=m1
+
+file scanParms_settings.req P=$(P),M=m1
+
+file table_settings.req P=$(P),T=table1,Q=table1
+
+file scan_settings.req P=$(P),S=scan1
+file scan_settings.req P=$(P),S=scan2
+file scan_settings.req P=$(P),S=scan3
+file scan_settings.req P=$(P),S=scan4
+file scan_settings.req P=$(P),S=scanH
+
+# Kohzu monochromator
+#$(P)BraggHAO.VAL
+#$(P)BraggKAO.VAL
+#$(P)BraggLAO.VAL
+#$(P)BraggAAO.VAL
+#$(P)BraggTypeMO.VAL
+#$(P)KohzuMode2MO.VAL
+#$(P)Kohzu_yOffsetAO.VAL
+
+file userCalcs10_settings.req P=$(P)
+file userCalcN_settings.req P=$(P),N=I_Detector
+
+file saveData_settings.req P=$(P)
+
+file userTransforms10_settings.req P=$(P)
+
+file userStringCalcs10_settings.req P=$(P)
+
+# string-sequence records
+file sseq_settings.req P=$(P),S=Sseq1
+file sseq_settings.req P=$(P),S=Sseq2
+file sseq_settings.req P=$(P),S=Sseq3
+
+
+# 4-step measurement
+file auto_4step_settings.req P=$(P),Q=4step
+
+file userAve10_settings.req P=$(P)
+
diff --git a/iocBoot/iocLinux/envPaths b/iocBoot/iocLinux/envPaths
new file mode 100644
index 0000000000000000000000000000000000000000..164e129f69e2dd8a0c34237ccc936779f086e9c0
--- /dev/null
+++ b/iocBoot/iocLinux/envPaths
@@ -0,0 +1,27 @@
+epicsEnvSet(ARCH,"linux-x86")
+epicsEnvSet(IOC,"iocLinux")
+epicsEnvSet(TOP,"/home/oxygen4/MOONEY/epics/synApps_5_1/support/xxx")
+epicsEnvSet(SUPPORT,"/home/oxygen/MOONEY/epics/synApps_5_1/support")
+epicsEnvSet(ALLEN_BRADLEY,"/home/oxygen/MOONEY/epics/synApps_5_1/support/allenBradley/2-1")
+epicsEnvSet(ASYN,"/home/oxygen/MOONEY/epics/synApps_5_1/support/asyn/4-2")
+epicsEnvSet(AUTOSAVE,"/home/oxygen/MOONEY/epics/synApps_5_1/support/autosave/cvs")
+epicsEnvSet(CALC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/calc/2-4")
+epicsEnvSet(CAMAC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/camac/cvs")
+epicsEnvSet(CCD,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ccd/cvs")
+epicsEnvSet(DAC128V,"/home/oxygen/MOONEY/epics/synApps_5_1/support/dac128V/cvs")
+epicsEnvSet(DXP,"/home/oxygen/MOONEY/epics/synApps_5_1/support/dxp/cvs")
+epicsEnvSet(GENSUB,"/home/oxygen/MOONEY/epics/synApps_5_1/support/genSub/1-6")
+epicsEnvSet(IP,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ip/2-4")
+epicsEnvSet(IP330,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ip330/cvs")
+epicsEnvSet(IPUNIDIG,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ipUnidig/cvs")
+epicsEnvSet(IPAC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ipac/2-8")
+epicsEnvSet(MCA,"/home/oxygen/MOONEY/epics/synApps_5_1/support/mca/cvs")
+epicsEnvSet(MOTOR,"/home/oxygen/MOONEY/epics/synApps_5_1/support/motor/cvs")
+epicsEnvSet(OPTICS,"/home/oxygen/MOONEY/epics/synApps_5_1/support/optics/2-4")
+epicsEnvSet(QUADEM,"/home/oxygen/MOONEY/epics/synApps_5_1/support/quadEM/cvs")
+epicsEnvSet(SNCSEQ,"/home/oxygen/MOONEY/epics/synApps_5_1/support/seq/2-0-9")
+epicsEnvSet(SSCAN,"/home/oxygen/MOONEY/epics/synApps_5_1/support/sscan/cvs")
+epicsEnvSet(STD,"/home/oxygen/MOONEY/epics/synApps_5_1/support/std/2-4")
+epicsEnvSet(VME,"/home/oxygen/MOONEY/epics/synApps_5_1/support/vme/cvs")
+epicsEnvSet(VXSTATS,"/home/oxygen/MOONEY/epics/synApps_5_1/support/vxStats/cvs")
+epicsEnvSet(EPICS_BASE,"/home/oxygen/MOONEY/epics/base-3.14.7")
diff --git a/iocBoot/iocLinux/run b/iocBoot/iocLinux/run
new file mode 100755
index 0000000000000000000000000000000000000000..001877b6aba04854d4dfb1896e8a1eda54d3c16e
--- /dev/null
+++ b/iocBoot/iocLinux/run
@@ -0,0 +1 @@
+../../bin/${EPICS_HOST_ARCH}/xxx st.cmd
diff --git a/iocBoot/iocLinux/saveData.req b/iocBoot/iocLinux/saveData.req
new file mode 100644
index 0000000000000000000000000000000000000000..6eaff4e171705167bd1c68f42c9db0cfcf4dc2c6
--- /dev/null
+++ b/iocBoot/iocLinux/saveData.req
@@ -0,0 +1,40 @@
+[prefix]
+$(P)
+
+[status]
+$(P)saveData_status
+
+[message]
+$(P)saveData_message
+
+[filename]
+$(P)saveData_fileName
+
+[counter]	# scan counter
+$(P)saveData_scanNumber
+
+[fileSystem] # scan file system
+$(P)saveData_fileSystem
+
+[subdir]	# scan file subdirectory
+$(P)saveData_subDir
+
+[fullPathName]
+$(P)saveData_fullPathName
+
+[realTime1D] # if nonzero, write 1D data as it comes in
+$(P)saveData_realTime1D
+
+[scanRecord]	# specify scan records to be monitored
+$(P)scanH
+$(P)scan1
+$(P)scan2
+$(P)scan3
+$(P)scan4
+
+[extraPV]
+$(P)userCalc1.CALC	"string"
+$(P)saveData_realTime1D "enum"
+$(P)saveData_scanNumber	"long"
+$(P)saveData_fileSystem	"filesystem"
+$(P)scan1.P1SM		"scan mode"
diff --git a/iocBoot/iocLinux/save_restore.cmd b/iocBoot/iocLinux/save_restore.cmd
new file mode 100644
index 0000000000000000000000000000000000000000..6aadbca37dde80e67df7775a6ca077e3e92b262d
--- /dev/null
+++ b/iocBoot/iocLinux/save_restore.cmd
@@ -0,0 +1,56 @@
+### save_restore setup
+#
+# The rest this file does not require modification for standard use, but...
+# If you want save_restore to manage its own NFS mount, specify the name and
+# IP address of the file server to which save files should be written.
+# This currently is supported only on vxWorks.
+#save_restoreSet_NFSHost("oxygen", "164.54.52.4")
+
+# status-PV prefix
+save_restoreSet_status_prefix("xxx:")
+# Debug-output level
+save_restoreSet_Debug(0)
+
+# Ok to save/restore save sets with missing values (no CA connection to PV)?
+save_restoreSet_IncompleteSetsOk(1)
+# Save dated backup files?
+save_restoreSet_DatedBackupFiles(1)
+
+# Number of sequenced backup files to write
+save_restoreSet_NumSeqFiles(3)
+# Time interval between sequenced backups
+save_restoreSet_SeqPeriodInSeconds(300)
+
+# specify where save files should be
+set_savefile_path("$(STARTUP)", "autosave")
+
+# specify what save files should be restored.  Note these files must be
+# in the directory specified in set_savefile_path(), or, if that function
+# has not been called, from the directory current when iocInit is invoked
+set_pass0_restoreFile("auto_positions.sav")
+set_pass0_restoreFile("auto_settings.sav")
+set_pass1_restoreFile("auto_settings.sav")
+
+# specify directories in which to to search for included request files
+# Note cdCommands defines 'startup', but envPaths does not
+set_requestfile_path("$(STARTUP)", "")
+set_requestfile_path("$(STARTUP)", "autosave")
+set_requestfile_path("$(AUTOSAVE)", "asApp/Db")
+set_requestfile_path("$(CALC)", "calcApp/Db")
+#set_requestfile_path("$(CAMAC)", "camacApp/Db")
+set_requestfile_path("$(CCD)", "ccdApp/Db")
+set_requestfile_path("$(DAC128V)", "dac128VApp/Db")
+set_requestfile_path("$(DXP)", "dxpApp/Db")
+set_requestfile_path("$(IP)", "ipApp/Db")
+set_requestfile_path("$(IP330)", "ip330App/Db")
+set_requestfile_path("$(IPUNIDIG)", "ipUnidigApp/Db")
+#set_requestfile_path("$(LOVE)", "loveApp/Db")
+set_requestfile_path("$(MCA)", "mcaApp/Db")
+set_requestfile_path("$(MOTOR)", "motorApp/Db")
+set_requestfile_path("$(OPTICS)", "opticsApp/Db")
+set_requestfile_path("$(QUADEM)", "quadEMApp/Db")
+set_requestfile_path("$(SSCAN)", "sscanApp/Db")
+set_requestfile_path("$(STD)", "stdApp/Db")
+set_requestfile_path("$(VME)", "vmeApp/Db")
+
+dbLoadRecords("$(AUTOSAVE)/asApp/Db/save_restoreStatus.db", "P=xxx:")
diff --git a/iocBoot/iocLinux/scanParms.substitutions b/iocBoot/iocLinux/scanParms.substitutions
new file mode 100644
index 0000000000000000000000000000000000000000..cfe432b88291e917e8b9a8a6b493e024bf2a8d78
--- /dev/null
+++ b/iocBoot/iocLinux/scanParms.substitutions
@@ -0,0 +1,46 @@
+file "$(SSCAN)/sscanApp/Db/scanParms.db"
+{
+{P=xxx:,SCANREC=xxx:scan1,Q=m1,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m2,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m3,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m4,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m5,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m6,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m7,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=m8,POS=$(Q).VAL,RDBK=$(Q).RBV}
+
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1X,POS=table1.X,RDBK=table1.XRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1Y,POS=table1.Y,RDBK=table1.YRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1Z,POS=table1.Z,RDBK=table1.ZRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AX,POS=table1.AX,RDBK=table1.AXRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AY,POS=table1.AY,RDBK=table1.AYRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AZ,POS=table1.AZ,RDBK=table1.AZRB}
+
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggE,POS=BraggEAO.VAL,RDBK=BraggERdbkAO.VAL}
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggLambda,POS=BraggLambdaAO.VAL,RDBK=BraggLambdaRdbkAO.VAL}
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggTheta,POS=BraggThetaAO.VAL,RDBK=BraggThetaRdbkAO.VAL}
+
+#{P=xxx:,SCANREC=xxx:scan1,Q=HR1_E,POS=HR1_EAO.VAL,RDBK=HR1_ERdbkAO}
+#{P=xxx:,SCANREC=xxx:scan1,Q=HR1_A,POS=HR1_worldOffAO.VAL,RDBK=HR1_worldOffAO.VAL}
+
+# old slit
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hp,POS=Slit1Hxp.VAL,RDBK=Slit1Ht2.A}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hn,POS=Slit1Hxn.VAL,RDBK=Slit1Ht2.B}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hsize,POS=Slit1Hsize.VAL,RDBK=Slit1Ht2.C}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hcenter,POS=Slit1Hcenter.VAL,RDBK=Slit1Ht2.D}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vp,POS=Slit1Vxp.VAL,RDBK=Slit1Vt2.A}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vn,POS=Slit1Vxn.VAL,RDBK=Slit1Vt2.B}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vsize,POS=Slit1Vsize.VAL,RDBK=Slit1Vt2.C}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vcenter,POS=Slit1Vcenter.VAL,RDBK=Slit1Vt2.D}
+
+# new soft-motor-based slit
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hxn,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hxp,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hsize,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hcenter,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vxn,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vxp,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vsize,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vcenter,POS=$(Q).VAL,RDBK=$(Q).RBV}
+
+}
diff --git a/iocBoot/iocLinux/st.cmd b/iocBoot/iocLinux/st.cmd
new file mode 100644
index 0000000000000000000000000000000000000000..021774e9873bbd603281ee306a7a1c6450945184
--- /dev/null
+++ b/iocBoot/iocLinux/st.cmd
@@ -0,0 +1,131 @@
+# vxWorks 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
+
+# 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
+
+### save_restore setup
+# We presume a suitable initHook routine was compiled into the executable.
+# See also create_monitor_set(), after iocInit() .
+< save_restore.cmd
+
+# interpolation
+dbLoadRecords("$(CALC)/calcApp/Db/interp.db", "P=xxx:,N=2000")
+
+
+### 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")
+
+# 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")
+
+# 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:")
+
+# 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")
+
+### 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")
+# 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")
+
+# 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")
+
+# 4-bounce high-resolution monochromator
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=xxx:,N=1,M_PHI1=m1,M_PHI2=m2")
+
+### Stuff for user programming ###
+dbLoadRecords("$(CALC)/calcApp/Db/userCalcs10.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:")
+# 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")
+
+# 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")
+
+# Miscellaneous PV's, such as burtResult
+dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=xxx:")
+
+
+###############################################################################
+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"
+
+### 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 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_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")
diff --git a/iocBoot/iocSolaris/Makefile b/iocBoot/iocSolaris/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ab5b240648227eacbd98b4f1728695df4846e9a6
--- /dev/null
+++ b/iocBoot/iocSolaris/Makefile
@@ -0,0 +1,5 @@
+TOP = ../..
+include $(TOP)/configure/CONFIG
+ARCH = solaris-sparc-gnu
+TARGETS = envPaths
+include $(TOP)/configure/RULES.ioc
diff --git a/iocBoot/iocSolaris/README b/iocBoot/iocSolaris/README
new file mode 100644
index 0000000000000000000000000000000000000000..1060b5e6b9aff50dcf088d243a1fbe242fd352bb
--- /dev/null
+++ b/iocBoot/iocSolaris/README
@@ -0,0 +1,5 @@
+Assuming the EPICS_HOST_ARCH environment variable is set correctly,
+start the ioc from this directory by executing the following command.
+
+../../bin/${EPICS_HOST_ARCH}/xxx st.cmd
+
diff --git a/iocBoot/iocSolaris/auto_positions.req b/iocBoot/iocSolaris/auto_positions.req
new file mode 100644
index 0000000000000000000000000000000000000000..5e89c536b6f99aea3213faf4af534427df4b4ee6
--- /dev/null
+++ b/iocBoot/iocSolaris/auto_positions.req
@@ -0,0 +1,16 @@
+$(P)m1.OFF
+$(P)m1.DVAL
+$(P)m2.OFF
+$(P)m2.DVAL
+$(P)m3.OFF
+$(P)m3.DVAL
+$(P)m4.OFF
+$(P)m4.DVAL
+$(P)m5.OFF
+$(P)m5.DVAL
+$(P)m6.OFF
+$(P)m6.DVAL
+$(P)m7.OFF
+$(P)m7.DVAL
+$(P)m8.OFF
+$(P)m8.DVAL
diff --git a/iocBoot/iocSolaris/auto_settings.req b/iocBoot/iocSolaris/auto_settings.req
new file mode 100644
index 0000000000000000000000000000000000000000..a426ea09e2f19b11d48605603772e88d6b69beef
--- /dev/null
+++ b/iocBoot/iocSolaris/auto_settings.req
@@ -0,0 +1,48 @@
+file motor_settings.req P=$(P),M=m1
+file softMotor_settings.req P=$(P),SM=SM1
+file softMotor_settings.req P=$(P),SM=SM2
+file softMotor_settings.req P=$(P),SM=SM3
+file softMotor_settings.req P=$(P),SM=SM4
+file softMotor_settings.req P=$(P),SM=SM5
+file softMotor_settings.req P=$(P),SM=SM6
+file softMotor_settings.req P=$(P),SM=SM7
+file softMotor_settings.req P=$(P),SM=SM8
+file softMotor_settings.req P=$(P),SM=SM9
+file softMotor_settings.req P=$(P),SM=SM10
+
+file scanParms_settings.req P=$(P),M=m1
+
+file table_settings.req P=$(P),T=table1,Q=table1
+
+file scan_settings.req P=$(P),S=scan1
+file scan_settings.req P=$(P),S=scan2
+file scan_settings.req P=$(P),S=scan3
+file scan_settings.req P=$(P),S=scan4
+file scan_settings.req P=$(P),S=scanH
+
+# Kohzu monochromator
+#$(P)BraggHAO.VAL
+#$(P)BraggKAO.VAL
+#$(P)BraggLAO.VAL
+#$(P)BraggAAO.VAL
+#$(P)BraggTypeMO.VAL
+#$(P)KohzuMode2MO.VAL
+#$(P)Kohzu_yOffsetAO.VAL
+
+file userCalcs10_settings.req P=$(P)
+file userCalcN_settings.req P=$(P),N=I_Detector
+file saveData_settings.req P=$(P)
+file userTransforms10_settings.req P=$(P)
+file userStringCalcs10_settings.req P=$(P)
+file userCalcOuts10_settings.req P=$(P)
+# string-sequence records
+file sseq_settings.req P=$(P),S=Sseq1
+file sseq_settings.req P=$(P),S=Sseq2
+file sseq_settings.req P=$(P),S=Sseq3
+
+
+# 4-step measurement
+file auto_4step_settings.req P=$(P),Q=4step
+
+file userAve10_settings.req P=$(P)
+
diff --git a/iocBoot/iocSolaris/envPaths b/iocBoot/iocSolaris/envPaths
new file mode 100644
index 0000000000000000000000000000000000000000..0d144e72a4fa552f8a489c2a5566d7c294c8d894
--- /dev/null
+++ b/iocBoot/iocSolaris/envPaths
@@ -0,0 +1,28 @@
+epicsEnvSet(ARCH,"solaris-sparc-gnu")
+epicsEnvSet(IOC,"iocSolaris")
+epicsEnvSet(TOP,"/home/oxygen4/MOONEY/epics/synApps_5_1/support/xxx")
+epicsEnvSet(SUPPORT,"/home/oxygen/MOONEY/epics/synApps_5_1/support")
+epicsEnvSet(EPICS_BASE,"/home/oxygen/MOONEY/epics/base-3.14.7")
+epicsEnvSet(ALLEN_BRADLEY,"/home/oxygen/MOONEY/epics/synApps_5_1/support/allenBradley/2-1")
+epicsEnvSet(ASYN,"/home/oxygen/MOONEY/epics/synApps_5_1/support/asyn/4-2")
+epicsEnvSet(AUTOSAVE,"/home/oxygen/MOONEY/epics/synApps_5_1/support/autosave/4-1")
+epicsEnvSet(GENSUB,"/home/oxygen/MOONEY/epics/synApps_5_1/support/genSub/1-6")
+epicsEnvSet(CALC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/calc/cvs")
+epicsEnvSet(CAMAC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/camac/cvs")
+epicsEnvSet(CCD,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ccd/cvs")
+epicsEnvSet(DAC128V,"/home/oxygen/MOONEY/epics/synApps_5_1/support/dac128V/cvs")
+epicsEnvSet(DXP,"/home/oxygen/MOONEY/epics/synApps_5_1/support/dxp/cvs")
+epicsEnvSet(IP,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ip/2-4")
+epicsEnvSet(IP330,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ip330/cvs")
+epicsEnvSet(IPAC,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ipac/2-8")
+epicsEnvSet(IPUNIDIG,"/home/oxygen/MOONEY/epics/synApps_5_1/support/ipUnidig/cvs")
+epicsEnvSet(MCA,"/home/oxygen/MOONEY/epics/synApps_5_1/support/mca/cvs")
+epicsEnvSet(MOTOR,"/home/oxygen/MOONEY/epics/synApps_5_1/support/motor/cvs")
+epicsEnvSet(OPTICS,"/home/oxygen/MOONEY/epics/synApps_5_1/support/optics/2-4")
+epicsEnvSet(QUADEM,"/home/oxygen/MOONEY/epics/synApps_5_1/support/quadEM/cvs")
+epicsEnvSet(SNCSEQ,"/home/oxygen/MOONEY/epics/synApps_5_1/support/seq/2-0-9")
+epicsEnvSet(SSCAN,"/home/oxygen/MOONEY/epics/synApps_5_1/support/sscan/cvs")
+epicsEnvSet(STD,"/home/oxygen/MOONEY/epics/synApps_5_1/support/std/cvs")
+epicsEnvSet(VME,"/home/oxygen/MOONEY/epics/synApps_5_1/support/vme/cvs")
+epicsEnvSet(VXSTATS,"/home/oxygen/MOONEY/epics/synApps_5_1/support/vxStats/cvs")
+epicsEnvSet(XXX,"/home/oxygen/MOONEY/epics/synApps_5_1/support/xxx")
diff --git a/iocBoot/iocSolaris/motor.substitutions b/iocBoot/iocSolaris/motor.substitutions
new file mode 100644
index 0000000000000000000000000000000000000000..a1c4a2a534018f8f7823bd05cf67d8f644b8c123
--- /dev/null
+++ b/iocBoot/iocSolaris/motor.substitutions
@@ -0,0 +1,21 @@
+file "$(MOTOR)/db/motor.db"
+{
+pattern
+{P,		N,	M,		DTYP,			C,	S,	DESC,			EGU,		DIR,	VELO,	VBAS,	ACCL,	BDST,	BVEL,	BACC,	MRES,	PREC,	DHLM,	DLLM,	INIT}
+{xxx:,	1,	m$(N),	"OMS VME8/44",	0,	0,	"M0X",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	2,	m$(N),	"OMS VME8/44",	0,	1,	"M0Y",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	3,	m$(N),	"OMS VME8/44",	0,	2,	"M1Y",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	4,	m$(N),	"OMS VME8/44",	0,	3,	"M2X",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	5,	m$(N),	"OMS VME8/44",	0,	4,	"M2Y",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	6,	m$(N),	"OMS VME8/44",	0,	5,	"M2Z",			mm,			Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	7,	m$(N),	"OMS VME8/44",	0,	6,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	8,	m$(N),	"OMS VME8/44",	0,	7,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	9,	m$(N),	"OMS VME58",	0,	0,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	10,	m$(N),	"OMS VME58",	0,	1,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	11,	m$(N),	"OMS VME58",	0,	2,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	12,	m$(N),	"OMS VME58",	0,	3,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	13,	m$(N),	"OMS VME58",	0,	4,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	14,	m$(N),	"OMS VME58",	0,	5,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	15,	m$(N),	"OMS VME58",	0,	6,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+{xxx:,	16,	m$(N),	"OMS VME58",	0,	7,	"motor $(N)",	degrees,	Pos,	1,		.1,		.2,		0,		1,		.2,		2.5e-4,	5,		100,	-100,	""}
+}
diff --git a/iocBoot/iocSolaris/run b/iocBoot/iocSolaris/run
new file mode 100755
index 0000000000000000000000000000000000000000..001877b6aba04854d4dfb1896e8a1eda54d3c16e
--- /dev/null
+++ b/iocBoot/iocSolaris/run
@@ -0,0 +1 @@
+../../bin/${EPICS_HOST_ARCH}/xxx st.cmd
diff --git a/iocBoot/iocSolaris/saveData.req b/iocBoot/iocSolaris/saveData.req
new file mode 100644
index 0000000000000000000000000000000000000000..6eaff4e171705167bd1c68f42c9db0cfcf4dc2c6
--- /dev/null
+++ b/iocBoot/iocSolaris/saveData.req
@@ -0,0 +1,40 @@
+[prefix]
+$(P)
+
+[status]
+$(P)saveData_status
+
+[message]
+$(P)saveData_message
+
+[filename]
+$(P)saveData_fileName
+
+[counter]	# scan counter
+$(P)saveData_scanNumber
+
+[fileSystem] # scan file system
+$(P)saveData_fileSystem
+
+[subdir]	# scan file subdirectory
+$(P)saveData_subDir
+
+[fullPathName]
+$(P)saveData_fullPathName
+
+[realTime1D] # if nonzero, write 1D data as it comes in
+$(P)saveData_realTime1D
+
+[scanRecord]	# specify scan records to be monitored
+$(P)scanH
+$(P)scan1
+$(P)scan2
+$(P)scan3
+$(P)scan4
+
+[extraPV]
+$(P)userCalc1.CALC	"string"
+$(P)saveData_realTime1D "enum"
+$(P)saveData_scanNumber	"long"
+$(P)saveData_fileSystem	"filesystem"
+$(P)scan1.P1SM		"scan mode"
diff --git a/iocBoot/iocSolaris/save_restore.cmd b/iocBoot/iocSolaris/save_restore.cmd
new file mode 100644
index 0000000000000000000000000000000000000000..6aadbca37dde80e67df7775a6ca077e3e92b262d
--- /dev/null
+++ b/iocBoot/iocSolaris/save_restore.cmd
@@ -0,0 +1,56 @@
+### save_restore setup
+#
+# The rest this file does not require modification for standard use, but...
+# If you want save_restore to manage its own NFS mount, specify the name and
+# IP address of the file server to which save files should be written.
+# This currently is supported only on vxWorks.
+#save_restoreSet_NFSHost("oxygen", "164.54.52.4")
+
+# status-PV prefix
+save_restoreSet_status_prefix("xxx:")
+# Debug-output level
+save_restoreSet_Debug(0)
+
+# Ok to save/restore save sets with missing values (no CA connection to PV)?
+save_restoreSet_IncompleteSetsOk(1)
+# Save dated backup files?
+save_restoreSet_DatedBackupFiles(1)
+
+# Number of sequenced backup files to write
+save_restoreSet_NumSeqFiles(3)
+# Time interval between sequenced backups
+save_restoreSet_SeqPeriodInSeconds(300)
+
+# specify where save files should be
+set_savefile_path("$(STARTUP)", "autosave")
+
+# specify what save files should be restored.  Note these files must be
+# in the directory specified in set_savefile_path(), or, if that function
+# has not been called, from the directory current when iocInit is invoked
+set_pass0_restoreFile("auto_positions.sav")
+set_pass0_restoreFile("auto_settings.sav")
+set_pass1_restoreFile("auto_settings.sav")
+
+# specify directories in which to to search for included request files
+# Note cdCommands defines 'startup', but envPaths does not
+set_requestfile_path("$(STARTUP)", "")
+set_requestfile_path("$(STARTUP)", "autosave")
+set_requestfile_path("$(AUTOSAVE)", "asApp/Db")
+set_requestfile_path("$(CALC)", "calcApp/Db")
+#set_requestfile_path("$(CAMAC)", "camacApp/Db")
+set_requestfile_path("$(CCD)", "ccdApp/Db")
+set_requestfile_path("$(DAC128V)", "dac128VApp/Db")
+set_requestfile_path("$(DXP)", "dxpApp/Db")
+set_requestfile_path("$(IP)", "ipApp/Db")
+set_requestfile_path("$(IP330)", "ip330App/Db")
+set_requestfile_path("$(IPUNIDIG)", "ipUnidigApp/Db")
+#set_requestfile_path("$(LOVE)", "loveApp/Db")
+set_requestfile_path("$(MCA)", "mcaApp/Db")
+set_requestfile_path("$(MOTOR)", "motorApp/Db")
+set_requestfile_path("$(OPTICS)", "opticsApp/Db")
+set_requestfile_path("$(QUADEM)", "quadEMApp/Db")
+set_requestfile_path("$(SSCAN)", "sscanApp/Db")
+set_requestfile_path("$(STD)", "stdApp/Db")
+set_requestfile_path("$(VME)", "vmeApp/Db")
+
+dbLoadRecords("$(AUTOSAVE)/asApp/Db/save_restoreStatus.db", "P=xxx:")
diff --git a/iocBoot/iocSolaris/scanParms.substitutions b/iocBoot/iocSolaris/scanParms.substitutions
new file mode 100644
index 0000000000000000000000000000000000000000..6cda7e7d8c3b5a3cd461ca7a1698ba78290f607a
--- /dev/null
+++ b/iocBoot/iocSolaris/scanParms.substitutions
@@ -0,0 +1,48 @@
+file "$(SSCAN)/sscanApp/Db/scanParms.db"
+{
+{P=xxx:,SCANREC=xxx:scan1,Q=SM1,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM2,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM3,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM4,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM5,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM6,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM7,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM8,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM9,POS=$(Q).VAL,RDBK=$(Q).RBV}
+{P=xxx:,SCANREC=xxx:scan1,Q=SM10,POS=$(Q).VAL,RDBK=$(Q).RBV}
+
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1X,POS=table1.X,RDBK=table1.XRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1Y,POS=table1.Y,RDBK=table1.YRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1Z,POS=table1.Z,RDBK=table1.ZRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AX,POS=table1.AX,RDBK=table1.AXRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AY,POS=table1.AY,RDBK=table1.AYRB}
+{P=xxx:,SCANREC=xxx:scan1,Q=Table1AZ,POS=table1.AZ,RDBK=table1.AZRB}
+
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggE,POS=BraggEAO.VAL,RDBK=BraggERdbkAO.VAL}
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggLambda,POS=BraggLambdaAO.VAL,RDBK=BraggLambdaRdbkAO.VAL}
+#{P=xxx:,SCANREC=xxx:scan1,Q=BraggTheta,POS=BraggThetaAO.VAL,RDBK=BraggThetaRdbkAO.VAL}
+
+#{P=xxx:,SCANREC=xxx:scan1,Q=HR1_E,POS=HR1_EAO.VAL,RDBK=HR1_ERdbkAO}
+#{P=xxx:,SCANREC=xxx:scan1,Q=HR1_A,POS=HR1_worldOffAO.VAL,RDBK=HR1_worldOffAO.VAL}
+
+# old slit
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hp,POS=Slit1Hxp.VAL,RDBK=Slit1Ht2.A}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hn,POS=Slit1Hxn.VAL,RDBK=Slit1Ht2.B}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hsize,POS=Slit1Hsize.VAL,RDBK=Slit1Ht2.C}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Hcenter,POS=Slit1Hcenter.VAL,RDBK=Slit1Ht2.D}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vp,POS=Slit1Vxp.VAL,RDBK=Slit1Vt2.A}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vn,POS=Slit1Vxn.VAL,RDBK=Slit1Vt2.B}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vsize,POS=Slit1Vsize.VAL,RDBK=Slit1Vt2.C}
+{P=xxx:,SCANREC=xxx:scan1,Q=Slit1Vcenter,POS=Slit1Vcenter.VAL,RDBK=Slit1Vt2.D}
+
+# new soft-motor-based slit
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hxn,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hxp,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hsize,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Hcenter,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vxn,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vxp,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vsize,POS=$(Q).VAL,RDBK=$(Q).RBV}
+#{P=xxx:,SCANREC=xxx:scan1,Q=Slit2Vcenter,POS=$(Q).VAL,RDBK=$(Q).RBV}
+
+}
diff --git a/iocBoot/iocSolaris/softMotor.substitutions b/iocBoot/iocSolaris/softMotor.substitutions
new file mode 100644
index 0000000000000000000000000000000000000000..988001da4f3a26428b16081b6c1bca356a034f0a
--- /dev/null
+++ b/iocBoot/iocSolaris/softMotor.substitutions
@@ -0,0 +1,15 @@
+file "$(STD)/stdApp/Db/softMotor.db"
+{
+pattern
+{P,		SM}
+{xxx:,	SM1}
+{xxx:,	SM2}
+{xxx:,	SM3}
+{xxx:,	SM4}
+{xxx:,	SM5}
+{xxx:,	SM6}
+{xxx:,	SM7}
+{xxx:,	SM8}
+{xxx:,	SM9}
+{xxx:,	SM10}
+}
diff --git a/iocBoot/iocSolaris/st.cmd b/iocBoot/iocSolaris/st.cmd
new file mode 100644
index 0000000000000000000000000000000000000000..b7a6f1b53f856167a9c19b8d62ed4b5135c29a78
--- /dev/null
+++ b/iocBoot/iocSolaris/st.cmd
@@ -0,0 +1,142 @@
+# vxWorks 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_solaris.dbd")
+iocxxx_solaris_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
+
+# 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
+
+### save_restore setup
+# We presume a suitable initHook routine was compiled into the executable.
+# See also create_monitor_set(), after iocInit() .
+< save_restore.cmd
+
+dbLoadRecords("$(TOP)/xxxApp/Db/busy.db", "P=xxx:,B=busy")
+
+# Motors
+dbLoadTemplate("softMotor.substitutions")
+
+# interpolation
+dbLoadRecords("$(CALC)/calcApp/Db/interp.db", "P=xxx:,N=2000")
+
+
+### 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")
+
+# 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")
+
+# 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:")
+
+# 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")
+
+### 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")
+# 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")
+
+# 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")
+
+# 4-bounce high-resolution monochromator
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=xxx:,N=1,M_PHI1=m1,M_PHI2=m2")
+
+### Stuff for user programming ###
+dbLoadRecords("$(CALC)/calcApp/Db/userCalcs10.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/userCalcOuts10.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")
+
+# 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")
+
+# Miscellaneous PV's, such as burtResult
+dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=xxx:")
+
+
+###############################################################################
+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"
+
+### 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 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_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")