diff --git a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h
index 2683cfa6e82e0c97b25abdd85ad036b2039e6025..47833063a1730ccb1407ec89bb79a5d185afb26b 100644
--- a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h
+++ b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h
@@ -37,9 +37,9 @@
 #define MAX_FIRMWARE_BLOCK_SIZE_B     262144
 #define MAX_PRINTK_BUFFER_B             1024
 
-#define FRAME_LENGTH_COMPLEX_SAMPLES   76800
+// #define FRAME_LENGTH_COMPLEX_SAMPLES   76800
 // Buffer size per channel: FRAME_LENGTH_COMPLEX_SAMPLES+2048 smp/frame: LTE frame+tail, *4 (7.68*4 MsmpPS), *4 Bytes/smp
-#define ADAC_BUFFERSZ_PERCHAN_B  ((FRAME_LENGTH_COMPLEX_SAMPLES+2048)*4*4)
+#define ADAC_BUFFERSZ_PERCHAN_B  ((76800+2048)*4*4)
 
 #define BIGSHM_SIZE_PAGES ((( MAX_FIRMWARE_BLOCK_SIZE_B + \
                               MAX_PRINTK_BUFFER_B + \
@@ -305,6 +305,12 @@ typedef struct
 #define TEST_ADACLOOP_MASK  (1<<4)
 #define TEST_ADACLOOP_EN    (1<<4)
 
