diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index a0e05311c25232e56a62d3bb273f04310640e5e8..3a1a15617b9d96fd8e08d7ec8dce9d1fdcfee453 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -40,6 +40,10 @@ typedef struct openair0_device_t openair0_device;
 /* structrue holds the parameters to configure USRP devices
  */
 
+#ifdef USRP
+#define MAX_CARDS 1
+#endif
+
 typedef enum {
   max_gain=0,med_gain,byp_gain
 } rx_gain_t;
@@ -68,6 +72,15 @@ typedef struct {
   double tx_bw;
 } openair0_config_t;
 
+typedef struct {
+  /* card id */
+  int card;
+  /* rf chain id */
+  int chain;
+} openair0_rf_map;
+
+
+
 struct openair0_device_t {
   /* USRP RF frontend parameters set by application */
   openair0_config_t openair0_cfg;
diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
index 2ca93d37da05761a3b29fa636362676e6141fe9a..c1884e529ee68215da40220fa513175a8ce9387d 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
+++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
@@ -80,7 +80,6 @@ int openair0_open(void)
     
     int card;
     int ant;
-    int openair0_num_antennas[4];
 
     PAGE_SHIFT = log2_int( sysconf( _SC_PAGESIZE ) );
 
@@ -220,10 +219,12 @@ int openair0_close(void)
     return 0;
 }
 
+/*
 int openair0_dump_config(int card)
 {
     return ioctl(openair0_fd, openair_DUMP_CONFIG, card);
 }
+*/
 
 int openair0_get_frame(int card)
 {
@@ -245,18 +246,15 @@ int openair0_stop_without_reset(int card)
     return ioctl(openair0_fd, openair_STOP_WITHOUT_RESET, card);
 }
 
-static exmimo_config_t         *p_exmimo_config;
-static exmimo_id_t             *p_exmimo_id;
 #define MY_RF_MODE      (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX)
 #define RF_MODE_BASE    (LNA1ON +LNAMax + RFBBNORM)
 
 int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
 
   // Initialize card
+  exmimo_config_t         *p_exmimo_config;
+  exmimo_id_t             *p_exmimo_id;
   int ret;
-  int ant;
-  int resampling_factor=2;
-  int rx_filter=RXLPF25, tx_filter=TXLPF25;
 
   ret = openair0_open();
 
@@ -271,115 +269,141 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf
     return(ret);
   }
 
-  printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[0]);
-  
+  if (openair0_num_detected_cards>MAX_CARDS) {
+    printf ("Detected %d number of cards, but MAX_CARDS=%d\n", openair0_num_detected_cards, MAX_CARDS);
+  }
+  else {
+    printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[0]);
+  }
+
   p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr;
   p_exmimo_id     = openair0_exmimo_pci[0].exmimo_id_ptr;
-  
+
   printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", 0, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);
 
   // check if the software matches firmware
   if (p_exmimo_id->board_swrev!=BOARD_SWREV_CNTL2) {
     printf("Software revision %d and firmware revision %d do not match. Please update either the firmware or the software!\n",BOARD_SWREV_CNTL2,p_exmimo_id->board_swrev);
-    exit(-1);
-  }
-
-  if (!openair0_cfg) {
-    printf("Error, openair0_cfg is null!!\n");
     return(-1);
   }
 
-  if (p_exmimo_id->board_swrev>=9)
-    p_exmimo_config->framing.eNB_flag   = 0; 
-  else 
-    p_exmimo_config->framing.eNB_flag   = 1;//!UE_flag;
+  return(0);
+}
 
