diff --git a/src/fe/controller.c b/src/fe/controller.c
index 3de64485bcdbf88e2926cb29224b6d750f5746ea..d05ac2d5212dfe1986e9d11c88ae48371398ebcb 100644
--- a/src/fe/controller.c
+++ b/src/fe/controller.c
@@ -522,7 +522,8 @@ int  getGpsTimeTsync(unsigned int *tsyncSec, unsigned int *tsyncUsec) {
   if (cdsPciModules.gps) {
 	timeRead = (TSYNC_REGISTER *)cdsPciModules.gps;
 	timeSec = timeRead->BCD_SEC;
-	*tsyncSec = timeSec +    31190400;
+	timeSec += cdsPciModules.gpsOffset;
+	*tsyncSec = timeSec;
 	timeNsec = timeRead->SUB_SEC;
 	*tsyncUsec = ((timeNsec & 0xfffffff) * 5) / 1000; 
 	sync = ((timeNsec >> 31) & 0x1) + 1;
@@ -531,6 +532,37 @@ int  getGpsTimeTsync(unsigned int *tsyncSec, unsigned int *tsyncUsec) {
   }
   return(0);
 }
+//***********************************************************************
+// Get current GPS seconds from TSYNC IRIG-B Rcvr
+unsigned int  getGpsSecTsync() {
+TSYNC_REGISTER *timeRead;
+    unsigned int timeSec,timeNsec,sync;
+
+    if (cdsPciModules.gps) {
+            timeRead = (TSYNC_REGISTER *)cdsPciModules.gps;
+            timeSec = timeRead->BCD_SEC;
+	    timeSec += cdsPciModules.gpsOffset;
+            return(timeSec);
+     }
+     return(0);
+}
+//***********************************************************************
+// Get current GPS useconds from TSYNC IRIG-B Rcvr
+   int  getGpsuSecTsync(unsigned int *tsyncUsec) {
+   TSYNC_REGISTER *timeRead;
+   unsigned int timeNsec,sync;
+
+   if (cdsPciModules.gps) {
+            timeRead = (TSYNC_REGISTER *)cdsPciModules.gps;
+            timeNsec = timeRead->SUB_SEC;
+            *tsyncUsec = ((timeNsec & 0xfffffff) * 5) / 1000;
+            sync = ((timeNsec >> 31) & 0x1) + 1;
+            // printf("time = %u %u %d\n",timeSec,(timeNsec & 0xffffff),((timeNsec & 0xffffff)/200));
+            return(sync);
+    }
+    return(0);
+}
+
 
 #if 0
 //***********************************************************************
@@ -1195,17 +1227,6 @@ udelay(1000);
 #endif
   onePpsTime = clock16K;
   timeSec = current_time() -1;
-  if(cdsPciModules.gpsType == SYMCOM_RCVR)
-  {
-  	// time = getGpsTime(&ns);
-	// timeSec = time - 252806386;
-  }
-  if(cdsPciModules.gpsType == TSYNC_RCVR) 
-  {
-	// gps_receiver_locked = getGpsTimeTsync(&timeSec,&usec);
-	// timeSec += 284083219;
-	// timeSec += 0;
-  }
 #ifdef TIME_SLAVE
 	timeSec = *rfmTime;
 #endif
@@ -1433,8 +1454,10 @@ udelay(1000);
 				if(cdsPciModules.gpsType == SYMCOM_RCVR) lockGpsTime();
 				if(cdsPciModules.gpsType == TSYNC_RCVR) 
 				{
-					gps_receiver_locked = getGpsTimeTsync(&timeSec,&usec);
-					pLocalEpics->epicsOutput.diags[FE_DIAGS_IRIGB_TIME] = usec;
+					// Reading second info will lock the time register, allowing
+					// nanoseconds to be read later (on next cycle). Two step process used to 
+					// save CPU time here, as each read can take 2usec or more.
+					timeSec = getGpsSecTsync();
 				}
 #ifdef IOP_TIME_SLAVE_RFM
 	  timeSec = ((volatile long *)(cdsPciModules.pci_rfm[0]))[1];
@@ -1853,6 +1876,15 @@ udelay(1000);
                 duotoneMeanDac = duotoneTotalDac/CYCLE_PER_SECOND;
                 duotoneTotalDac = 0.0;
         }
+	if(clock16K == 1)
+	{
+	        if(cdsPciModules.gpsType == TSYNC_RCVR)
+	        {
+	                gps_receiver_locked = getGpsuSecTsync(&usec);
+	                pLocalEpics->epicsOutput.diags[FE_DIAGS_IRIGB_TIME] = usec;
+	                if((usec > 20) || (usec < 5)) diagWord |= 0x10;;
+	        }
+        }
         duotoneDac[(clock16K + 6) % CYCLE_PER_SECOND] = dWord[0][30];
         duotoneTotalDac += dWord[0][30];
         duotone[(clock16K + 6) % CYCLE_PER_SECOND] = dWord[0][31];
