diff --git a/iocBoot/iocxxx/common.iocsh b/iocBoot/iocxxx/common.iocsh
new file mode 100644
index 0000000000000000000000000000000000000000..4e25bdc91bfbf48f04c2d94bd0c878ab77316442
--- /dev/null
+++ b/iocBoot/iocxxx/common.iocsh
@@ -0,0 +1,244 @@
+##########################  ############################################################################
+# 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
+##########################  ############################################################################
+#For devIocStats
+epicsEnvSet("ENGINEER", "engineer")
+epicsEnvSet("LOCATION", "location")
+epicsEnvSet("GROUP", "group")
+
+epicsEnvSet("PREFIX", "xxx:")
+
+### For alive
+epicsEnvSet("IOCBOOT", $(TOP)/iocBoot/$(IOC))
+
+epicsEnvSet("EPICS_DB_INCLUDE_PATH", "$(DEVIOCSTATS)/db")
+
+# set the protocol path for streamDevice
+epicsEnvSet("STREAM_PROTOCOL_PATH", ".")
+
+# save_restore.cmd needs the full path to the startup directory, which
+# envPaths currently does not provide
+epicsEnvSet(STARTUP,$(TOP)/iocBoot/$(IOC))
+
+# Specify largest array CA will transport
+# Note for N doubles, need N*8 bytes+some overhead
+epicsEnvSet EPICS_CA_MAX_ARRAY_BYTES 64010
+
+### save_restore setup
+< common/save_restore.cmd
+
+# Access Security
+dbLoadRecords("$(TOP)/xxxApp/Db/Security_Control.db","P=$(PREFIX)")
+asSetFilename("$(TOP)/iocBoot/accessSecurity.acf")
+asSetSubstitutions("P=$(PREFIX)")
+
+### caputRecorder
+
+# trap listener
+dbLoadRecords("$(CAPUTRECORDER)/caputRecorderApp/Db/caputPoster.db","P=$(PREFIX),N=300")
+doAfterIocInit("registerCaputRecorderTrapListener('$(PREFIX)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=$(PREFIX)A:,N=300")
+
+# user-assignable ramp/tweak
+dbLoadRecords("$(STD)/stdApp/Db/ramp_tweak.db","P=$(PREFIX),Q=rt1")
+
+# < $(PLATFORM)/areaDetector.cmd
+
+# Motors
+dbLoadTemplate("$(PLATFORM)/motor.substitutions")
+#dbLoadTemplate("common/softMotor.substitutions")
+#dbLoadTemplate("common/pseudoMotor.substitutions")
+
+# Allstop, alldone
+dbLoadRecords("$(MOTOR)/db/motorUtil.db", "P=$(PREFIX)")
+doAfterIocInit("motorUtilInit('$(PREFIX)')")
+
+### streamDevice example
+#dbLoadRecords("$(TOP)/xxxApp/Db/streamExample.db","P=$(PREFIX),PORT=serial1")
+
+### Insertion-device control
+#dbLoadRecords("$(STD)/stdApp/Db/IDctrl.db","P=$(PREFIX),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.)
+epicsEnvSet("SDB", "$(SSCAN)/sscanApp/Db/standardScans.db")
+dbLoadRecords("$(SDB)","P=$(PREFIX),MAXPTS1=1000,MAXPTS2=1000,MAXPTS3=1000,MAXPTS4=1000,MAXPTSH=1000")
+#dbLoadRecords("$(SSCAN)/sscanApp/Db/scanAux.db","P=$(PREFIX),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=$(PREFIX)")
+doAfterIocInit("saveData_Init(saveData.req, 'P=$(PREFIX)')")
+
+dbLoadRecords("$(SSCAN)/sscanApp/Db/scanProgress.db","P=$(PREFIX)scanProgress:")
+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("$(PLATFORM)/scanParms.substitutions")
+
+### Slits (If not supplied, RELTOCENTER defaults to zero)
+dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=$(PREFIX),SLIT=Slit1V,mXp=m3,mXn=m4,RELTOCENTER=0")
+dbLoadRecords("$(OPTICS)/opticsApp/Db/2slit.db","P=$(PREFIX),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=$(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")
+#doAfterIocInit("seq  &xia_slit, 'name=hsc1, P=$(PREFIX), HSC=hsc1:, S=$(PREFIX)asyn_6'")
+#doAfterIocInit("seq  &xia_slit, 'name=hsc2, P=$(PREFIX), HSC=hsc2:, S=$(PREFIX)asyn_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")
+
+### Optical tables
+epicsEnvSet("DIR", "$(OPTICS)/opticsApp/Db")
+dbLoadRecords("$(DIR)/table.db","P=$(PREFIX),Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=SRI")
+#dbLoadRecords("$(DIR)/table.db","P=$(PREFIX),Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=NEWPORT")
+#dbLoadRecords("$(DIR)/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:")
+#doAfterIocInit("seq &Io, 'P=$(PREFIX)Io:,MONO=$(PREFIX)BraggEAO,VSC=$(PREFIX)scaler1'")
+
+### 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")
+#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")
+#doAfterIocInit("seq &kohzuCtl, 'P=$(PREFIX), M_THETA=m1, M_Y=m2, M_Z=m3, GEOM=2, logfile=kohzuCtl.log'")
+# Example of specifying offset limits
+#doAfterIocInit("epicsThreadSleep(5.)")
+#doAfterIocInit("dbpf $(PREFIX)kohzu_yOffsetAO.DRVH 17.51")
+#doAfterIocInit("dbpf $(PREFIX)kohzu_yOffsetAO.DRVL 17.49")
+
+# 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=m1,M_PHI2=m2")
+#doAfterIocInit("dbpf '$(PREFIX)HR1CtlDebug','1'")
+#doAfterIocInit("seq &hrCtl, 'P=$(PREFIX), N=1, M_PHI1=m4, M_PHI2=m5, logfile=hrCtl.log'")
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/hrSeq.db","P=$(PREFIX),N=2,M_PHI1=m11,M_PHI2=m12")
+
+### multilayer monochromator: Bragg and theta/Y/Z motors
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/ml_monoSeq.db","P=$(PREFIX)")
+#doAfterIocInit("seq &ml_monoCtl, 'P=$(PREFIX), 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=$(PREFIX),O=1,PREC=6")
+#dbLoadTemplate("common/orient_xtals.substitutions")
+#doAfterIocInit("seq &orient, 'P=$(PREFIX)orient1:,PM=$(PREFIX),mTTH=m9,mTH=m10,mCHI=m11,mPHI=m12'")
+
+
+# Coarse/Fine stage
+#dbLoadRecords("$(OPTICS)/opticsApp/Db/CoarseFineMotor.db","P=$(PREFIX)cf1:,PM=$(PREFIX),CM=m7,FM=m8")
+
+# Load single element Canberra AIM MCA and ICB modules
+#< $(PLATFORM)/canberra_1.cmd
+
+# Load 13 element detector software
+#< $(PLATFORM)/canberra_13.cmd
+
+# Load 3 element detector software
+#< $(PLATFORM)/canberra_3.cmd
+
+### Stuff for user programming ###
+< common/calc.cmd
+
+# 4-step measurement
+dbLoadRecords("$(STD)/stdApp/Db/4step.db", "P=$(PREFIX),Q=4step:")
+
+# user-assignable ramp/tweak
+dbLoadRecords("$(STD)/stdApp/Db/ramp_tweak.db","P=$(PREFIX),Q=rt1")
+
+# pvHistory (in-crate archive of up to three PV's)
+dbLoadRecords("$(STD)/stdApp/Db/pvHistory.db","P=$(PREFIX),N=1,MAXSAMPLES=1440")
+
+# software timer
+dbLoadRecords("$(STD)/stdApp/Db/timer.db","P=$(PREFIX),N=1")
+
+# Slow feedback
+dbLoadTemplate "pid_slow.substitutions"
+dbLoadTemplate "$(PLATFORM)/async_pid_slow.substitutions"
+#dbLoadTemplate "common/fb_epid.substitutions"
+
+# Miscellaneous PV's, such as burtResult
+dbLoadRecords("$(STD)/stdApp/Db/misc.db","P=$(PREFIX)")
+
+### Queensgate piezo driver
+#dbLoadRecords("$(IP)/ipApp/Db/pzt.db","P=$(PREFIX)")
+#dbLoadRecords("$(IP)/ipApp/Db/pzt.db","P=$(PREFIX),PORT=")
+
+### 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:")
+epicsEnvSet("FBO", "$(PREFIX)Unidig1Bo")
+#doAfterIocInit("seq &femto,'name=fem1,P=$(PREFIX),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=$(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")
+# 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=$(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"
+#doAfterIocInit("seq filterDrive,'NAME=filterDrive,P=$(PREFIX),R=filter:,NUM_FILTERS=16'")
+
+# trajectory scan
+#dbLoadRecords("$(MOTOR)/motorApp/Db/trajectoryScan.db","P=$(PREFIX),R=traj1:,NAXES=2,NELM=300,NPULSE=300")
+#doAfterIocInit("seq &MAX_trajectoryScan, 'P=$(PREFIX),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=$(PREFIX),RHOST=164.54.100.11")