-  p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
+int openair0_dump_config(openair0_config_t *openair0_cfg, int UE_flag)
+{
+  int ret;
+  int ant, card;
+  int resampling_factor=2;
+  int rx_filter=RXLPF25, tx_filter=TXLPF25;
 
-  if (openair0_cfg->sample_rate==30.72e6) {
-    resampling_factor = 0;
-    rx_filter = RXLPF10;
-    tx_filter = TXLPF10;
-  }
-  else if (openair0_cfg->sample_rate==15.36e6) {
-    resampling_factor = 1;
-    rx_filter = RXLPF5;
-    tx_filter = TXLPF5;
-  }
-  else if (openair0_cfg->sample_rate==7.68e6) {
-    resampling_factor = 2;
-    rx_filter = RXLPF25;
-    tx_filter = TXLPF25;
-  }
-  else {
-    printf("Sampling rate not supported, using default 7.68MHz");
-    resampling_factor = 2;
-    rx_filter = RXLPF25;
-    tx_filter = TXLPF25;
+  exmimo_config_t         *p_exmimo_config;
+  exmimo_id_t             *p_exmimo_id;
 
+  if (!openair0_cfg) {
+    printf("Error, openair0_cfg is null!!\n");
+    return(-1);
   }
 
-#if (BOARD_SWREV_CNTL2>=0x0A)
-  for (ant=0; ant<4; ant++)
-    p_exmimo_config->framing.resampling_factor[ant] = resampling_factor;
-#else
-    p_exmimo_config->framing.resampling_factor = resampling_factor;
-#endif
+  for (card=0; card<openair0_num_detected_cards; card++) {
 
-  for (ant=0;ant<max(openair0_cfg->tx_num_channels,openair0_cfg->rx_num_channels);ant++) 
-    p_exmimo_config->rf.rf_mode[ant] = RF_MODE_BASE;
-  for (ant=0;ant<openair0_cfg->tx_num_channels;ant++)
-    p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX + TXLPFNORM + TXLPFEN + tx_filter);
-  for (ant=0;ant<openair0_cfg->rx_num_channels;ant++) {
-    p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX + RXLPFNORM + RXLPFEN + rx_filter);
-    switch (openair0_cfg->rxg_mode[ant]) {
-    default:
-    case max_gain:
-      p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAMax;
-      break;
-    case med_gain:
-      p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAMed;
-      break;
-    case byp_gain:
-      p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAByp;
-      break;
+    p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
+    p_exmimo_id     = openair0_exmimo_pci[card].exmimo_id_ptr;
+    
+    if (p_exmimo_id->board_swrev>=9)
+      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;
+    
+    if (openair0_cfg[card].sample_rate==30.72e6) {
+      resampling_factor = 0;
+      rx_filter = RXLPF10;
+      tx_filter = TXLPF10;
     }
-  }
-  for (ant=max(openair0_cfg->tx_num_channels,openair0_cfg->rx_num_channels);ant<4;ant++) {
-    p_exmimo_config->rf.rf_mode[ant] = 0;
-  }
-  
-  for (ant = 0; ant<openair0_cfg->rx_num_channels; ant++) { 
-    p_exmimo_config->rf.do_autocal[ant] = 1;
-    p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg->rx_freq[ant];
-    p_exmimo_config->rf.rx_gain[ant][0] = (unsigned int)openair0_cfg->rx_gain[ant];
-    printf("openair0 : programming RX antenna %d (freq %d, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]);
-  }
-  for (ant = 0; ant<openair0_cfg->tx_num_channels; ant++) { 
-    p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg->tx_freq[ant];
-    p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg->tx_gain[ant];
-    printf("openair0 : programming TX antenna %d (freq %d, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]);
-  }
-
-  p_exmimo_config->rf.rf_local[ant]   = rf_local[ant];
-  p_exmimo_config->rf.rf_rxdc[ant]    = rf_rxdc[ant];
-  
-  for (ant=0;ant<4;ant++) {
-    p_exmimo_config->rf.rf_local[ant]   = rf_local[ant];
-    p_exmimo_config->rf.rf_rxdc[ant]    = rf_rxdc[ant];
-
-    if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 850000000) && ( p_exmimo_config->rf.rf_freq_tx[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 (openair0_cfg[card].sample_rate==15.36e6) {
+      resampling_factor = 1;
+      rx_filter = RXLPF5;
+      tx_filter = TXLPF5;
     }
-    else if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 1900000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 2000000000)) {
-      p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
-      p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD;	    
+    else if (openair0_cfg[card].sample_rate==7.68e6) {
+      resampling_factor = 2;
+      rx_filter = RXLPF25;
+      tx_filter = TXLPF25;
     }
     else {
-      p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
-      p_exmimo_config->rf.rffe_band_mode[ant] = 0;	    
+      printf("Sampling rate not supported, using default 7.68MHz");
+      resampling_factor = 2;
+      rx_filter = RXLPF25;
+      tx_filter = TXLPF25;
+      
     }
+    
+#if (BOARD_SWREV_CNTL2>=0x0A)
+    for (ant=0; ant<4; ant++)
+      p_exmimo_config->framing.resampling_factor[ant] = resampling_factor;
+#else
+    p_exmimo_config->framing.resampling_factor = resampling_factor;
+#endif
+    
+    for (ant=0;ant<4;ant++) {
+      if (openair0_cfg[card].rx_freq[ant] || openair0_cfg[card].tx_freq[ant]) {
+	p_exmimo_config->rf.rf_mode[ant] = RF_MODE_BASE;
+	p_exmimo_config->rf.do_autocal[ant] = 1;
+      }
+      if (openair0_cfg[card].tx_freq[ant]) {
+	p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX + TXLPFNORM + TXLPFEN + tx_filter);
+	p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg[card].tx_freq[ant];
+	p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg[card].tx_gain[ant];
+	printf("openair0 : programming TX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]);
+      }
+      if (openair0_cfg[card].rx_freq[ant]) {
+	p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX + RXLPFNORM + RXLPFEN + rx_filter);
+	
+	p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg[card].rx_freq[ant];
+	p_exmimo_config->rf.rx_gain[ant][0] = (unsigned int)openair0_cfg[card].rx_gain[ant];
+	printf("openair0 : programming RX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]);
+	
+	switch (openair0_cfg[card].rxg_mode[ant]) {
+	default:
+	case max_gain:
+	  p_exmimo_config[card].rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAMax;
+	  break;
+	case med_gain:
+	  p_exmimo_config[card].rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAMed;
+	  break;
+	case byp_gain:
+	  p_exmimo_config[card].rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAByp;
+	  break;
+	}
+      }
+      else {
+	p_exmimo_config->rf.rf_mode[ant] = 0;
+	p_exmimo_config->rf.do_autocal[ant] = 0;
+      }
+      
+      p_exmimo_config->rf.rf_local[ant]   = rf_local[ant];
+      p_exmimo_config->rf.rf_rxdc[ant]    = rf_rxdc[ant];
+      
+      if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 850000000) && ( p_exmimo_config->rf.rf_freq_tx[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 (( p_exmimo_config->rf.rf_freq_tx[ant] >= 1900000000) && ( p_exmimo_config->rf.rf_freq_tx[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;	    
+      }
+    }
+    
+    ret = ioctl(openair0_fd, openair_DUMP_CONFIG, card);
+    if (ret!=0)
+      return(-1);
+    
   }
   
   return(0);
diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h
index 3c07c3815de6b948a2719a0215922ef34354931b..ce9a3118b6b15cd0d198514fe9bee12195c61e0f 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h
+++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h
@@ -63,7 +63,8 @@ int openair0_close(void);
 
 // trigger config update on card
 // return 0 on success
-int openair0_dump_config(int card);
+int openair0_dump_config(openair0_config_t *openair0_cfg, int UE_flag);
+//int openair0_dump_config(int card);
 
 // triggers recording of exactly 1 frame
 // in case of synchronized multiple cards, send this only to the master card
diff --git a/targets/RT/USER/.runinfo b/targets/RT/USER/.runinfo
index f61c16eabfad9150e8a80d53cbbd6f7dc6cf2c6f..3dd478f9254dafe010d0207d6ac67b98049fa9da 100644
--- a/targets/RT/USER/.runinfo
+++ b/targets/RT/USER/.runinfo
@@ -6,16 +6,13 @@ msg_many:lxrt+sem+mbx+msg+fifos:!sudo ./msg_test;sleep 1;popall:control_c
 eNB:lxrt+sem+mbx+msg+fifos:!sudo ./synctest;sleep 1;popall:control_c
 eNB_test:lxrt+sem+mbx+msg+smi:!sudo ./lte-softmodem -S -F enb2tx;sleep 1;popall:control_c
 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 1907602944 -V;sleep 1;popall:control_c
-#EXMIMO2 card 1
-#UE0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907600480 -V;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 5
+#UE0_smbv:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907598252 -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
+#EXMIMO2 card 38
+UE0_smbv:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907592704 -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
 UE0noL2:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -U -d -C 1907600480 --no-L2-connect;sleep 1;popall:control_c
@@ -31,9 +28,9 @@ 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.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
+eNB0:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -d -O../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.conf -V -K /tmp/itti_eNB0.log;sleep 1;popall:control_c
+eNB1:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -C 2680000000 -r 50 -d -V;sleep 1;popall:control_c
+eNB2:lxrt+sem+mbx+msg+fifos:!sudo ./lte-softmodem -C 2680000000 -r 100 -d -V;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
diff --git a/targets/RT/USER/Makefile b/targets/RT/USER/Makefile
index d59b42a0a8e201279cb874805c37af025e5ddf5f..c8f3f7bce3fa0024de4fa74bb4cd15f5d447c26b 100644
--- a/targets/RT/USER/Makefile
+++ b/targets/RT/USER/Makefile
@@ -132,7 +132,8 @@ OBJ += $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/netlink_init.o
 CFLAGS += -DOPENAIR2 -DNO_RRM -DPUCCH -DMAC_CONTEXT=1
 endif
 
-RTAI_OBJ += $(UTILS_OBJS)
+#RTAI_
+OBJ += $(UTILS_OBJS)
 
 
 
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 243dd1b1d3befc93c50ee4c31cba3e26902779da..fee84cdce2a868ce990ddc8aec34b67adf935d07 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -146,11 +146,12 @@ void cleanup_dlsch_threads(void);
 int32_t init_rx_pdsch_thread(void);
 void cleanup_rx_pdsch_thread(void);
 
+openair0_config_t openair0_cfg[MAX_CARDS];
 
 int32_t *rxdata;
 int32_t *txdata;
-void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
-void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
+int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
+int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
 
 #ifdef XFORMS
 // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
@@ -221,11 +222,11 @@ static int                      time_offset[4] = {0,0,0,0};
 
 
 static char                     UE_flag=0;
-static uint8_t                       eNB_id=0,UE_id=0;
+static uint8_t                  eNB_id=0,UE_id=0;
 
-uint32_t                             carrier_freq[4] =           {1907600000,1907600000,1907600000,1907600000}; /* For UE! */
-static uint32_t          downlink_frequency[4] =     {1907600000,1907600000,1907600000,1907600000};
-static int32_t                      uplink_frequency_offset[4]= {-120000000,-120000000,-120000000,-120000000};
+uint32_t                        carrier_freq[MAX_NUM_CCs][4] =           {{1907600000,1907600000,1907600000,1907600000}}; /* For UE! */
+static uint32_t                 downlink_frequency[MAX_NUM_CCs][4] =     {{1907600000,1907600000,1907600000,1907600000}};
+static int32_t                  uplink_frequency_offset[MAX_NUM_CCs][4]= {{-120000000,-120000000,-120000000,-120000000}};
 static char                    *conf_config_file_name = NULL;
 
 #if defined(ENABLE_ITTI)
@@ -1025,7 +1026,7 @@ static void * eNB_thread_rx(void *param) {
 
 
 
-void init_eNB_proc() {
+void init_eNB_proc(void) {
 
   int i;
   int CC_id;
@@ -1085,7 +1086,7 @@ void init_eNB_proc() {
   }
 }
 
-void kill_eNB_proc() {
+void kill_eNB_proc(void) {
 
   int i;
   int *status_tx,*status_rx;
@@ -1491,7 +1492,7 @@ static void *UE_thread(void *arg) {
   int i, ret;
   volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
 #ifndef USRP
-  exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;;
+  //exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;;
 #endif
 
 
@@ -1657,19 +1658,19 @@ static void *UE_thread(void *arg) {
 	else {
 	  LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",openair_daq_vars.freq_offset);
 #ifndef USRP
-	  for (i=0; i<4; i++) {
-	    if (p_exmimo_config->rf.rf_freq_rx[i])
-	      p_exmimo_config->rf.rf_freq_rx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
-	    if (p_exmimo_config->rf.rf_freq_tx[i])
-	      p_exmimo_config->rf.rf_freq_tx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
+	  for (card=0;card<MAX_CARDS;card++) {
+	    for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
+	      openair0_cfg[card].rx_freq[i] = carrier_freq[card][i]+openair_daq_vars.freq_offset;
+	      openair0_cfg[card].tx_freq[i] = carrier_freq[card][i]+openair_daq_vars.freq_offset;
+	    }
 	  }
+	  openair0_dump_config(&openair0_cfg[0],UE_flag);
 #endif
-	  openair0_dump_config(card);
 	  rt_sleep_ns(FRAME_PERIOD);
 	}
       }
     }
-      
+    
     /*
       if ((slot%2000)<10)
       LOG_D(HW,"fun0: doing very hard work\n");
@@ -1703,7 +1704,7 @@ static void *UE_thread(void *arg) {
 
 
 static void get_options (int argc, char **argv) {
-  int                           c;
+  int c;
   //  char                          line[1000];
   //  int                           l;
   int k;//i,j,k;
@@ -1772,15 +1773,17 @@ static void get_options (int argc, char **argv) {
       multi_thread=0;
       break;
     case 'C':
-      downlink_frequency[0] = atof(optarg); // Use float to avoid issue with frequency over 2^31.
-      downlink_frequency[1] = downlink_frequency[0];
-      downlink_frequency[2] = downlink_frequency[0];
-      downlink_frequency[3] = downlink_frequency[0];
-      carrier_freq[0] = downlink_frequency[0];
-      carrier_freq[1] = downlink_frequency[1];
-      carrier_freq[2] = downlink_frequency[2];
-      carrier_freq[3] = downlink_frequency[3];
-      printf("Downlink frequency set to %u\n", downlink_frequency[0]);
+      for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+      downlink_frequency[CC_id][0] = atof(optarg); // Use float to avoid issue with frequency over 2^31.
+      downlink_frequency[CC_id][1] = downlink_frequency[CC_id][0];
+      downlink_frequency[CC_id][2] = downlink_frequency[CC_id][0];
+      downlink_frequency[CC_id][3] = downlink_frequency[CC_id][0];
+      carrier_freq[CC_id][0] = downlink_frequency[CC_id][0];
+      carrier_freq[CC_id][1] = downlink_frequency[CC_id][1];
+      carrier_freq[CC_id][2] = downlink_frequency[CC_id][2];
+      carrier_freq[CC_id][3] = downlink_frequency[CC_id][3];
+      }
+      printf("Downlink for CC_id %d frequency set to %u\n", CC_id, downlink_frequency[CC_id][0]);
       break;
       
     case 'd':
@@ -1908,13 +1911,16 @@ static void get_options (int argc, char **argv) {
       rrc_log_verbosity              = enb_properties->properties[i]->rrc_log_verbosity;
     
     
-    // adjust the log 
-
-      for (k = 0 ; k < (sizeof(downlink_frequency) / sizeof (downlink_frequency[0])); k++) {
-	downlink_frequency[k] =       enb_properties->properties[i]->downlink_frequency[0];
-	printf("Downlink frequency set to %u\n", downlink_frequency[k]);
-	uplink_frequency_offset[k] =  enb_properties->properties[i]->uplink_frequency_offset[0];
-      } // k 
+      // adjust the log 
+      for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+	for (k = 0 ; k < 4; k++) {
+	  downlink_frequency[CC_id][k] =       enb_properties->properties[i]->downlink_frequency[CC_id];
+	  uplink_frequency_offset[CC_id][k] =  enb_properties->properties[i]->uplink_frequency_offset[CC_id];
+	}
+	printf("Downlink frequency/ uplink offset of CC_id %d set to %llu/%d\n", CC_id, 
+	       enb_properties->properties[i]->downlink_frequency[CC_id],
+	       enb_properties->properties[i]->uplink_frequency_offset[CC_id]);
+      } // CC_id 
     }// i
   }
 }
@@ -1954,7 +1960,8 @@ int main(int argc, char **argv) {
 #if defined (EMOS) || (! defined (RTAI))
   int error_code;
 #endif
-  openair0_config_t openair0_cfg;
+
+  memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS);
 
   set_latency_target();
 
@@ -2159,17 +2166,17 @@ int main(int argc, char **argv) {
     
     if ((mode == normal_txrx) || (mode == rx_calib_ue) || (mode == no_L2_connect) || (mode == debug_prach)) {
       for (i=0;i<4;i++)
-	openair0_cfg.rxg_mode[i] =  max_gain;
+	openair0_cfg[CC_id].rxg_mode[i] =  max_gain;
       PHY_vars_UE_g[CC_id][0]->rx_total_gain_dB =  PHY_vars_UE_g[CC_id][0]->rx_gain_max[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain
     }
     else if ((mode == rx_calib_ue_med)) {
       for (i=0;i<4;i++)
-	openair0_cfg.rxg_mode[i] =  med_gain;
+	openair0_cfg[CC_id].rxg_mode[i] =  med_gain;
       PHY_vars_UE_g[CC_id][0]->rx_total_gain_dB =  PHY_vars_UE_g[CC_id][0]->rx_gain_med[0]  + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain;
     }
     else if ((mode == rx_calib_ue_byp)) {
       for (i=0;i<4;i++)
-	openair0_cfg.rxg_mode[i] =  byp_gain;
+	openair0_cfg[CC_id].rxg_mode[i] =  byp_gain;
       PHY_vars_UE_g[CC_id][0]->rx_total_gain_dB =  PHY_vars_UE_g[CC_id][0]->rx_gain_byp[0]  + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain;
     }
     
@@ -2214,6 +2221,9 @@ int main(int argc, char **argv) {
 
 	PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB =  rxg_max[0] + (int)rx_gain - 30; //was measured at rxgain=30;
 
+	// set eNB to max gain
+	for (i=0;i<4;i++)
+	  openair0_cfg[CC_id].rxg_mode[i] =  max_gain;
       }
       NB_eNB_INST=1;
       NB_INST=1;
@@ -2223,9 +2233,6 @@ int main(int argc, char **argv) {
       openair_daq_vars.ue_ul_nb_rb=6;
       openair_daq_vars.target_ue_ul_mcs=6;
 
-      // set eNB to max gain
-      for (i=0;i<4;i++)
-	openair0_cfg.rxg_mode[i] =  max_gain;
     }
 
 
@@ -2267,34 +2274,25 @@ int main(int argc, char **argv) {
 #endif
   }
   
-  mac_xface = malloc(sizeof(MAC_xface));
 
-
-  openair0_cfg.sample_rate = sample_rate;
-  openair0_cfg.tx_num_channels = frame_parms[0]->nb_antennas_tx;
-  openair0_cfg.rx_num_channels = frame_parms[0]->nb_antennas_rx;
-  
-  for (i=0;i<4;i++) {
-    if (UE_flag==1) {
-      openair0_cfg.tx_freq[i] = downlink_frequency[i]+uplink_frequency_offset[i];
-      openair0_cfg.rx_freq[i] = downlink_frequency[i];
-    }
-    else {
-      openair0_cfg.rx_freq[i] = downlink_frequency[i]+uplink_frequency_offset[i];
-      openair0_cfg.tx_freq[i] = downlink_frequency[i];
+  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+    openair0_cfg[CC_id].sample_rate = sample_rate;
+    openair0_cfg[CC_id].tx_bw = bw;
+    openair0_cfg[CC_id].rx_bw = bw;
+    for (i=0;i<4;i++) {
+      openair0_cfg[CC_id].tx_gain[i] = tx_gain;
+      openair0_cfg[CC_id].rx_gain[i] = rx_gain;
     }
   }
-  openair0_cfg.tx_bw = bw;
-  openair0_cfg.rx_bw = bw;
-  for (i=0;i<4;i++) {
-    openair0_cfg.tx_gain[i] = tx_gain;
-    openair0_cfg.rx_gain[i] = rx_gain;
-  }
-  
-  if (openair0_device_init(&openair0, &openair0_cfg) <0) {
+
+  if (openair0_device_init(&openair0, &openair0_cfg[0]) <0) {
     printf("Exiting, cannot initialize device\n");
     exit(-1);
   }
+
+
+  mac_xface = malloc(sizeof(MAC_xface));
+
 #ifdef OPENAIR2
   int eMBMS_active=0;
 
@@ -2338,30 +2336,37 @@ int main(int argc, char **argv) {
 
   openair_daq_vars.timing_advance = 0;
 
+  openair0_rf_map rf_map[MAX_NUM_CCs];
+  rf_map[0].card=0;
+  rf_map[0].chain=1;
+
   // connect the TX/RX buffers
   if (UE_flag==1) {
+    setup_ue_buffers(PHY_vars_UE_g[0],&openair0_cfg[0],rf_map);
+    printf("Setting UE buffer to all-RX\n");
+    // Set LSBs for antenna switch (ExpressMIMO)
     for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
-      setup_ue_buffers(PHY_vars_UE_g[CC_id][0],frame_parms[CC_id],ant_offset);
-      printf("Setting UE buffer to all-RX\n");
-      // Set LSBs for antenna switch (ExpressMIMO)
       for (i=0; i<frame_parms[CC_id]->samples_per_tti*10; i++)
 	for (aa=0; aa<frame_parms[CC_id]->nb_antennas_tx; aa++)
-	  PHY_vars_UE_g[CC_id][0]->lte_ue_common_vars.txdata[aa][i] = 0x00010001;
+	  PHY_vars_UE_g[0][CC_id]->lte_ue_common_vars.txdata[aa][i] = 0x00010001;
     }
     //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
   }
   else {
+    if (setup_eNB_buffers(PHY_vars_eNB_g[0],&openair0_cfg[0],rf_map)!=0) {
+      printf("Error setting up eNB buffer\n");
+      exit(-1);
+    }
+    printf("Setting eNB buffer to all-RX\n");
+    // Set LSBs for antenna switch (ExpressMIMO)
     for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
-      setup_eNB_buffers(PHY_vars_eNB_g[CC_id][0],frame_parms[CC_id],ant_offset);
-      printf("Setting eNB buffer to all-RX\n");
-      // Set LSBs for antenna switch (ExpressMIMO)
       for (i=0; i<frame_parms[CC_id]->samples_per_tti*10; i++)
 	for (aa=0; aa<frame_parms[CC_id]->nb_antennas_tx; aa++)
-	  PHY_vars_eNB_g[CC_id][0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001;
+	  PHY_vars_eNB_g[0][CC_id]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001;
     }
   }
 #ifndef USRP
-  openair0_dump_config(card);
+  openair0_dump_config(&openair0_cfg[0],UE_flag);
 #endif
 
   /*  
@@ -2652,109 +2657,158 @@ int main(int argc, char **argv) {
   return 0;
 }
 
-void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
-
-  int i;
+int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs])
+{
 #ifndef USRP
-  if (phy_vars_ue) {
-    if ((frame_parms[0]->nb_antennas_rx>1) && (carrier>0)) {
-      printf("RX antennas > 1 and carrier > 0 not possible\n");
-      exit(-1);
+  int i, CC_id;
+  LTE_DL_FRAME_PARMS *frame_parms;
+  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+    if (phy_vars_ue[CC_id]) {
+      frame_parms = &(phy_vars_ue[CC_id]->lte_frame_parms); 
     }
-
-    if ((frame_parms[0]->nb_antennas_tx>1) && (carrier>0)) {
-      printf("TX antennas > 1 and carrier > 0 not possible\n");
-      exit(-1);
+    else {
+      printf("phy_vars_eNB[%d] not initialized\n", CC_id);
+      return(-1);
     }
-    
-    // replace RX signal buffers with mmaped HW versions
-    for (i=0;i<frame_parms[0]->nb_antennas_rx;i++) {
-      free(phy_vars_ue->lte_ue_common_vars.rxdata[i]);
-      phy_vars_ue->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier];
 
+    openair0_cfg[CC_id].tx_num_channels = 0;
+    openair0_cfg[CC_id].rx_num_channels = 0;
+
+    // replace RX signal buffers with mmaped HW versions
+    for (i=0;i<frame_parms->nb_antennas_rx;i++) {
+      printf("Mapping eNB CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i);
+      free(phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i]);
+      phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i];
+      if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) {
+	printf("Error with rf_map! A channel has already been allocated!\n");
+	return(-1);
+      }
+      else {
+	openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i];
+	openair0_cfg[rf_map[CC_id].card].rx_num_channels++;
+      }
 
-      printf("rxdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.rxdata[i]);
+      printf("rxdata[%d] @ %p\n",i,phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i]);
     }
-    for (i=0;i<frame_parms[0]->nb_antennas_tx;i++) {
-      free(phy_vars_ue->lte_ue_common_vars.txdata[i]);
-      phy_vars_ue->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier];
+    for (i=0;i<frame_parms->nb_antennas_tx;i++) {
+      printf("Mapping eNB CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i);
+      free(phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i]);
+      phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i];
+      if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) {
+	printf("Error with rf_map! A channel has already been allocated!\n");
+	return(-1);
+      }
+      else {
+	openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i];
+	openair0_cfg[rf_map[CC_id].card].tx_num_channels++;
+      }
 
-      printf("txdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.txdata[i]);
+      printf("txdata[%d] @ %p\n",i,phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i]);
     }
   }
+  return(0);
 #else
   printf("USRP not supported for UE yet!");
+  return(-1);
 #endif
 }
 
-void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
+/* this function maps the phy_vars_eNB tx and rx buffers to the available rf chains. 
+   Each rf chain is is addressed by the card number and the chain on the card. The 
+   rf_map specifies for each CC, on which rf chain the mapping should start. Multiple 
+   antennas are mapped to successive RF chains on the same card. */
+int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) {
 
-  int i;
+  int i, CC_id;
 #ifdef USRP
   uint16_t N_TA_offset = 0;
 #else
   int j;
 #endif
+  LTE_DL_FRAME_PARMS *frame_parms;
 
-  if (phy_vars_eNB) {
-    if ((frame_parms[0].nb_antennas_rx>1) && (carrier>0)) {
-      printf("RX antennas > 1 and carrier > 0 not possible\n");
-      exit(-1);
+  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+    if (phy_vars_eNB[CC_id]) {
+      frame_parms = &(phy_vars_eNB[CC_id]->lte_frame_parms); 
     }
-
-    if ((frame_parms[0].nb_antennas_tx>1) && (carrier>0)) {
-      printf("TX antennas > 1 and carrier > 0 not possible\n");
-      exit(-1);
+    else {
+      printf("phy_vars_eNB[%d] not initialized\n", CC_id);
+      return(-1);
     }
 
 #ifdef USRP
-    if (frame_parms[0].frame_type == TDD) {
-      if (phy_vars_eNB->lte_frame_parms.N_RB_DL == 100)
+    if (frame_parms->frame_type == TDD) {
+      if (frame_parms->N_RB_DL == 100)
 	N_TA_offset = 624;
-      else if (phy_vars_eNB->lte_frame_parms.N_RB_DL == 50)
+      else if (frame_parms->N_RB_DL == 50)
 	N_TA_offset = 624/2;
-      else if (phy_vars_eNB->lte_frame_parms.N_RB_DL == 25)
+      else if (frame_parms->N_RB_DL == 25)
 	N_TA_offset = 624/4;
     }
 #endif
-    
+   
+
+    openair0_cfg[CC_id].tx_num_channels = 0;
+    openair0_cfg[CC_id].rx_num_channels = 0;
+   
+
+  
     // replace RX signal buffers with mmaped HW versions
 #ifndef USRP
-    for (i=0;i<frame_parms[0]->nb_antennas_rx;i++) {
-      free(phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
-      phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier];
-
-      printf("rxdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
+    for (i=0;i<frame_parms->nb_antennas_rx;i++) {
+      printf("Mapping eNB CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i);
+      free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]);
+      phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i];
+      if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) {
+	printf("Error with rf_map! A channel has already been allocated!\n");
+	return(-1);
+      }
+      else {
+	openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i];
+	openair0_cfg[rf_map[CC_id].card].rx_num_channels++;
+      }
+      printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]);
       for (j=0;j<16;j++) {
-	printf("rxbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j]);
-	phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j] = 16-j;
+	printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j]);
+	phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j] = 16-j;
       }
     }
-    for (i=0;i<frame_parms[0]->nb_antennas_tx;i++) {
-      free(phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
-      phy_vars_eNB->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier];
-
-      printf("txdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
+    for (i=0;i<frame_parms->nb_antennas_tx;i++) {
+      printf("Mapping eNB CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i);
+      free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]);
+      phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i];
+      if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) {
+	printf("Error with rf_map! A channel has already been allocated!\n");
+	return(-1);
+      }
+      else {
+	openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i];
+	openair0_cfg[rf_map[CC_id].card].tx_num_channels++;
+      }
+      
+      printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]);
       for (j=0;j<16;j++) {
-	printf("txbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j]);
-	phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j] = 16-j;
+	printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j]);
+	phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j] = 16-j;
       }
     }
 #else // USRP
-    for (i=0;i<frame_parms[0].nb_antennas_rx;i++) {
-        free(phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
-        rxdata = (int32_t*)malloc16(samples_per_frame*sizeof(int32_t));
-        phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i] = rxdata-N_TA_offset; // N_TA offset for TDD
-        memset(rxdata, 0, samples_per_frame*sizeof(int32_t));
-        printf("rxdata[%d] @ %p (%p)\n", i, phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i],rxdata);
+    for (i=0;i<frame_parms->nb_antennas_rx;i++) {
+      free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]);
+      rxdata = (int32_t*)malloc16(samples_per_frame*sizeof(int32_t));
+      phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = rxdata-N_TA_offset; // N_TA offset for TDD
+      memset(rxdata, 0, samples_per_frame*sizeof(int32_t));
+      printf("rxdata[%d] @ %p (%p)\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i],rxdata);
     }