@@ -2705,7 +2737,7 @@ int main(int argc, char **argv)
 					cdsPciModules.cDio6464lCount ++;
 					cdsPciModules.pci_do[kk] = ioMemData->ipc[ii];
 					cdsPciModules.doInstance[kk] = doCnt;
-					status ++;
+					status += 2;
 				}
 				if((cdsPciModules.cards_used[jj].type == CDO64) && 
 					(cdsPciModules.cards_used[jj].instance == doCnt))
@@ -2781,7 +2813,7 @@ int main(int argc, char **argv)
 	//cdsPciModules.dacCount = ioMemData->dacCount;
 #endif
 	printf("%d PCI cards found \n",status);
-	if(cards != status)
+	if(status < cards)
 	{
 		printf(" ERROR **** Did not find correct number of cards! Expected %d and Found %d\n",cards,status);
 		cardCountErr = 1;
diff --git a/src/fe/map.c b/src/fe/map.c
index 07fdbb456dcc6b49d1a882d5c5b8757c9f95edf4..2add2aa0d4518990e1f1980e6af459bd5aca5693 100644
--- a/src/fe/map.c
+++ b/src/fe/map.c
@@ -1527,6 +1527,7 @@ int mapTsyncGps(CDS_HARDWARE *pHardware, struct pci_dev *gpsdev)
   unsigned int days,hours,min,sec,msec,usec,nanosec,tsync;
   unsigned char *addr1;
   TSYNC_REGISTER *myTime;
+  void *TSYNC_FIFO;	// Pointer to board uP FIFO
 
   pedStatus = pci_enable_device(gpsdev);
   pci_read_config_dword(gpsdev, PCI_BASE_ADDRESS_0, &pci_io_addr);
@@ -1538,6 +1539,37 @@ int mapTsyncGps(CDS_HARDWARE *pHardware, struct pci_dev *gpsdev)
   pHardware->gps = addr1;
   pHardware->gpsType = TSYNC_RCVR;
 
+// Spectracom IRIG-B Card does not auto detect Year information from IRIG-B fanout unit
+// This section writes to the module uP CodeExp register to correct this.
+// Delays are required between code lines, as writing to FIFO is slow.
+// Sequence was determined by looking at manufacturer driver code.
+  TSYNC_FIFO = (void *)(addr1 + 384);
+  iowrite16(0x301,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x1000,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x72a,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x280,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x0,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x800,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x0,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x0,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x0,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0x500,TSYNC_FIFO);
+  udelay(1000);
+  iowrite16(0xd400,TSYNC_FIFO);
+  udelay(10000);
+  udelay(10000);
+  udelay(10000);
+// End Code exp setup
+
   myTime = (TSYNC_REGISTER *)addr1;
 for(ii=0;ii<2;ii++)
 {
@@ -1556,7 +1588,15 @@ for(ii=0;ii<2;ii++)
   tsync = (i>>31) & 1;
 
   i = myTime->BCD_SEC;
-  sec = i - 315964819;
+  if(i < 1000000000) 
+  {
+  	printk("TSYNC NOT receiving YEAR info, defaulting to by year patch\n");
+	pHardware->gpsOffset = 31190400 + 31536000;
+  } else {
+  	printk("TSYNC receiving YEAR info\n");
+	pHardware->gpsOffset = -315964800;
+  }
+  sec = i + pHardware->gpsOffset;
   i = myTime->BCD_SUB_SEC;
   printk("date = %d days %2d:%2d:%2d\n",days,hours,min,sec);
   usec = (i&0xf) + ((i>>4)&0xf) *10 + ((i>>8)&0xf) * 100;
diff --git a/src/include/drv/cdsHardware.h b/src/include/drv/cdsHardware.h
index 6a0ce08d9ce07a88e65a162ef68c1573af854805..9b4b8a79c4e9f0641fd1ede978929834662a0d7a 100644
--- a/src/include/drv/cdsHardware.h
+++ b/src/include/drv/cdsHardware.h
@@ -604,6 +604,7 @@ typedef struct CDS_HARDWARE{
 	unsigned char *buf;
 	volatile unsigned int *gps;	/* GPS card */
 	unsigned int gpsType;
+	int gpsOffset;
 	int dolphinCount;		/* the number of Dolphin cards we have  on the system */
 	volatile unsigned long *dolphin[2]; /* read and write Dolphin memory */