diff --git a/src/epics/util/feCodeGen.pl b/src/epics/util/feCodeGen.pl
index 58990f43247be5bb6cae7cb9f427e5404cdbd4e3..a9708fd1c6a6101955a764ce737d6d63e34515d6 100755
--- a/src/epics/util/feCodeGen.pl
+++ b/src/epics/util/feCodeGen.pl
@@ -155,6 +155,7 @@ $requireIOcnt = 0;
 #Following provide for non standard IOP clock rates
 $adcclock = 64;
 $modelrate = 64;
+$servoflag = "-DSERVO64K";
 $clock_div = 1;
 
 # Load model name without .mdl extension.
@@ -1474,7 +1475,7 @@ for($ii=0;$ii<$partCnt;$ii++)
 
 	#$gdsXstart = ($dcuId - 5) * 1250;
 	#$gdsTstart = $gdsXstart + 10000;
-	if($rate == 480 || $rate == 240) {
+	if($modelrate == 2 || $modelrate == 4) {
 	  $gdsXstart = 20001;
 	  $gdsTstart = 30001;
 	} else {
@@ -2213,23 +2214,7 @@ sub debug {
 #// \b sub \b get_freq \n
 #// Determine user code sample rate \n\n
 sub get_freq {
-	if($rate == 480) {
-		return 2*1024;
-	} elsif ($rate == 240) {
-		return 4*1024;
-	} elsif ($rate == 60) {
-		return 16*1024;
-	} elsif ($rate == 30) {
-		return 32*1024;
-	} elsif ($rate == 15) {
-		return 64*1024;
-	} elsif ($rate == 4) {
-		return 256*1024;
-	} elsif ($rate == 2) {
-		return 512*1024;
-	} elsif ($rate == 1) {
-		return 1024*1024;
-	}
+    return $modelrate * 1024;
 }
 
 #// \b sub \b init_vars \n
@@ -2450,16 +2435,7 @@ print OUTM "KBUILD_EXTRA_SYMBOLS += \$(PWD)/ModuleIOP.symvers\n";
 print OUTM "ALL \+= user_mmap \$(TARGET_RTL)\n";
 print OUTM "EXTRA_CFLAGS += -O -w -I../../include\n";
 
-if($rate == 480) { print OUTM "EXTRA_CFLAGS += -DSERVO2K\n"; }
-elsif($rate == 240) { print OUTM "EXTRA_CFLAGS += -DSERVO4K\n"; }
-elsif($rate == 60) { print OUTM "EXTRA_CFLAGS += -DSERVO16K\n"; }
-elsif($rate == 30) { print OUTM "EXTRA_CFLAGS += -DSERVO32K\n"; }
-elsif($rate == 15) { print OUTM "EXTRA_CFLAGS += -DSERVO64K\n"; }
-elsif($rate == 7) { print OUTM "EXTRA_CFLAGS += -DSERVO128K\n"; }
-elsif($rate == 4) { print OUTM "EXTRA_CFLAGS += -DSERVO256K\n"; }
-elsif($rate == 2) { print OUTM "EXTRA_CFLAGS += -DSERVO512K\n"; }
-elsif($rate == 1) { print OUTM "EXTRA_CFLAGS += -DSERVO1024K\n"; }
-
+print OUTM "EXTRA_CFLAGS += $servoflag \n";
 
 print OUTM "EXTRA_CFLAGS += -D";
 print OUTM "\U$skeleton";
@@ -2505,24 +2481,6 @@ if ($no_daq) {
 # SHMEM_DAQ set as the default for RCG V2.8 - No longer support GM
   print OUTM "#Comment out to disable local frame builder connection\n";
   print OUTM "EXTRA_CFLAGS += -DSHMEM_DAQ\n";
-
-# Use oversampling code if not 64K system
-if($rate > 15) {
-  if ($no_oversampling) {
-    print OUTM "#Uncomment to oversample A/D inputs\n";
-    print OUTM "#EXTRA_CFLAGS += -DOVERSAMPLE\n";
-    print OUTM "#Uncomment to interpolate D/A outputs\n";
-    print OUTM "#EXTRA_CFLAGS += -DOVERSAMPLE_DAC\n";
-  } else {
-    print OUTM "#Comment out to stop A/D oversampling\n";
-    print OUTM "EXTRA_CFLAGS += -DOVERSAMPLE\n";
-    if ($no_dac_interpolation) {
-    } else {
-      print OUTM "#Comment out to stop interpolating D/A outputs\n";
-      print OUTM "EXTRA_CFLAGS += -DOVERSAMPLE_DAC\n";
-    }
-  }
-}
 # Set to flip polarity of ADC input signals
 if ($flipSignals) {
   print OUTM "EXTRA_CFLAGS += -DFLIP_SIGNALS=1\n";
@@ -2619,7 +2577,25 @@ if ($adcSlave > -1) {   #************ SETUP FOR USER APP ***************
   if ($::noZeroPad) {
     print OUTM "EXTRA_CFLAGS += -DNO_ZERO_PAD=1\n";
   }
+
+# Use oversampling code if not 64K system
+if($modelrate < 64) {
+  if ($no_oversampling) {
+    print OUTM "#Uncomment to oversample A/D inputs\n";
+    print OUTM "#EXTRA_CFLAGS += -DOVERSAMPLE\n";
+    print OUTM "#Uncomment to interpolate D/A outputs\n";
+    print OUTM "#EXTRA_CFLAGS += -DOVERSAMPLE_DAC\n";
+  } else {
+    print OUTM "#Comment out to stop A/D oversampling\n";
+    print OUTM "EXTRA_CFLAGS += -DOVERSAMPLE\n";
+    if ($no_dac_interpolation) {
+    } else {
+      print OUTM "#Comment out to stop interpolating D/A outputs\n";
+      print OUTM "EXTRA_CFLAGS += -DOVERSAMPLE_DAC\n";
+    }
+  }
 }
+}  #******************* END SETUP FOR USER APP
 
 
 
@@ -2655,15 +2631,7 @@ print OUTM "# User Space Linux\n";
 print OUTM "CFLAGS += -O -w -I../../include\n";
 print OUTM "CFLAGS += -I/opt/mx/include\n";
 
-if($rate == 480) { print OUTM "CFLAGS += -DSERVO2K\n"; }
-elsif($rate == 240) { print OUTM "CFLAGS += -DSERVO4K\n"; }
-elsif($rate == 60) { print OUTM "CFLAGS += -DSERVO16K\n"; }
-elsif($rate == 30) { print OUTM "CFLAGS += -DSERVO32K\n"; }
-elsif($rate == 15) { print OUTM "CFLAGS += -DSERVO64K\n"; }
-elsif($rate == 7) { print OUTM "CFLAGS += -DSERVO128K\n"; }
-elsif($rate == 4) { print OUTM "CFLAGS += -DSERVO256K\n"; }
-elsif($rate == 2) { print OUTM "CFLAGS += -DSERVO512K\n"; }
-elsif($rate == 1) { print OUTM "CFLAGS += -DSERVO1024K\n"; }
+print OUTM "EXTRA_CFLAGS += $servoflag \n";
 
 print OUTM "CFLAGS += -D";
 print OUTM "\U$skeleton";
@@ -2704,7 +2672,7 @@ if ($no_daq) {
   print OUTM "CFLAGS += -DSHMEM_DAQ\n";
 
 # Use oversampling code if not 64K system
-if($rate > 15) {
+if($modelrate < 64) {
   if ($no_oversampling) {
     print OUTM "#Uncomment to oversample A/D inputs\n";
     print OUTM "#CFLAGS += -DOVERSAMPLE\n";
diff --git a/src/epics/util/lib/Parameters.pm b/src/epics/util/lib/Parameters.pm
index e69d629bde24f41ee4a7674d5529ba514d6fc0bb..b0d709ecc4056fff3ec44e480d3f7bcbac24b7bb 100644
--- a/src/epics/util/lib/Parameters.pm
+++ b/src/epics/util/lib/Parameters.pm
@@ -62,29 +62,40 @@ sub parseParams {
         			my $param_speed = $spp[1];
         			if ($param_speed eq "2K") {
                 			$::rate = 480;
+                			$::modelrate = 2;
+                			$::servoflag = "-DSERVO2K";
         			} elsif ($param_speed eq "4K") {
                 			$::rate = 240;
+                			$::modelrate = 4;
+                			$::servoflag = "-DSERVO4K";
         			} elsif ($param_speed eq "16K") {
                 			$::rate = 60;
                 			$::modelrate = 16;
+                			$::servoflag = "-DSERVO16K";
         			} elsif ($param_speed eq "32K") {
                 			$::rate = 30;
                 			$::modelrate = 32;
+                			$::servoflag = "-DSERVO32K";
         			} elsif ($param_speed eq "64K") {
                 			$::rate = 15;
                 			$::modelrate = 64;
+                			$::servoflag = "-DSERVO64K";
         			} elsif ($param_speed eq "128K") {
                 			$::rate = 8;
                 			$::modelrate = 128;
+                			$::servoflag = "-DSERVO128K";
         			} elsif ($param_speed eq "256K") {
                 			$::rate = 4;
                 			$::modelrate = 256;
+                			$::servoflag = "-DSERVO256K";
         			} elsif ($param_speed eq "512K") {
                 			$::rate = 2;
                 			$::modelrate = 512;
+                			$::servoflag = "-DSERVO512K";
         			} elsif ($param_speed eq "1024K") {
                 			$::rate = 1;
                 			$::modelrate = 1024;
+                			$::servoflag = "-DSERVO1024K";
         			} else  { die "Invalid speed $param_speed specified\n"; }
 
 			} elsif ($spp[0] eq "dcuid") {
diff --git a/src/fe/mapApp.c b/src/fe/mapApp.c
index 1f9d5de8dc49502e612ac71f32fce3f624de0b01..4b1a50f56c55829fed13abc6fb77d766c277da0b 100644
--- a/src/fe/mapApp.c
+++ b/src/fe/mapApp.c
@@ -47,6 +47,17 @@ mapPciModules( CDS_HARDWARE* pCds )
                     status++;
                 }
                 break;
+            case GSC_18AI32SSC1M:
+                if ( ( pCds->cards_used[ jj ].type == GSC_18AI32SSC1M ) &&
+                     ( pCds->cards_used[ jj ].instance == adcCnt ) )
+                {
+                    kk = pCds->adcCount;
+                    pCds->adcType[ kk ] = GSC_18AI32SSC1M;
+                    pCds->adcConfig[ kk ] = ioMemData->ipc[ ii ];
+                    pCds->adcCount++;
+                    status++;
+                }
+                break;
             case GSC_16AO16:
                 if ( ( pCds->cards_used[ jj ].type == GSC_16AO16 ) &&
                      ( pCds->cards_used[ jj ].instance == dacCnt ) )
@@ -167,6 +178,8 @@ mapPciModules( CDS_HARDWARE* pCds )
         }
         if ( ioMemData->model[ ii ] == GSC_16AI64SSA )
             adcCnt++;
+        if ( ioMemData->model[ ii ] == GSC_18AI32SSC1M )
+            adcCnt++;
         if ( ioMemData->model[ ii ] == GSC_16AO16 )
             dacCnt++;
         if ( ioMemData->model[ ii ] == GSC_18AO8 )
diff --git a/src/include/controller.h b/src/include/controller.h
index c8b4bea3123a50df499ec089dd97d6b21b44febf..33a0734583a2ec0aa1cb8f1ce78d5a4fe466df64 100644
--- a/src/include/controller.h
+++ b/src/include/controller.h
@@ -136,6 +136,8 @@ char fp[ 64 * 1024 ];
 #define DAQ_RATE ( DAQ_16K_SAMPLE_SIZE * 8 )
 #define NET_SEND_WAIT 655360
 #define CYCLE_TIME_ALRM 7
+#define CYCLE_TIME_ALRM_HI 9
+#define CYCLE_TIME_ALRM_LO 1
 #define EPICS_128_SYNC 1024
 #define DAC_PRELOAD_CNT 0
 #endif
diff --git a/src/include/drv/fm10Gen.c b/src/include/drv/fm10Gen.c
index 56002e93aa26e9bf6191dccff24fa6df726ec7f3..0f498eee420452594b843aae0f33acc1140f668c 100644
--- a/src/include/drv/fm10Gen.c
+++ b/src/include/drv/fm10Gen.c
@@ -103,6 +103,9 @@ double twoKAvgCoeff[ 9 ] = { 7.705446e-9,      -1.97673337437048,
 #ifdef SERVO256K
 #define FE_RATE 262144
 #endif
+#ifdef SERVO128K
+#define FE_RATE 131072
+#endif
 #ifdef SERVO64K
 #define FE_RATE 65536
 #endif
diff --git a/src/include/drv/iop_adc_functions.c b/src/include/drv/iop_adc_functions.c
index 1526aa03a615c44e6cc9e82a838951df0f36f9f6..70cf9816a22d606aadc6bd0ef365ffdcb276a153 100644
--- a/src/include/drv/iop_adc_functions.c
+++ b/src/include/drv/iop_adc_functions.c
@@ -102,7 +102,7 @@ sync_adc_2_1pps( )
 inline int
 iop_adc_read( adcInfo_t* adcinfo, int cpuClk[] )
 {
-    int           kk;
+    int           ii,kk;
     volatile int* packedData;
     int           limit;
     int           mask;
@@ -256,6 +256,15 @@ iop_adc_read( adcInfo_t* adcinfo, int cpuClk[] )
                 // dWord is the double representation of the ADC data
                 // This is the value used by the rest of the code calculations.
                 dWord[ card ][ chan ][ kk ] = adcinfo->adcData[ card ][ chan ];
+                // If running with fast ADC at 512K and gsc16ai64 at 64K, then:
+                // fill in the missing data by doing data copy
+                if ( cdsPciModules.adcType[ card ] == GSC_16AI64SSA &&
+                     UNDERSAMPLE > 4 )
+                {
+                    for ( ii = 1; ii < UNDERSAMPLE; ii++ )
+                        dWord[ card ][ chan ][ ii ] = 
+                            adcinfo->adcData[ card ][ chan ];
+                }
                 /// - ----  Load ADC value into ipc memory buffer
                 ioMemData->iodata[ card ][ ioMemCntr ].data[ chan ] =
                     adcinfo->adcData[ card ][ chan ];
@@ -272,14 +281,31 @@ iop_adc_read( adcInfo_t* adcinfo, int cpuClk[] )
                 packedData++;
             }
 
+            // For normal IOP ADC undersampling ie not a mixed fast 512K adc and
+            // normal 64K adc
+            if ( UNDERSAMPLE < 5 )
+            {
+                /// - ---- Write GPS time and cycle count as indicator to slave
+                /// that adc data is ready
+                ioMemData->gpsSecond = timeSec;
+                ioMemData->iodata[ card ][ ioMemCntr ].timeSec = timeSec;
+                ioMemData->iodata[ card ][ ioMemCntr ].cycle = iocycle;
+                ioMemCntr++;
+                iocycle++;
+                iocycle %= 65536;
+            }
+
+        }
+
+        // For ADC undersampling when running with a fast ADC at 512K
+        // to limit rate to user apps at 64K
+        if ( UNDERSAMPLE > 4 )
+        {
             /// - ---- Write GPS time and cycle count as indicator to slave that
             /// adc data is ready
             ioMemData->gpsSecond = timeSec;
             ioMemData->iodata[ card ][ ioMemCntr ].timeSec = timeSec;
             ioMemData->iodata[ card ][ ioMemCntr ].cycle = iocycle;
-            ioMemCntr++;
-            iocycle++;
-            iocycle %= 65536;
         }
 
         /// - ---- Clear out last ADC data read for test on next cycle