+typedef enum {
+  BW5,
+  BW10,
+  BW20
+} exmimo_bw_t;
+
 typedef struct
 {
   uint32_t multicard_syncmode;
diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c
new file mode 100644
index 0000000000000000000000000000000000000000..f3c3c734d4bee5615c629556c4a54f9b87899cde
--- /dev/null
+++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c
@@ -0,0 +1,64 @@
+#include "openair0_lib.h"
+#include "gain_control.h"
+//#define DEBUG_PHY
+#define min(a,b) (((a)<(b))?(a):(b))
+#define max(a,b) (((a)>(b))?(a):(b))
+
+void gain_control_all (unsigned int rx_power_fil_dB, unsigned int card) {
+  unsigned int ant;
+  for (ant=0;ant<4;ant++)
+    gain_control (rx_power_fil_dB,ant,card);
+}
+
+void gain_control (unsigned int rx_power_fil_dB, unsigned int ant, unsigned int card) {
+
+  exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
+  unsigned int rf_mode, rx_gain, LNA;
+
+    rx_gain = p_exmimo_config->rf.rx_gain[ant][0];
+    rf_mode = p_exmimo_config->rf.rf_mode[ant];
+    LNA = rf_mode & LNAGAINMASK;
+
+    // Gain control with hysterisis
+
+    if (rx_power_fil_dB < TARGET_RX_POWER_MIN) { //increase gain
+      switch (LNA) {
+      case LNAByp:
+	p_exmimo_config->rf.rf_mode[ant] = (rf_mode & (~LNAGAINMASK)) | LNAMed;
+	break;
+      case LNAMed:
+	p_exmimo_config->rf.rf_mode[ant] = (rf_mode & (~LNAGAINMASK)) | LNAMax;
+	break;
+      case LNAMax:
+	p_exmimo_config->rf.rx_gain[ant][0] = min(30,rx_gain+5);
+	break;
+      default:
+	break;
+      }
+    }
+    else if (rx_power_fil_dB > TARGET_RX_POWER_MAX) { //decrease gain
+      if (rx_gain==0) {
+	switch (LNA) {
+	case LNAMax:
+	  p_exmimo_config->rf.rf_mode[ant] = (rf_mode & (~LNAGAINMASK)) | LNAMed;
+	  break;
+	case LNAMed:
+	  p_exmimo_config->rf.rf_mode[ant] = (rf_mode & (~LNAGAINMASK)) | LNAByp;
+	  break;
+	case LNAByp:
+	  break;
+	default:
+	  break;
+	}
+      }
+      else {
+	p_exmimo_config->rf.rx_gain[ant][0] = max(0,(int)rx_gain-5);
+      }
+    }
+
+#ifdef DEBUG_PHY
+    LOG_D(PHY,"AGC for chain %d: rx_power_fil_dB=%d, rx_gain=%d, LNA=%d (1=Byp,2=Med,3=Max)\n",ant,rx_power_fil_dB,p_exmimo_config->rf.rx_gain[ant][0],(p_exmimo_config->rf.rf_mode&LNAGAINMASK)>>14);
+#endif //DEBUG_PHY
+}
+
+
diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h
new file mode 100644
index 0000000000000000000000000000000000000000..4667d5b0d6f0bc9d587e0af5fa078200c584f2d6
--- /dev/null
+++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h
@@ -0,0 +1,6 @@
+#define TARGET_RX_POWER 55		// Target digital power for the AGC
+#define TARGET_RX_POWER_MAX 55		// Maximum digital power for AGC
+#define TARGET_RX_POWER_MIN 50		// Minimum digital power for AGC
+
+void gain_control_all (unsigned int rx_power_fil_dB, unsigned int card);
+void gain_control (unsigned int rx_power_fil_dB, unsigned int ant, unsigned int card);
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc
index 76615b1a815dcd674e7821ad1ad00ddca15298f9..e52ba5895471ef2da1a3964d4008afd90449d5d4 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc
@@ -19,6 +19,8 @@ extern "C" {
 
 #define TRACE 1
 
+#define FRAME_LENGTH_COMPLEX_SAMPLES   76800
+
 static bool any_bad_argument(const octave_value_list &args)
 {
     octave_value v;
diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc
index 0a4042f92d12789457e26c6e68344994521f2041..578ef4b817f8cf1628b5ba27cdd445b1a90acca9 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc
+++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc
@@ -24,7 +24,7 @@ static bool any_bad_argument(const octave_value_list &args)
     if (args.length()!=3)
     {
         error(FCNNAME);
-        error("syntax: oarf_send_frame(card,sig,nbits)\n      card (starting from 0), sig is a 2D or 4D vector (depending on no. of antennas), nbits is number of bits to quantize the signal to.");
+        error("syntax: oarf_send_frame(card,sig,nbits)\n      card (starting from 0), sig is a 2D array (size depends on no. of antennas and resampling factor), nbits is number of bits to quantize the signal to.");
         return true;
     }
 
@@ -38,15 +38,16 @@ static bool any_bad_argument(const octave_value_list &args)
 
     v=args(1);
     printf("signal: R %d, C %d\n",v.rows(),v.columns());
-    return false;
 
     v=args(2);
-    if ((!v.is_real_scalar()) || (v.scalar_value()!=8) || (v.scalar_value()!=16))
+    if ((!v.is_real_scalar()) && (v.scalar_value()!=8) && (v.scalar_value()!=16))
     {
         error(FCNNAME);
         error("nbits must be either 8 (CBMIMO) or 16 (ExpressMIMO)bits.");
         return true;
     }
+
+    return false;
 }
 
 
@@ -60,9 +61,8 @@ DEFUN_DLD (oarf_send_frame, args, nargout,"Send frame")
 
     octave_value returnvalue;
     int i, ret;
-    unsigned int length,aa,nbits, numcols;
+    unsigned int length,aa,nbits,numcols;
     unsigned int resampling_factor[4];
-    int dummy=0;
 
     ret = openair0_open();
     if ( ret != 0 )
@@ -84,17 +84,19 @@ DEFUN_DLD (oarf_send_frame, args, nargout,"Send frame")
     
     numcols = args(1).columns();
     
-    printf("colums = %d, rows = %d\n\n\n", numcols, args(1).rows());
+    //printf("colums = %d, rows = %d\n\n\n", numcols, args(1).rows());
 
     if ( numcols<1 || (numcols > openair0_num_antennas[card]))
     {
         error(FCNNAME);
-        error("input array must be of column size 1..%d.", openair0_num_antennas[card]);
+        error("input array must be of column size %d.", openair0_num_antennas[card]);
         return octave_value_list();
     }
     
-    for (i=0;i<4;i++)
+    for (i=0;i<4;i++) {
       resampling_factor[i] = (openair0_exmimo_pci[card].exmimo_config_ptr)->framing.resampling_factor[i];
+      printf("card %d, ant %d, resampling %d\n",card,i,resampling_factor[i]);
+    }
     
     for (i=0;i<numcols;i++){
     if (args(1).rows()<(76800*(1 << (2-resampling_factor[i]))))
@@ -117,8 +119,7 @@ DEFUN_DLD (oarf_send_frame, args, nargout,"Send frame")
         {
             for (i=0;i<(76800*(1 << (2-resampling_factor[aa])));i++)
             {
-                if (i<64)
-                    printf("%d: %d,%d\n",i,(short)real(dx(i,aa)),(short)imag(dx(i,aa)));
+	      //if (i<64) printf("%d: %d,%d\n",i,(short)real(dx(i,aa)),(short)imag(dx(i,aa)));
                 ((short*) openair0_exmimo_pci[card].dac_head[aa])[2*i]     = (short)(real(dx(i,aa))); 
                 ((short*) openair0_exmimo_pci[card].dac_head[aa])[1+(2*i)] = (short)(imag(dx(i,aa)));
             }
@@ -127,8 +128,7 @@ DEFUN_DLD (oarf_send_frame, args, nargout,"Send frame")
         {
             for (i=0;i<(76800*(1 << (2-resampling_factor[aa])));i++)
             {
-                if (i<64)
-                    printf("%d: %d,%d\n",i,char(real(dx(i,aa))),char(imag(dx(i,aa))));
+	      //if (i<64) printf("%d: %d,%d\n",i,char(real(dx(i,aa))),char(imag(dx(i,aa))));
                 ((char*) openair0_exmimo_pci[card].dac_head[aa])[2*i]     = char(real(dx(i,aa))); 
                 ((char*) openair0_exmimo_pci[card].dac_head[aa])[1+(2*i)] = char(imag(dx(i,aa)));
             }
diff --git a/targets/RTAI/USER/.runinfo b/targets/RTAI/USER/.runinfo
index c4fc777b3dc7b0c81224d31d80dda640fe6bee7f..f61c16eabfad9150e8a80d53cbbd6f7dc6cf2c6f 100644
--- a/targets/RTAI/USER/.runinfo
+++ b/targets/RTAI/USER/.runinfo
@@ -1,4 +1,5 @@
-synctest:lxrt+sem+mbx+msg+fifos:!./synctest ;sleep 1;popall:control_c
+sleeptest:lxrt+sem+mbx+msg+fifos:!./sleeptest;sleep 1;popall:control_c
+synctest:lxrt+sem+mbx+msg+fifos:!./synctest -V;sleep 1;popall:control_c
 condtest:lxrt+sem+mbx+msg+fifos:!sudo ./condtest;sleep 1;popall:control_c
 msg_test:lxrt+sem+mbx+msg+fifos:!sudo ./msg_test;sleep 1;popall:control_c
 msg_many:lxrt+sem+mbx+msg+fifos:!sudo ./msg_test;sleep 1;popall:control_c
@@ -11,6 +12,9 @@ UE:lxrt+sem+mbx+msg+fifos:!sudo ./synctest -U -d -T 108;sleep 1;popall:control_c
 UE0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907600480 -V -K /tmp/itti_UE0.log;sleep 1;popall:control_c
 #EXMIMO2 card 5 
 #UE0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907597240 -V;sleep 1;popall:control_c
+#EXMIMO2 card 24
+#UE0_smbv:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907595776 -V;sleep 1;popall:control_c
+#EXMIMO2 card 5?
 UE0_smbv:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907598252 -V;sleep 1;popall:control_c
 UE850:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 859498000 -F ex2_850;sleep 1;popall:control_c
 eNB850:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -d -C 859500000 -F ex2_850;sleep 1;popall:control_c
@@ -27,10 +31,11 @@ UE2prach:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907600000 -F ue2
 UE2noL2:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907600000 -F ue2 --no-L2-connect;sleep 1;popall:control_c
 #eNB0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -C 1907600000 -d -V;sleep 1;popall:control_c
 #eNB0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -C 1907598252 -d -V;sleep 1;popall:control_c
-eNB0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -d -O../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.pft.sud.conf -V -K /tmp/itti_eNB0.log;sleep 1;popall:control_ceNB1:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -C 1907600000 -F ex2_2 -d;sleep 1;popall:control_c
+eNB0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -d -O../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf -V -K /tmp/itti_eNB0.log;sleep 1;popall:control_c
+eNB1:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -C 1907600000 -F ex2_2 -d;sleep 1;popall:control_c
 eNB2:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -C 1907600000 -F ue2 -d;sleep 1;popall:control_c
 dot11:lxrt+sem+mbx+msg+fifos:!sudo ./dot11 -C 1907600000 -d;sleep 1;popall:control_c
 dot11_tx_test: lxrt+sem+mbx+msg+fifos:!sudo ./dot11 -C 1907600000 -d -t;sleep 1;popall:control_c
 eNB2_750:lxrt+sem+mbx+msg+fifos:!sudo ./synctest_eNB -C 746000000 -F enb1tx_750 -d;sleep 1;popall:control_c
 eNB2_1900:lxrt+sem+mbx+msg+fifos:!sudo ./synctest_eNB -C 19076000000 -F enb1tx_1900 -d;sleep 1;popall:control_c
-emos-raw:lxrt+sem+mbx+msg+fifos:!sudo ./emos-raw -C 1907600000;sleep 1;popall:control_c
+emos-raw:lxrt+sem+mbx+msg+fifos:!sudo ./emos-raw -d -V;sleep 1;popall:control_c
diff --git a/targets/RTAI/USER/Makefile b/targets/RTAI/USER/Makefile
index d4c3fa4e40cd5da32f2407c16beda37e5682b69f..7191a4ee3359c184efb885df3dd2492e30838226 100644
--- a/targets/RTAI/USER/Makefile
+++ b/targets/RTAI/USER/Makefile
@@ -17,7 +17,7 @@ ifeq "$(GCCVERSION)" "4.6.1"
     CFLAGS += -Wno-packed-bitfield-compat
 endif
 
-CFLAGS += -O2
+CFLAGS += -O2 
 CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
 ifdef DEBUG
 CFLAGS += -g -ggdb
@@ -42,32 +42,22 @@ CFLAGS += -DCONFIG_RTAI_LXRT_INLINE  #remend the RTAI warning
 RTAI_OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o rt_wrapper.o 
 ifeq ($(USRP),1)
 RTAI_OBJ += lte-softmodem-usrp.o
-else
-# RTAI_OBJ += lte-softmodem.o
-# RTAI_OBJ += lte-enb.o
-# RTAI_OBJ += lte-softmodem-enb.o
-# RTAI_OBJ += lte-softmodem-ue.o
 endif
-else
+else #RTAI
+CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
 OBJ += sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o rt_wrapper.o
 ifeq ($(USRP),1)
 OBJ += lte-softmodem-usrp.o
-else
-# OBJ += lte-softmodem.o
-# OBJ += lte-enb.o
-# OBJ += lte-softmodem-enb.o
-# OBJ += lte-softmodem-ue.o
 endif
-CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
 endif
 
-OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o #$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o
+OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o #$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o 
 
 ifeq ($(USRP),1)
 include $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/Makefile.inc
 endif
 
-OBJ += $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o
+OBJ += $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o
 CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
 
 TOP_DIR = $(OPENAIR1_DIR)
@@ -156,7 +146,7 @@ CFLAGS += -DHARD_RT
 endif
 
 ifeq ($(EMOS),1)
-CFLAGS += -DEMOS #-DEMOS_CHANNEL
+CFLAGS += -D_FILE_OFFSET_BITS=64 -DEMOS #-DEMOS_CHANNEL
 LDFLAGS += -lgps
 endif
 
@@ -165,9 +155,9 @@ CFLAGS += -DNAS_NETLINK -DLINUX
 OBJ += $(NAS_OBJS)
 endif
 
-RTAI_CFLAGS += $(shell rtai-config --lxrt-cflags) -DRTAI
 LDFLAGS += -lpthread -lm -lforms -lconfig 
 ifeq ($(RTAI),1)
+RTAI_CFLAGS += $(shell rtai-config --lxrt-cflags) -DRTAI
 LDFLAGS += $(shell rtai-config --lxrt-ldflags)
 ifdef ENABLE_ITTI
 LDFLAGS += -lrt
@@ -221,6 +211,7 @@ $(OBJ) $(ASN1_MSG_OBJS1): %.o : %.c
 else
 $(OBJ) $(ASN1_MSG_OBJS1) lte-enb.o lte-softmodem.o: %.o : %.c
 endif
+
 	@echo Compiling $< ...
 	@$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -o $@ $<
 	@$(CC) -MM $(CFLAGS) $(EXTRA_CFLAGS) $< > $*.d
@@ -230,6 +221,11 @@ endif
 	sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
 	@rm -f $*.d.tmp
 
+OBJ_EMOS = $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o rt_wrapper.o $(OPENAIR2_DIR)/UTIL/LOG/log.o $(OPENAIR2_DIR)/UTIL/LOG/vcd_signal_dumper.o $(OPENAIR1_DIR)/PHY/TOOLS/signal_energy.o $(OPENAIR1_DIR)/PHY/TOOLS/dB_routines.o
+ifeq ($(XFORMS),1)
+OBJ_EMOS+=lte_scope.o
+endif
+
 $(USRP_OBJ):$(USRP_FILE_OBJ)
 	@echo Compiling openair_usrp.cpp
 	@$(CXX) -c $(USRP_CFLAGS) $(USRP_FILE_OBJ) -o $(USRP_OBJ)
@@ -238,7 +234,10 @@ condtest: condtest.c
 	$(CC) $(CFLAGS) $(LDFLAGS) condtest.c -o condtest
 
 synctest: $(OBJ_SYNC) $(SHARED_DEPENDENCIES) synctest.c
-	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_EMOS) -o synctest synctest.c $(LDFLAGS) $(LIBS)
+	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_SYNC) -o synctest synctest.c $(LDFLAGS) $(LIBS)
+
+sleeptest: rt_wrapper.o sleeptest.c
+	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) rt_wrapper.o -o sleeptest sleeptest.c $(LDFLAGS) 
 
 lte-softmodem: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-softmodem.o $(SHARED_DEPENDENCIES)
 	@echo Linking $@
@@ -252,7 +251,6 @@ lte-softmodem-usrp: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(USRP_OBJ) $(SHARED_DE
 	@echo Linking $@
 	@$(CC) $(USRP_OBJ) $(CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) -o lte-softmodem-usrp $(LDFLAGS) $(LIBS)
 
-OBJ_EMOS = $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o rt_wrapper.o $(OPENAIR2_DIR)/UTIL/LOG/log.o $(OPENAIR2_DIR)/UTIL/LOG/vcd_signal_dumper.o
 emos-raw: $(SHARED_DEPENDENCIES) $(OBJ_EMOS) emos-raw.c
 	@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_EMOS) -o emos-raw emos-raw.c $(LDFLAGS) $(LIBS)
 
@@ -336,10 +334,11 @@ run_eNB2:
 	rtai-load eNB2 --verbose
 
 clean: common-clean
-	@$(RM_F_V) $(OBJ) $(RTAI_OBJ)
-	@$(RM_F_V) $(OBJ:.o=.d) $(RTAI_OBJ:.o=.d)
+	@$(RM_F_V) $(OBJ) $(RTAI_OBJ) $(OBJ_EMOS) $(OBJ_SYNC)
+	@$(RM_F_V) $(OBJ:.o=.d) $(RTAI_OBJ:.o=.d) $(OBJ_EMOS:.o=.d) $(OBJ_SYNC:.o=.d)
 	@$(RM_F_V) $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1_msg.o $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1_msg.d
 	@$(RM_F_V) lte-enb.o lte-enb.d lte-softmodem.o lte-softmodem.d
+	@$(RM_F_V) lte-enb.o lte-softmodem.o
 
 cleanasn1:
 	rm -f $(ASN1_MSG_OBJS1)
diff --git a/targets/RTAI/USER/emos-raw.c b/targets/RTAI/USER/emos-raw.c
index d003b874b562dfa4985f3cfea371662c9e6084c2..9347df25e724c1c79ad2996761ff7414ea424951 100644
--- a/targets/RTAI/USER/emos-raw.c
+++ b/targets/RTAI/USER/emos-raw.c
@@ -54,12 +54,14 @@
 #include "rt_wrapper.h"
 
 #include "PHY/types.h"
-//#include "PHY/defs.h"
+#include "PHY/TOOLS/defs.h"
 #include "openair0_lib.h"
 
 #include "UTIL/LOG/log.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
+#include "gain_control.h"
+
 #if defined(ENABLE_ITTI)
 # include "intertask_interface_init.h"
 # include "timer.h"
@@ -69,7 +71,11 @@
 # endif
 #endif
 
+#define OPENAIR_THREAD_PRIORITY       255
+#define OPENAIR_THREAD_STACK_SIZE    8192 
+
 #ifdef XFORMS
+/*
 #include "PHY/TOOLS/lte_phy_scope.h"
 #include "stats.h"
 // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
@@ -79,15 +85,22 @@ FD_lte_phy_scope_enb *form_enb[NUMBER_OF_UE_MAX];
 FD_stats_form *form_stats=NULL;
 char title[255];
 unsigned char scope_enb_num_ue = 1;
+*/
+#include "lte_scope.h"
+FD_lte_scope *form_lte;
+char title[255];
 #endif //XFORMS
 
 #ifdef EMOS
 #include <gps.h>
+#ifdef RTAI
 #include <rtai_fifos.h>
+#endif
 
-//#define CHANSOUNDER_FIFO_SIZE 10485760 // 10 Mbytes FIFO
-//#define CHANSOUNDER_FIFO_SIZE 20971520  // 20 Mbytes FIFO
-#define CHANSOUNDER_FIFO_SIZE 104857600 // 100 Mbytes FIFO
+//#define CHANSOUNDER_FIFO_SIZE 10485760  //  10 Mbytes FIFO
+#define CHANSOUNDER_FIFO_SIZE 20971520  //  20 Mbytes FIFO
+//#define CHANSOUNDER_FIFO_SIZE 52428800  //  50 Mbytes FIFO
+//#define CHANSOUNDER_FIFO_SIZE 104857600 // 100 Mbytes FIFO
 #define CHANSOUNDER_FIFO_MINOR 4               // minor of the FIFO device - this is /dev/rtf3
 #define CHANSOUNDER_FIFO_DEV "/dev/rtf4"
 #endif
@@ -95,17 +108,18 @@ unsigned char scope_enb_num_ue = 1;
 #define FRAME_PERIOD 100000000ULL
 #define DAQ_PERIOD 66667ULL
 #define LTE_SLOTS_PER_FRAME  20
-#define RESAMPLING_FACTOR 0
-#define SAMPLES_PER_SLOT (15360/(1<<RESAMPLING_FACTOR))
+//#define RESAMPLING_FACTOR 0
+#define SAMPLES_PER_SLOT 15360
+#define FRAME_LENGTH_COMPLEX_SAMPLES (SAMPLES_PER_SLOT*LTE_SLOTS_PER_FRAME)
 #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
 
 #ifdef RTAI
 static SEM *mutex;
 //static CND *cond;
 
-static int thread0;
-static int thread1;
-//static int sync_thread;
+static long int thread0;
+static long int thread1;
+//static long int sync_thread;
 #else
 pthread_t thread0;
 //pthread_t thread1;
@@ -115,6 +129,7 @@ struct sched_param sched_param_dlsch;
 
 pthread_t  thread2; //xforms
 pthread_t  thread3; //emos
+pthread_t  thread4; //GPS
 
 /*
 static int instance_cnt=-1; //0 means worker is busy, -1 means its free
@@ -124,7 +139,7 @@ int pci_interface_ptr_kern;
 //extern unsigned int bigphys_top;
 //extern unsigned int mem_base;
 
-int card = 0;
+int number_of_cards = 1;
 exmimo_config_t *p_exmimo_config;
 exmimo_id_t     *p_exmimo_id;
 volatile unsigned int *DAQ_MBOX;
@@ -139,10 +154,14 @@ int fs4_test=0;
 char UE_flag=0;
 u8  eNB_id=0,UE_id=0;
 
-u32 carrier_freq[4]= {1907600000,1907600000,1907600000,1907600000};
+//u32 carrier_freq[4]= {1907600000,1907600000,1907600000,1907600000};
+u32      carrier_freq[MAX_CARDS][4] = {{2590000000,0,0,0},{2605000000,2605000000,0,0},{0,0,0,0},{0,0,0,0}};
+exmimo_bw_t bandwidth[MAX_CARDS]    = {BW20,BW10,BW5,BW5};
 char *conf_config_file_name = NULL;
 
 unsigned int lost_bytes=0;
+int rssi_lin,rssi_lin_avg;
+u8 rssi_avg_dB; 
 
 struct timing_info_t {
   //unsigned int frame, hw_slot, last_slot, next_slot;
@@ -161,7 +180,6 @@ extern int otg_enabled;
 #else
 int otg_enabled;
 #endif
-int number_of_cards = 1;
 
 int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
 //int mbox_bounds[20] = {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
@@ -219,12 +237,18 @@ void exit_fun(const char* s)
 }
 
 #ifdef XFORMS
+extern void ia_receiver_on_off( FL_OBJECT * form, long arg) {}
+
+
 void *scope_thread(void *arg) {
-    s16 prach_corr[1024], i;
+    s16 prach_corr[1024];
     char stats_buffer[16384];
     //FILE *UE_stats, *eNB_stats;
-    int len=0;
+    int i,len=0;
+    float rxsig_t_dB[4][FRAME_LENGTH_COMPLEX_SAMPLES];
+    float time[FRAME_LENGTH_COMPLEX_SAMPLES];
     struct sched_param sched_param;
+    int card,ant,idx;
 
     sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1; 
     sched_setscheduler(0, SCHED_FIFO,&sched_param);
@@ -239,6 +263,7 @@ void *scope_thread(void *arg) {
     */
     
     while (!oai_exit) {
+      /*
         if (UE_flag==1) {
             len = dump_ue_stats (PHY_vars_UE_g[0], stats_buffer, 0, mode,rx_input_level_dBm);
             fl_set_object_label(form_stats->stats_text, stats_buffer);
@@ -262,8 +287,28 @@ void *scope_thread(void *arg) {
             }
               
         }
-        //printf("doing forms\n");
-        usleep(100000); // 100 ms
+      */
+
+      idx = 0;
+      for (card=0;card<number_of_cards;card++) {
+	for (ant=0;ant<4;ant++) {
+	  if (carrier_freq[card][ant] != 0) {
+	    len = FRAME_LENGTH_COMPLEX_SAMPLES/(1<<openair0_exmimo_pci[card].exmimo_config_ptr->framing.resampling_factor[ant]);
+	    for (i=0; i<len; i++) {
+	      //rxsig_t_dB[0][i] = 10*log10(1.0+(float) ((((s16*) openair0_exmimo_pci[card].adc_head[0])[2*i])*(((s16*) openair0_exmimo_pci[card].adc_head[0])[2*i])+(((s16*) openair0_exmimo_pci[card].adc_head[0])[2*i+1])*(((s16*) openair0_exmimo_pci[card].adc_head[0])[2*i+1])));
+	      rxsig_t_dB[0][i] = (float) ((((s16*) openair0_exmimo_pci[card].adc_head[ant])[2*i]));
+	      rxsig_t_dB[1][i] = (float) ((((s16*) openair0_exmimo_pci[card].adc_head[ant])[2*i+1]));
+	      time[i] = (float) i;
+	    }
+	    fl_set_xyplot_data(form_lte->channel_t_re[idx],time,rxsig_t_dB[0],len,"","","");
+	    fl_set_xyplot_data(form_lte->channel_t_im[idx],time,rxsig_t_dB[1],len,"","","");
+	    idx++;
+	  }
+	}
+      }
+      
+      //printf("doing forms\n");
+      usleep(100000);
     }
     
     //fclose (UE_stats);
@@ -279,38 +324,20 @@ int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
 #define NO_ESTIMATES_DISK 20 //No. of estimates that are aquired before dumped to disk
 int channel_buffer_size =  SAMPLES_PER_SLOT*4; //one slot, 4 byte per sample
 
-
-void *emos_thread (void *arg)
+void* gps_thread (void *arg)
 {
-  char c;
-  char *fifo2file_buffer, *fifo2file_ptr;
-
-  int fifo, counter=0, bytes;
-  long long unsigned int total_bytes=0;
-
-  FILE  *dumpfile_id;
-  char  dumpfile_name[1024];
-  time_t starttime_tmp;
-  struct tm starttime;
-  
-  time_t timer;
-  struct tm *now;
 
   struct gps_data_t *gps_data = NULL;
   struct gps_fix_t dummy_gps_data;
-
   struct sched_param sched_param;
   int ret;
-  
-  sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; 
+
+  sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1; 
   sched_setscheduler(0, SCHED_FIFO,&sched_param);
   
-  printf("EMOS thread has priority %d\n",sched_param.sched_priority);
- 
-  timer = time(NULL);
-  now = localtime(&timer);
+  printf("GPS thread has priority %d\n",sched_param.sched_priority);
 
-  memset(&dummy_gps_data,1,sizeof(struct gps_fix_t));
+  memset(&dummy_gps_data,0,sizeof(struct gps_fix_t));
   
 #if GPSD_API_MAJOR_VERSION>=5
   ret = gps_open("127.0.0.1","2947",gps_data);
@@ -321,7 +348,7 @@ void *emos_thread (void *arg)
 #endif
     {
       printf("[EMOS] Could not open GPS\n");
-      //exit(-1);
+      pthread_exit((void*)arg);
     }
 #if GPSD_API_MAJOR_VERSION>=4
   else if (gps_stream(gps_data, WATCH_ENABLE,NULL) != 0)
@@ -329,13 +356,67 @@ void *emos_thread (void *arg)
   else if (gps_query(gps_data, "w+x") != 0)
 #endif
     {
-      //sprintf(tmptxt,"Error sending command to GPS, gps_data = %x", gps_data);
       printf("[EMOS] Error sending command to GPS\n");
-      //exit(-1);
+      pthread_exit((void*) arg);
     }
   else 
     printf("[EMOS] Opened GPS, gps_data=%p\n", gps_data);
   
+
+  while (!oai_exit)
+    {
+      printf("[EMOS] polling data from gps\n");
+#if GPSD_API_MAJOR_VERSION>=5
+      if (gps_waiting(gps_data,500)) {
+	if (gps_read(gps_data) != 0) {
+#else
+      if (gps_waiting(gps_data)) {
+	if (gps_poll(gps_data) != 0) {
+#endif
+	  printf("[EMOS] problem polling data from gps\n");
+	}
+	else {
+	  memcpy(&dummy_gps_data,gps_data,sizeof(struct gps_fix_t));
+	  printf("[EMOS] lat %g, lon %g\n",gps_data->fix.latitude,gps_data->fix.longitude);
+	}
+      } //gps_waiting
+      else {
+	printf("[EMOS] WARNING: No GPS data available, storing dummy packet\n");
+      }
+      rt_sleep_ns(1000000000LL);
+    } //oai_exit
+
+  pthread_exit((void*) arg);
+
+}
+
+void *emos_thread (void *arg)
+{
+  char c;
+  char *fifo2file_buffer, *fifo2file_ptr;
+
+  int fifo, counter=0, bytes;
+  long long unsigned int total_bytes=0;
+
+  FILE  *dumpfile_id;
+  char  dumpfile_name[1024];
+  time_t starttime_tmp;
+  struct tm starttime;
+  
+  time_t timer;
+  struct tm *now;
+
+  struct sched_param sched_param;
+  int ret;
+  
+  sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; 
+  sched_setscheduler(0, SCHED_FIFO,&sched_param);
+  
+  printf("EMOS thread has priority %d\n",sched_param.sched_priority);
+ 
+  timer = time(NULL);
+  now = localtime(&timer);
+
   /*
   if (UE_flag==0)
     channel_buffer_size = sizeof(fifo_dump_emos_eNB);
@@ -403,36 +484,15 @@ void *emos_thread (void *arg)
               fprintf(stderr, "[EMOS] Error writing to dumpfile\n");
               exit(EXIT_FAILURE);
             }
-	  /*
-	  if (gps_data)
-	    {
-	      if (gps_poll(gps_data) != 0) {
-		printf("[EMOS] problem polling data from gps\n");
-	      }
-	      else {
-		printf("[EMOS] lat %g, lon %g\n",gps_data->fix.latitude,gps_data->fix.longitude);
-	      }
-	      if (fwrite(&(gps_data->fix), sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t))
-		{
-		  printf("[EMOS] Error writing to dumpfile, stopping recording\n");
-		  exit(EXIT_FAILURE);
-		}
-	    }
-	  else
-	    {
-	      printf("[EMOS] WARNING: No GPS data available, storing dummy packet\n");
-	      if (fwrite(&(dummy_gps_data), sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t))
-		{
-		  printf("[EMOS] Error writing to dumpfile, stopping recording\n");
-		  exit(EXIT_FAILURE);
-		}
-	    } 
-	  */
+	  
         }
+
       if ((counter%2000)==0) {
 	time(&starttime_tmp);
 	localtime_r(&starttime_tmp,&starttime);
 	printf("[EMOS] %02d:%02d:%02d, frame %d, total bytes wrote %llu, bytes lost %d\n", starttime.tm_hour, starttime.tm_min, starttime.tm_sec, counter/20, total_bytes,lost_bytes);
+	printf("[EMOS] %02d:%02d:%02d, frame %d, rssi_lin %d, rssi_lin_avg %d, rssi_avg_dB %d, rx_gain %d, LNA %d\n", starttime.tm_hour, starttime.tm_min, starttime.tm_sec, counter/20, rssi_lin, rssi_lin_avg, rssi_avg_dB, p_exmimo_config->rf.rx_gain[0][0], (p_exmimo_config->rf.rf_mode[0] & LNAGAINMASK) >> 14);
+	//printf("[EMOS] %02d:%02d:%02d, frame %d, GPS time %e, GPS mode %d, lat %e, lon %e, alt %e, speed %e\n", starttime.tm_hour, starttime.tm_min, starttime.tm_sec, counter/20, dummy_gps_data.time, dummy_gps_data.mode, dummy_gps_data.latitude, dummy_gps_data.longitude, dummy_gps_data.altitude, dummy_gps_data.speed);
       }
     }
   
@@ -462,6 +522,9 @@ static void *eNB_thread(void *arg)
   int i,ret;
   int tx_offset;
   int bytes;
+  long long int k1=1000;
+  long long int k2=1024-k1;
+  int len,card = 0;
 
 #ifdef RTAI
   task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF);
@@ -557,7 +620,22 @@ static void *eNB_thread(void *arg)
 	  }
 	  
 	  timing_info.n_samples++;
-	  
+
+	  // do measurements for rssi
+	  if (last_slot==0) {
+	    for (card=0;card<number_of_cards;card++) {
+	      len = SAMPLES_PER_SLOT/(1<<openair0_exmimo_pci[card].exmimo_config_ptr->framing.resampling_factor[0]);
+	      rssi_lin = signal_energy(&(((s32*) openair0_exmimo_pci[card].adc_head[0])[last_slot*len]), len);
+	      rssi_lin_avg = (int) ((k1*((long long int)(rssi_lin_avg)) + (k2*((long long int)(rssi_lin))))>>10);
+	      rssi_avg_dB = dB_fixed(rssi_lin_avg);
+	      if (frame%100==0) {
+		gain_control_all(rssi_avg_dB,card);
+		printf("AGC for card %d: rx_power_fil_dB=%d, rx_gain=%d, LNA=%d (1=Byp,2=Med,3=Max)\n",card,rssi_avg_dB,openair0_exmimo_pci[card].exmimo_config_ptr->rf.rx_gain[0][0],(openair0_exmimo_pci[card].exmimo_config_ptr->rf.rf_mode[0]&LNAGAINMASK)>>14);
+	      }
+	    }
+	  }
+
+#ifdef EMOS	  
 	  // save raw samples here
 	  /*
 	  bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &(((s32*) openair0_exmimo_pci[card].adc_head[0])[last_slot*SAMPLES_PER_SLOT]), channel_buffer_size/2);
@@ -579,6 +657,7 @@ static void *eNB_thread(void *arg)
 		    frame, last_slot, bytes);
 	    }
 	  }
+#endif
 	}
 
       slot++;
@@ -613,8 +692,9 @@ int main(int argc, char **argv) {
 #endif
   int i,j,aa;
   void *status;
+  int card = 0;
 
-  u32 rf_mode_base   = TXLPFNORM + TXLPFEN + TXLPF10 + RXLPFNORM + RXLPFEN + RXLPF10 + LNA1ON +LNAMax + RFBBNORM;
+  u32 rf_mode_base   = TXLPFNORM + TXLPFEN  + RXLPFNORM + RXLPFEN + LNA1ON +LNAMax + RFBBNORM;
   u32 rf_local[4]    = {8255000,8255000,8255000,8255000}; // UE zepto
     //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa
     //{8255067,8254810,8257340,8257340}; // eNB PETRONAS
@@ -681,10 +761,12 @@ int main(int argc, char **argv) {
           UE_flag = 1;
           break;
         case 'C':
-          carrier_freq[0] = atoi(optarg);
-          carrier_freq[1] = atoi(optarg);
-          carrier_freq[2] = atoi(optarg);
-          carrier_freq[3] = atoi(optarg);
+	  for (card=0;card<MAX_CARDS;card++) {
+	    carrier_freq[card][0] = atof(optarg);
+	    carrier_freq[card][1] = atof(optarg);
+	    carrier_freq[card][2] = atof(optarg);
+	    carrier_freq[card][3] = atof(optarg);
+	  }
           break;
         case 'S':
           fs4_test=1;
@@ -875,111 +957,134 @@ int main(int argc, char **argv) {
           return(ret);
      }
 
-  printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[card]);
+  number_of_cards = openair0_num_detected_cards;
+
+  for (card=0; card<number_of_cards; card++) {
+    printf ("Configuring card %d of %d (number of antennas %d).\n", card, openair0_num_detected_cards, openair0_num_antennas[card]);
   
-  p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
-  p_exmimo_id     = openair0_exmimo_pci[card].exmimo_id_ptr;
+    p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
+    p_exmimo_id     = openair0_exmimo_pci[card].exmimo_id_ptr;
   
-  printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);
+    printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);
 
-  if (p_exmimo_id->board_swrev>=BOARD_SWREV_CNTL2)
-    p_exmimo_config->framing.eNB_flag   = 0; 
-  else 
-    p_exmimo_config->framing.eNB_flag   = !UE_flag;
+    if (p_exmimo_id->board_swrev>=BOARD_SWREV_CNTL2)
+      p_exmimo_config->framing.eNB_flag   = 0; 
+    else 
+      p_exmimo_config->framing.eNB_flag   = !UE_flag;
 
-  p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
-  for (ant=0; ant<4; ant++) 
-    p_exmimo_config->framing.resampling_factor[ant] = RESAMPLING_FACTOR;
- 
-  /*
-  for (ant=0;ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant++) 
-    p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
-  for (ant=0;ant<frame_parms->nb_antennas_tx;ant++)
-    p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
-  for (ant=0;ant<frame_parms->nb_antennas_rx;ant++)
-    p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
-  for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) {
-    p_exmimo_config->rf.rf_mode[ant] = 0;
-    carrier_freq[ant] = 0; //this turns off all other LIMEs
-  }
-  */
+    //p_exmimo_config->framing.multicard_syncmode = SYNCMODE_FREE;
+    if (card==0) 
+      p_exmimo_config->framing.multicard_syncmode = SYNCMODE_MASTER;
+    else
+      p_exmimo_config->framing.multicard_syncmode = SYNCMODE_SLAVE;
 
-  ant_offset = 0;
-  for (ant=0; ant<4; ant++) {
-    if (ant==ant_offset) {
-      //if (1) {
+    p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_TESTRX; //TXRXSWITCH_LSB;
+ 
+    /*
+      for (ant=0;ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant++) 
       p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
-      //p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
+      for (ant=0;ant<frame_parms->nb_antennas_tx;ant++)
+      p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
+      for (ant=0;ant<frame_parms->nb_antennas_rx;ant++)
       p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
-    }
-    else {
+      for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) {
       p_exmimo_config->rf.rf_mode[ant] = 0;
       carrier_freq[ant] = 0; //this turns off all other LIMEs
-    }
-  }
-
-  for (ant = 0; ant<4; ant++) { 
-    p_exmimo_config->rf.do_autocal[ant] = 1;
-    p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant];
-    p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant];
-    p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant];
-    p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant];
-    
-    p_exmimo_config->rf.rf_local[ant]   = rf_local[ant];
-    p_exmimo_config->rf.rf_rxdc[ant]    = rf_rxdc[ant];
-
-    if ((carrier_freq[ant] >= 850000000) && (carrier_freq[ant] <= 865000000)) {
-      p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal_850[ant];
-      p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD;	    
-    }
-    else if ((carrier_freq[ant] >= 1900000000) && (carrier_freq[ant] <= 2000000000)) {
-      p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
-      p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD;	    
-    }
-    else {
-      p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
-      p_exmimo_config->rf.rffe_band_mode[ant] = 0;	    
-    }
-
-    p_exmimo_config->rf.rffe_gain_txlow[ant] = 31;
-    p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31;
-    p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52;
-    p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31;
-  }
-
-
-    number_of_cards = openair0_num_detected_cards;
-    /*
-    if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1
-      openair_daq_vars.timing_advance = 138;
-    else //ExpressMIMO2
-      openair_daq_vars.timing_advance = 0;
+      }
     */
 
-  openair0_dump_config(card);
-
-  printf("EXMIMO_CONFIG: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n",  
-	 p_exmimo_config->rf.rf_mode[0],
-	 p_exmimo_config->rf.rf_mode[1],
-	 p_exmimo_config->rf.rf_mode[2],
-	 p_exmimo_config->rf.rf_mode[3],
-	 (p_exmimo_config->rf.rf_mode[0]&3),  // RXen+TXen
-	 (p_exmimo_config->rf.rf_mode[0]&4)>>2,         //TXLPFen
-	 (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF
-	 (p_exmimo_config->rf.rf_mode[0]&128)>>7,      //RXLPFen
-	 (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF
-	 (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode
-	 (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode
-	 (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode
-	 (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode
-	 (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode
-	 p_exmimo_config->rf.rf_rxdc[0],
-	 p_exmimo_config->rf.rf_local[0],
-	 p_exmimo_config->rf.rf_vcocal[0]);
-  
-  for (ant=0;ant<4;ant++)
-    p_exmimo_config->rf.do_autocal[ant] = 0;
+    for (ant=0; ant<4; ant++) {
+      if (carrier_freq[card][ant] != 0) {
+	p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
+	switch (bandwidth[card]) {
+	case BW20:
+	  p_exmimo_config->framing.resampling_factor[ant] = 0;
+	  p_exmimo_config->rf.rf_mode[ant] += RXLPF10 + TXLPF10;
+	  break;
+	case BW10:
+	  p_exmimo_config->framing.resampling_factor[ant] = 1;
+	  p_exmimo_config->rf.rf_mode[ant] += RXLPF5 + TXLPF5;
+	  break;
+	case BW5: 
+	  p_exmimo_config->framing.resampling_factor[ant] = 2;
+	  p_exmimo_config->rf.rf_mode[ant] += RXLPF25 + TXLPF25;
+	  break;
+	}
+	//p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
+	p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
+      }
+      else {
+	p_exmimo_config->rf.rf_mode[ant] = 0;
+      }
+    }
 
+    for (ant = 0; ant<4; ant++) { 
+      p_exmimo_config->rf.do_autocal[ant] = 1;
+      p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[card][ant];
+      p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[card][ant];
+      p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant];
+      p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant];
+      
+      p_exmimo_config->rf.rf_local[ant]   = rf_local[ant];
+      p_exmimo_config->rf.rf_rxdc[ant]    = rf_rxdc[ant];
+      
+      if ((carrier_freq[card][ant] >= 850000000) && (carrier_freq[card][ant] <= 865000000)) {
+	p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal_850[ant];
+	p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD;	    
+      }
+      else if ((carrier_freq[card][ant] >= 1900000000) && (carrier_freq[card][ant] <= 2000000000)) {
+	p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
+	p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD;	    
+      }
+      else {
+	p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
+	p_exmimo_config->rf.rffe_band_mode[ant] = 0;	    
+      }
+      
+      p_exmimo_config->rf.rffe_gain_txlow[ant] = 31;
+      p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31;
+      p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52;
+      p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31;
+    }
+    
+    
+    openair0_dump_config(card);
+
+    printf("EXMIMO_CONFIG card %d: freq0..3 %u %u %u %u Hz, freqtx0..1 %u %u Hz, RX gain0..1 %d %d dB\n",  
+	   card,
+	   p_exmimo_config->rf.rf_freq_rx[0],
+	   p_exmimo_config->rf.rf_freq_rx[1],
+	   p_exmimo_config->rf.rf_freq_rx[2],
+	   p_exmimo_config->rf.rf_freq_rx[3],
+	   p_exmimo_config->rf.rf_freq_tx[0],
+	   p_exmimo_config->rf.rf_freq_tx[1],
+	   p_exmimo_config->rf.rx_gain[0][0],
+	   p_exmimo_config->rf.rx_gain[1][0]);
+    printf("EXMIMO_CONFIG card %d: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n", 
+	   card,
+	   p_exmimo_config->rf.rf_mode[0],
+	   p_exmimo_config->rf.rf_mode[1],
+	   p_exmimo_config->rf.rf_mode[2],
+	   p_exmimo_config->rf.rf_mode[3],
+	   (p_exmimo_config->rf.rf_mode[0]&3),  // RXen+TXen
+	   (p_exmimo_config->rf.rf_mode[0]&4)>>2,         //TXLPFen
+	   (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF
+	   (p_exmimo_config->rf.rf_mode[0]&128)>>7,      //RXLPFen
+	   (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF
+	   (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode
+	   (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode
+	   (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode
+	   (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode
+	   (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode
+	   p_exmimo_config->rf.rf_rxdc[0],
+	   p_exmimo_config->rf.rf_local[0],
+	   p_exmimo_config->rf.rf_vcocal[0]);
+    
+    for (ant=0;ant<4;ant++)
+      p_exmimo_config->rf.do_autocal[ant] = 0;
+  } //card
+  card=0;
+ 
 #ifdef EMOS
   error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE);
   if (error_code==0)
@@ -1022,12 +1127,14 @@ int main(int argc, char **argv) {
 
   // this starts the DMA transfers
   if (UE_flag!=1)
+    for (card=0;card<number_of_cards;card++)
       openair0_start_rt_acquisition(card);
 
 
 #ifdef XFORMS
   if (do_forms==1) {
       fl_initialize (&argc, argv, NULL, 0, 0);
+      /*
       form_stats = create_form_stats_form();
       if (UE_flag==1) {
           form_ue[UE_id] = create_lte_phy_scope_ue();
@@ -1063,6 +1170,9 @@ int main(int argc, char **argv) {
               fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
           }
       }
+      */
+      form_lte = create_form_lte_scope();
+      fl_show_form (form_lte->lte_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, "Scope");
 
       ret = pthread_create(&thread2, NULL, scope_thread, NULL);
       printf("Scope thread created, ret=%d\n",ret);
@@ -1072,6 +1182,8 @@ int main(int argc, char **argv) {
 #ifdef EMOS
   ret = pthread_create(&thread3, NULL, emos_thread, NULL);
   printf("EMOS thread created, ret=%d\n",ret);
+  ret = pthread_create(&thread4, NULL, gps_thread, NULL);
+  printf("GPS thread created, ret=%d\n",ret);
 #endif
 
   rt_sleep_ns(10*FRAME_PERIOD);
@@ -1140,6 +1252,7 @@ int main(int argc, char **argv) {
   if (do_forms==1)
     {
       pthread_join(thread2,&status);
+      /*
         fl_hide_form(form_stats->stats_form);
         fl_free_form(form_stats->stats_form);
         if (UE_flag==1) {
@@ -1151,6 +1264,9 @@ int main(int argc, char **argv) {
                 fl_free_form(form_enb[UE_id]->lte_phy_scope_enb);
             }
         }
+      */
+      fl_hide_form(form_lte->lte_scope);
+      fl_free_form(form_lte->lte_scope);
     }
 #endif
 
@@ -1189,7 +1305,8 @@ int main(int argc, char **argv) {
 #endif
 
   printf("stopping card\n");
-  openair0_stop(card);
+  for (card=0;card<number_of_cards;card++)
+    openair0_stop(card);
   printf("closing openair0_lib\n");
   openair0_close();
 
@@ -1197,6 +1314,9 @@ int main(int argc, char **argv) {
   printf("waiting for EMOS thread\n");
   pthread_cancel(thread3);
   pthread_join(thread3,&status);
+  printf("waiting for GPS thread\n");
+  pthread_cancel(thread4);
+  pthread_join(thread4,&status);
 #endif
 
 #ifdef EMOS
diff --git a/targets/RTAI/USER/lte_scope.c b/targets/RTAI/USER/lte_scope.c
index 2e0970720de9408f7f5ed6fdc9a9b461856a8363..92168e566d36abff5c16e640e6b97042252710bf 100644
--- a/targets/RTAI/USER/lte_scope.c
+++ b/targets/RTAI/USER/lte_scope.c
@@ -21,27 +21,38 @@ create_form_lte_scope( void )
     obj = fl_add_box( FL_ROUNDED_BOX, 0, 0, 780, 723, "" );
     fl_set_object_color( obj, FL_BLACK, FL_BLUE );
 
-    fdui->channel_t_re = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 280, 100, "Received Signal (Time-Domain, dB)" );
+    fdui->channel_t_re[0] = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 280, 100, "Real(RX0)" );
     fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
     fl_set_object_color( obj, FL_BLACK, FL_BLUE );
     fl_set_object_lcolor( obj, FL_WHITE );
 
-    fdui->scatter_plot = obj = fl_add_xyplot( FL_POINTS_XYPLOT, 600, 230, 160, 190, "PBCH Scatter Plot" );
+    fdui->channel_t_im[0] = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 310, 20, 280, 100, "Imag(RX0)" );
     fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
-    fl_set_object_color( obj, FL_BLACK, FL_GREEN );
+    fl_set_object_color( obj, FL_BLACK, FL_BLUE );
     fl_set_object_lcolor( obj, FL_WHITE );
 
-    fdui->channel_f = obj = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 570, 90, "Frequency Domain Channel Estimate" );
+    fdui->channel_t_re[1] = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 140, 280, 100, "Real(RX1)" );
     fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
     fl_set_object_color( obj, FL_BLACK, FL_RED );
     fl_set_object_lcolor( obj, FL_WHITE );
 
-    fdui->channel_t_im = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 310, 20, 280, 100, "Time-Domain Channel Estimate" );
+    fdui->channel_t_im[1] = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 310, 140, 280, 100, "Imag(RX1)" );
     fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
-    fl_set_object_color( obj, FL_BLACK, FL_BLUE );
+    fl_set_object_color( obj, FL_BLACK, FL_RED );
+    fl_set_object_lcolor( obj, FL_WHITE );
+
+    fdui->channel_t_re[2] = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 260, 280, 100, "Real(RX2)" );
+    fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
+    fl_set_object_color( obj, FL_BLACK, FL_GREEN );
     fl_set_object_lcolor( obj, FL_WHITE );
 
-    fdui->decoder_input = obj = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 250, 570, 130, "PBCH Decoder Input" );
+    fdui->channel_t_im[2] = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 310, 260, 280, 100, "Imag(RX2)" );
+    fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
+    fl_set_object_color( obj, FL_BLACK, FL_GREEN );
+    fl_set_object_lcolor( obj, FL_WHITE );
+
+    /*
+    fdui->scatter_plot = obj = fl_add_xyplot( FL_POINTS_XYPLOT, 600, 230, 160, 190, "PBCH Scatter Plot" );
     fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
     fl_set_object_color( obj, FL_BLACK, FL_GREEN );
     fl_set_object_lcolor( obj, FL_WHITE );
@@ -61,15 +72,11 @@ create_form_lte_scope( void )
     fl_set_object_color( obj, FL_RED, FL_RED);
     fl_set_object_callback( obj, ia_receiver_on_off, 0 );
 
-    fdui->demod_out = obj = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 400, 570, 140, "PDSCH/PUSCH Decoder Input" );
-    fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
-    fl_set_object_color( obj, FL_BLACK, FL_YELLOW );
-    fl_set_object_lcolor( obj, FL_WHITE );
-
     fdui->tput = obj = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 560, 570, 140, "Throughput [kbits/s]" );
     fl_set_object_boxtype( obj, FL_EMBOSSED_BOX );
     fl_set_object_color( obj, FL_BLACK, FL_WHITE );
     fl_set_object_lcolor( obj, FL_WHITE );
+    */
 
     fl_end_form( );
 
diff --git a/targets/RTAI/USER/lte_scope.h b/targets/RTAI/USER/lte_scope.h
index 693e34792886ba347d24ba8f7564def7a66c3d08..2c2797ffb2498bf52568bc96f05e922429bf3356 100644
--- a/targets/RTAI/USER/lte_scope.h
+++ b/targets/RTAI/USER/lte_scope.h
@@ -17,16 +17,18 @@ typedef struct {
     void      * vdata;
     char      * cdata;
     long        ldata;
-    FL_OBJECT * channel_t_re;
+    FL_OBJECT * channel_t_re[4];
+    FL_OBJECT * channel_t_im[4];
+  /*
     FL_OBJECT * scatter_plot;
     FL_OBJECT * channel_f;
-    FL_OBJECT * channel_t_im;
     FL_OBJECT * decoder_input;
     FL_OBJECT * scatter_plot2;
     FL_OBJECT * scatter_plot1;
     FL_OBJECT * ia_receiver_button;
     FL_OBJECT * demod_out;
     FL_OBJECT * tput;
+  */
 } FD_lte_scope;
 
 extern FD_lte_scope * create_form_lte_scope( void );
diff --git a/targets/RTAI/USER/rt_wrapper.h b/targets/RTAI/USER/rt_wrapper.h
index 6a333b28e28adb79ebd688bd98b191ea2984faa1..faf557e2854795b41816b93299144ab2831b7e31 100644
--- a/targets/RTAI/USER/rt_wrapper.h
+++ b/targets/RTAI/USER/rt_wrapper.h
@@ -42,6 +42,7 @@
 #include <time.h>
 #include <errno.h>
 #include <stdio.h>
+#include <pthread.h>
 
 #define RTIME long long int
 
diff --git a/targets/RTAI/USER/synctest.c b/targets/RTAI/USER/synctest.c
index 72feedfbb48bdd82295e587a244e37b9a0c4eab8..e5044309b8ff46f11b3942a07bfed493013de6c8 100644
--- a/targets/RTAI/USER/synctest.c
+++ b/targets/RTAI/USER/synctest.c
@@ -262,7 +262,7 @@ void *scope_thread(void *arg) {
               
         }
         //printf("doing forms\n");
-        sleep(0.1);
+        usleep(100000);
     }
     
     //fclose (UE_stats);