-    for (i=0;i<frame_parms[0].nb_antennas_tx;i++) {
-        free(phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
-        txdata = (int32_t*)malloc16(samples_per_frame*sizeof(int32_t));
-        phy_vars_eNB->lte_eNB_common_vars.txdata[0][i] = txdata;
-        memset(txdata, 0, samples_per_frame*sizeof(int32_t));
-        printf("txdata[%d] @ %p\n", i, phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
+    for (i=0;i<frame_parms->nb_antennas_tx;i++) {
+      free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]);
+      txdata = (int32_t*)malloc16(samples_per_frame*sizeof(int32_t));
+      phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = txdata;
+      memset(txdata, 0, samples_per_frame*sizeof(int32_t));
+      printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]);
     }
 #endif
   }
+  return(0);
 }
+
diff --git a/targets/RT/USER/sched_dlsch.c b/targets/RT/USER/sched_dlsch.c
index bda74c3ffab4e330c6784c716014bab0bbcb1ab6..aee3cb95e8480532e1b4e0cdb3a7b79d790782ea 100644
--- a/targets/RT/USER/sched_dlsch.c
+++ b/targets/RT/USER/sched_dlsch.c
@@ -104,8 +104,8 @@ static void * dlsch_thread(void *param) {
   char task_name[8];
 #endif
 
-  int eNB_id = 0, UE_id = 0;
-  PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[UE_id];
+  int eNB_id = 0, UE_id = 0, CC_id=0;
+  PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[UE_id][CC_id];
 
   if ((dlsch_thread_index <0) || (dlsch_thread_index>7)) {
       LOG_E(PHY,"[SCHED][DLSCH] Illegal dlsch_thread_index %d (%p)!!!!\n",dlsch_thread_index,param);