diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 34c3a3e76a162e0d9825f7e78cb71f11667559f5..1babdec469aba430e8449ce16b6a2eb9ce9bfea3 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1285,6 +1285,7 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
   ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c
   ${OPENAIR1_DIR}/PHY/TOOLS/lut.c
+  ${OPENAIR1_DIR}/PHY/INIT/nr_init_ue.c
   )
 
 
diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c
index 38b80f28480cb1a3027b261a7b07d4e838169084..df052d10f43b6aa62b7e5bfb257b2a35ffc1dfff 100644
--- a/targets/RT/USER/nr-ue.c
+++ b/targets/RT/USER/nr-ue.c
@@ -135,6 +135,31 @@ static const eutra_band_t eutra_bands[] = {
     {44, 703    * MHz, 803    * MHz, 703    * MHz, 803    * MHz, TDD},
 };
 
+PHY_VARS_NR_UE* init_nr_ue_vars(NR_DL_FRAME_PARMS *frame_parms,
+			  uint8_t UE_id,
+			  uint8_t abstraction_flag)
+
+{
+
+  PHY_VARS_NR_UE* ue;
+
+  if (frame_parms!=(NR_DL_FRAME_PARMS *)NULL) { // if we want to give initial frame parms, allocate the PHY_VARS_UE structure and put them in
+    ue = (PHY_VARS_NR_UE *)malloc(sizeof(PHY_VARS_NR_UE));
+    memset(ue,0,sizeof(PHY_VARS_NR_UE));
+    memcpy(&(ue->frame_parms), frame_parms, sizeof(NR_DL_FRAME_PARMS));
+  }
+  else ue = PHY_vars_UE_g[UE_id][0];
+
+  ue->Mod_id      = UE_id;
+  ue->mac_enabled = 1;
+  // initialize all signal buffers
+  init_nr_ue_signal(ue,1,abstraction_flag);
+  // intialize transport
+  //init_nr_ue_transport(ue,abstraction_flag);
+
+  return(ue);
+}
+
 void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_t *cpuset, char * name) {
 
 #ifdef DEADLINE_SCHEDULER
@@ -190,6 +215,10 @@ void init_UE(int nb_inst)
   for (inst=0; inst < nb_inst; inst++) {
     //    UE->rfdevice.type      = NONE_DEV;
     PHY_VARS_NR_UE *UE = PHY_vars_UE_g[inst][0];
+    LOG_I(PHY,"Initializing memory for UE instance %d (%p)\n",inst,PHY_vars_UE_g[inst]);
+        PHY_vars_UE_g[inst][0] = init_nr_ue_vars(NULL,inst,0);
+
+
     AssertFatal(0 == pthread_create(&UE->proc.pthread_ue,
                                     &UE->proc.attr_ue,
                                     UE_thread,
diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c
index f490a0b8df8392672a7558b80f20bc5db8d30f2b..914abff000793b540e6cc76137f4e6fe628d0494 100644
--- a/targets/RT/USER/nr-uesoftmodem.c
+++ b/targets/RT/USER/nr-uesoftmodem.c
@@ -399,10 +399,8 @@ void exit_fun(const char* s) {
     sleep(1); //allow lte-softmodem threads to exit first
     itti_terminate_tasks (TASK_UNKNOWN);
 #endif
-
 }
 
-
 #ifdef XFORMS
 
 
@@ -453,10 +451,7 @@ static void *scope_thread(void *arg) {
 
 # ifdef ENABLE_XFORMS_WRITE_STATS
 
-    if (UE_flag==1)
-        UE_stats  = fopen("UE_stats.txt", "w");
-    else
-        eNB_stats = fopen("eNB_stats.txt", "w");
+  UE_stats  = fopen("UE_stats.txt", "w");
 
 #endif
 
@@ -483,13 +478,11 @@ static void *scope_thread(void *arg) {
 
 # ifdef ENABLE_XFORMS_WRITE_STATS
 
-    if (UE_flag==1) {
         if (UE_stats) {
             rewind (UE_stats);
             fwrite (stats_buffer, 1, len, UE_stats);
             fclose (UE_stats);
         }
-    }
 
 # endif
 
@@ -508,46 +501,13 @@ void *l2l1_task(void *arg) {
     itti_set_task_real_time(TASK_L2L1);
     itti_mark_task_ready(TASK_L2L1);
 
-    if (UE_flag == 0) {
-        /* Wait for the initialize message */
-        printf("Wait for the ITTI initialize message\n");
-        do {
-            if (message_p != NULL) {
-                result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
-                AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
-            }
-
-            itti_receive_msg (TASK_L2L1, &message_p);
 
-            switch (ITTI_MSG_ID(message_p)) {
-            case INITIALIZE_MESSAGE:
-                /* Start eNB thread */
-                LOG_D(EMU, "L2L1 TASK received %s\n", ITTI_MSG_NAME(message_p));
-                start_eNB = 1;
-                break;
+  do {
+    // Wait for a message
+    itti_receive_msg (TASK_L2L1, &message_p);
 
-            case TERMINATE_MESSAGE:
-                printf("received terminate message\n");
-                oai_exit=1;
-                itti_exit_task ();
-                break;
-
-            default:
-                LOG_E(EMU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p));
-                break;
-            }
-        } while (ITTI_MSG_ID(message_p) != INITIALIZE_MESSAGE);
-
-        result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
-        AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
-    }
-
-    do {
-        // Wait for a message
-        itti_receive_msg (TASK_L2L1, &message_p);
-
-        switch (ITTI_MSG_ID(message_p)) {
-        case TERMINATE_MESSAGE:
+    switch (ITTI_MSG_ID(message_p)) {
+    case TERMINATE_MESSAGE:
             oai_exit=1;
             itti_exit_task ();
             break;
@@ -577,7 +537,6 @@ void *l2l1_task(void *arg) {
 }
 #endif
 
-
 extern int16_t dlsch_demod_shift;
 
 static void get_options (int argc, char **argv) {
@@ -588,11 +547,12 @@ static void get_options (int argc, char **argv) {
 	  uint32_t online_log_messages;
 	  uint32_t glog_level, glog_verbosity;
 	  uint32_t start_telnetsrv;
+	  nfapi_config_request_t *config[MAX_NUM_CCs];
 
 	  paramdef_t cmdline_params[] =CMDLINE_PARAMS_DESC ;
 	  paramdef_t cmdline_logparams[] =CMDLINE_LOGPARAMS_DESC ;
 
-	  //set_default_frame_parms(frame_parms);
+	  set_default_frame_parms(config,frame_parms);
 	  config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
 
 	  if (strlen(in_path) > 0) {
@@ -652,509 +612,10 @@ static void get_options (int argc, char **argv) {
 	    } /* UE with config file  */
 
 
-    int c;
-    //  char                          line[1000];
-    //  int                           l;
-    int k,i;//,j,k;
 #if defined(OAI_USRP) || defined(CPRIGW) || defined(OAI_ADRV9371_ZC706)
     int clock_src;
 #endif
 
-    enum long_option_e {
-        LONG_OPTION_START = 0x100, /* Start after regular single char options */
-        LONG_OPTION_RF_CONFIG_FILE,
-        LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS,
-        LONG_OPTION_CALIB_UE_RX,
-        LONG_OPTION_CALIB_UE_RX_MED,
-        LONG_OPTION_CALIB_UE_RX_BYP,
-        LONG_OPTION_DEBUG_UE_PRACH,
-        LONG_OPTION_NO_L2_CONNECT,
-        LONG_OPTION_CALIB_PRACH_TX,
-        LONG_OPTION_RXGAIN,
-        LONG_OPTION_RXGAINOFF,
-        LONG_OPTION_TXGAIN,
-	LONG_OPTION_NBRXANT,
-	LONG_OPTION_NBTXANT,
-        LONG_OPTION_SCANCARRIER,
-        LONG_OPTION_MAXPOWER,
-        LONG_OPTION_DUMP_FRAME,
-        LONG_OPTION_LOOPMEMORY,
-        LONG_OPTION_PHYTEST,
-        LONG_OPTION_USIMTEST,
-        LONG_OPTION_MMAPPED_DMA,
-        LONG_OPTION_EXTERNAL_CLOCK,
-        LONG_OPTION_WAIT_FOR_SYNC,
-        LONG_OPTION_SINGLE_THREAD_DISABLE,
-        LONG_OPTION_THREADIQ,
-        LONG_OPTION_THREADONESUBFRAME,
-        LONG_OPTION_THREADTWOSUBFRAME,
-        LONG_OPTION_THREADTHREESUBFRAME,
-        LONG_OPTION_THREADSLOT1PROCONE,
-        LONG_OPTION_THREADSLOT1PROCTWO,
-        LONG_OPTION_THREADSLOT1PROCTHREE,
-		LONG_OPTION_THREADDLSCHTDONE,
-		LONG_OPTION_THREADDLSCHTDTWO,
-		LONG_OPTION_THREADDLSCHTDTHREE,
-		LONG_OPTION_THREADDLSCHTD1ONE,
-		LONG_OPTION_THREADDLSCHTD1TWO,
-		LONG_OPTION_THREADDLSCHTD1THREE,
-        LONG_OPTION_DCIFORMAT,
-        LONG_OPTION_AGREGATIONLEVEL,
-        LONG_OPTION_DEMOD_SHIFT,
-#if T_TRACER
-        LONG_OPTION_T_PORT,
-        LONG_OPTION_T_NOWAIT,
-        LONG_OPTION_T_DONT_FORK,
-#endif
-
-    };
-
-    static const struct option long_options[] = {
-        {"rf-config-file",required_argument,  NULL, LONG_OPTION_RF_CONFIG_FILE},
-        {"ulsch-max-errors",required_argument,  NULL, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS},
-        {"calib-ue-rx",     required_argument,  NULL, LONG_OPTION_CALIB_UE_RX},
-        {"calib-ue-rx-med", required_argument,  NULL, LONG_OPTION_CALIB_UE_RX_MED},
-        {"calib-ue-rx-byp", required_argument,  NULL, LONG_OPTION_CALIB_UE_RX_BYP},
-        {"debug-ue-prach",  no_argument,        NULL, LONG_OPTION_DEBUG_UE_PRACH},
-        {"no-L2-connect",   no_argument,        NULL, LONG_OPTION_NO_L2_CONNECT},
-        {"calib-prach-tx",   no_argument,        NULL, LONG_OPTION_CALIB_PRACH_TX},
-        {"ue-rxgain",   required_argument,  NULL, LONG_OPTION_RXGAIN},
-        {"ue-rxgain-off",   required_argument,  NULL, LONG_OPTION_RXGAINOFF},
-        {"ue-txgain",   required_argument,  NULL, LONG_OPTION_TXGAIN},
-     	{"ue-nb-ant-rx", required_argument,  NULL, LONG_OPTION_NBRXANT},
-	    {"ue-nb-ant-tx", required_argument,  NULL, LONG_OPTION_NBTXANT},
-        {"ue-scan-carrier",   no_argument,  NULL, LONG_OPTION_SCANCARRIER},
-        {"ue-max-power",   required_argument,  NULL, LONG_OPTION_MAXPOWER},
-        {"ue-dump-frame", no_argument, NULL, LONG_OPTION_DUMP_FRAME},
-        {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY},
-        {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST},
-        {"usim-test", no_argument, NULL, LONG_OPTION_USIMTEST},
-        {"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA},
-        {"external-clock", no_argument, NULL, LONG_OPTION_EXTERNAL_CLOCK},
-        {"wait-for-sync", no_argument, NULL, LONG_OPTION_WAIT_FOR_SYNC},
-        {"single-thread-disable", no_argument, NULL, LONG_OPTION_SINGLE_THREAD_DISABLE},
-        {"threadIQ",  required_argument, NULL, LONG_OPTION_THREADIQ},
-        {"threadOneSubframe",  required_argument, NULL, LONG_OPTION_THREADONESUBFRAME},
-        {"threadTwoSubframe",  required_argument, NULL, LONG_OPTION_THREADTWOSUBFRAME},
-        {"threadThreeSubframe",  required_argument, NULL, LONG_OPTION_THREADTHREESUBFRAME},
-        {"threadSlot1ProcOne",  required_argument, NULL, LONG_OPTION_THREADSLOT1PROCONE},
-        {"threadSlot1ProcTwo",  required_argument, NULL, LONG_OPTION_THREADSLOT1PROCTWO},
-        {"threadSlot1ProcThree",  required_argument, NULL, LONG_OPTION_THREADSLOT1PROCTHREE},
-		{"threadDlschTdOne",  required_argument, NULL, LONG_OPTION_THREADDLSCHTDONE},
-		{"threadDlschTdTwo",  required_argument, NULL, LONG_OPTION_THREADDLSCHTDTWO},
-		{"threadDlschTdThree",  required_argument, NULL, LONG_OPTION_THREADDLSCHTDTHREE},
-		{"threadDlschTd1One",  required_argument, NULL, LONG_OPTION_THREADDLSCHTD1ONE},
-		{"threadDlschTd1Two",  required_argument, NULL, LONG_OPTION_THREADDLSCHTD1TWO},
-		{"threadDlschTd1Three",  required_argument, NULL, LONG_OPTION_THREADDLSCHTD1THREE},
-        {"DCIformat",  required_argument, NULL, LONG_OPTION_DCIFORMAT},
-        {"AgregationLevel",  required_argument, NULL, LONG_OPTION_AGREGATIONLEVEL},
-        {"dlsch-demod-shift", required_argument,  NULL, LONG_OPTION_DEMOD_SHIFT},
-#if T_TRACER
-        {"T_port",                 required_argument, 0, LONG_OPTION_T_PORT},
-        {"T_nowait",               no_argument,       0, LONG_OPTION_T_NOWAIT},
-        {"T_dont_fork",            no_argument,       0, LONG_OPTION_T_DONT_FORK},
-#endif
-    {NULL, 0, NULL, 0}
-  };
-
-  while ((c = getopt_long (argc, argv, "A:a:C:dEK:g:F:G:hqO:m:n:SUVRM:r:P:Ws:t:Tx:",long_options,NULL)) != -1) {
-    switch (c) {
-    case LONG_OPTION_RF_CONFIG_FILE:
-      if ((strcmp("null", optarg) == 0) || (strcmp("NULL", optarg) == 0)) {
-	printf("no configuration filename is provided\n");
-      }
-      else if (strlen(optarg)<=1024){
-	strcpy(rf_config_file,optarg);
-      }else {
-	printf("Configuration filename is too long\n");
-	exit(-1);   
-      }
-      break;
-    case LONG_OPTION_MAXPOWER:
-      tx_max_power[0]=atoi(optarg);
-      for (CC_id=1;CC_id<MAX_NUM_CCs;CC_id++)
-	tx_max_power[CC_id]=tx_max_power[0];
-      break;
-    case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
-      ULSCH_max_consecutive_errors = atoi(optarg);
-      printf("Set ULSCH_max_consecutive_errors = %d\n",ULSCH_max_consecutive_errors);
-      break;
-
-    case LONG_OPTION_CALIB_UE_RX:
-      mode = rx_calib_ue;
-      rx_input_level_dBm = atoi(optarg);
-      printf("Running with UE calibration on (LNA max), input level %d dBm\n",rx_input_level_dBm);
-      break;
-
-    case LONG_OPTION_CALIB_UE_RX_MED:
-      mode = rx_calib_ue_med;
-      rx_input_level_dBm = atoi(optarg);
-      printf("Running with UE calibration on (LNA med), input level %d dBm\n",rx_input_level_dBm);
-      break;
-
-    case LONG_OPTION_CALIB_UE_RX_BYP:
-      mode = rx_calib_ue_byp;
-      rx_input_level_dBm = atoi(optarg);
-      printf("Running with UE calibration on (LNA byp), input level %d dBm\n",rx_input_level_dBm);
-      break;
-
-    case LONG_OPTION_DEBUG_UE_PRACH:
-      mode = debug_prach;
-      break;
-
-    case LONG_OPTION_NO_L2_CONNECT:
-      mode = no_L2_connect;
-      break;
-
-    case LONG_OPTION_CALIB_PRACH_TX:
-      mode = calib_prach_tx;
-      printf("Setting mode to calib_prach_tx (%d)\n",mode);
-      break;
-
-    case LONG_OPTION_RXGAIN:
-      for (i=0; i<4; i++)
-        rx_gain[0][i] = atof(optarg);
-
-      break;
-
-    case LONG_OPTION_RXGAINOFF:
-      rx_gain_off = atof(optarg);
-      break;
-
-    case LONG_OPTION_TXGAIN:
-      for (i=0; i<4; i++)
-        tx_gain[0][i] = atof(optarg);
-
-      break;
-    case LONG_OPTION_NBRXANT:
-    	nb_antenna_rx = atof(optarg);
-    	break;
-    case LONG_OPTION_NBTXANT:
-    	nb_antenna_tx = atof(optarg);
-    	break;
-    case LONG_OPTION_SCANCARRIER:
-      UE_scan_carrier=1;
-
-      break;
-
-    case LONG_OPTION_LOOPMEMORY:
-      mode=loop_through_memory;
-      input_fd = fopen(optarg,"r");
-      AssertFatal(input_fd != NULL,"Please provide an input file\n");
-      break;
-
-    case LONG_OPTION_DUMP_FRAME:
-      mode = rx_dump_frame;
-      break;
-      
-    case LONG_OPTION_PHYTEST:
-      phy_test = 1;
-      break;
-
-    case LONG_OPTION_USIMTEST:
-        usim_test = 1;
-      break;
-    case LONG_OPTION_MMAPPED_DMA:
-      mmapped_dma = 1;
-      break;
-
-    case LONG_OPTION_SINGLE_THREAD_DISABLE:
-      single_thread_flag = 0;
-      break;
-
-    case LONG_OPTION_EXTERNAL_CLOCK:
-      clock_source = external;
-      break;
-
-    case LONG_OPTION_WAIT_FOR_SYNC:
-      wait_for_sync = 1;
-      break;
-
-    case LONG_OPTION_THREADIQ:
-       threads.iq=atoi(optarg);
-       break;
-    case LONG_OPTION_THREADONESUBFRAME:
-       threads.one=atoi(optarg);
-       break;
-    case LONG_OPTION_THREADTWOSUBFRAME:
-       threads.two=atoi(optarg);
-       break;
-    case LONG_OPTION_THREADTHREESUBFRAME:
-       threads.three=atoi(optarg);
-    break;
-    case LONG_OPTION_THREADSLOT1PROCONE:
-       threads.slot1_proc_one=atoi(optarg);
-       break;
-    case LONG_OPTION_THREADSLOT1PROCTWO:
-       threads.slot1_proc_two=atoi(optarg);
-       break;
-    case LONG_OPTION_THREADSLOT1PROCTHREE:
-       threads.slot1_proc_three=atoi(optarg);
-       break;
-    case LONG_OPTION_THREADDLSCHTDONE:
-       threads.dlsch_td_one=atoi(optarg);
-       break;
-	case LONG_OPTION_THREADDLSCHTDTWO:
-       threads.dlsch_td_two=atoi(optarg);
-	   break;
-	case LONG_OPTION_THREADDLSCHTDTHREE:
-       threads.dlsch_td_three=atoi(optarg);
-    break;
-    case LONG_OPTION_THREADDLSCHTD1ONE:
-    	threads.dlsch_td1_one=atoi(optarg);
-    	break;
-	case LONG_OPTION_THREADDLSCHTD1TWO:
-		threads.dlsch_td1_two=atoi(optarg);
-	   break;
-	case LONG_OPTION_THREADDLSCHTD1THREE:
-		threads.dlsch_td1_three=atoi(optarg);
-		break;
-    case LONG_OPTION_DCIFORMAT:
-        dci_Format = atoi(optarg);
-       break;
-    case LONG_OPTION_AGREGATIONLEVEL:
-        agregation_Level = atoi(optarg);
-        break;
-    case LONG_OPTION_DEMOD_SHIFT: {
-        extern int16_t dlsch_demod_shift;
-        dlsch_demod_shift = atof(optarg);
-        break;
-    }
-#if T_TRACER
-        case LONG_OPTION_T_PORT: {
-            extern int T_port;
-            if (optarg == NULL) abort();  /* should not happen */
-            T_port = atoi(optarg);
-            break;
-        }
-
-        case LONG_OPTION_T_NOWAIT: {
-            extern int T_wait;
-            T_wait = 0;
-            break;
-        }
-
-        case LONG_OPTION_T_DONT_FORK: {
-            extern int T_dont_fork;
-            T_dont_fork = 1;
-            break;
-        }
-#endif
-
-        case 'A':
-            timing_advance = atoi (optarg);
-            break;
-
-        case 'C':
-            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];
-                printf("Downlink for CC_id %d frequency set to %u\n", CC_id, downlink_frequency[CC_id][0]);
-            }
-
-            UE_scan=0;
-
-            break;
-
-        case 'a':
-            chain_offset = atoi(optarg);
-            break;
-
-        case 'd':
-#ifdef XFORMS
-            do_forms=1;
-            printf("Running with XFORMS!\n");
-#endif
-            break;
-
-        case 'E':
-            threequarter_fs=1;
-            break;
-
-        case 'K':
-#if defined(ENABLE_ITTI)
-            itti_dump_file = strdup(optarg);
-#else
-            printf("-K option is disabled when ENABLE_ITTI is not defined\n");
-#endif
-            break;
-
-        case 'O':
-            conf_config_file_name = optarg;
-            break;
-
-        case 'U':
-            UE_flag = 1;
-            break;
-
-        case 'm':
-            target_dl_mcs = atoi (optarg);
-            break;
-
-        case 't':
-            target_ul_mcs = atoi (optarg);
-            break;
-
-        case 'W':
-            opt_enabled=1;
-            opt_type = OPT_WIRESHARK;
-            strncpy(in_ip, "127.0.0.1", sizeof(in_ip));
-            in_ip[sizeof(in_ip) - 1] = 0; // terminate string
-            printf("Enabling OPT for wireshark for local interface");
-            /*
-            if (optarg == NULL){
-            in_ip[0] =NULL;
-            printf("Enabling OPT for wireshark for local interface");
-            } else {
-            strncpy(in_ip, optarg, sizeof(in_ip));
-            in_ip[sizeof(in_ip) - 1] = 0; // terminate string
-            printf("Enabling OPT for wireshark with %s \n",in_ip);
-            }
-                 */
-            break;
-
-        case 'P':
-            opt_type = OPT_PCAP;
-            opt_enabled=1;
-
-            if (optarg == NULL) {
-                strncpy(in_path, "/tmp/oai_opt.pcap", sizeof(in_path));
-                in_path[sizeof(in_path) - 1] = 0; // terminate string
-                printf("Enabling OPT for PCAP with the following path /tmp/oai_opt.pcap");
-            } else {
-                strncpy(in_path, optarg, sizeof(in_path));
-                in_path[sizeof(in_path) - 1] = 0; // terminate string
-                printf("Enabling OPT for PCAP  with the following file %s \n",in_path);
-            }
-
-            break;
-
-        case 'V':
-            ouput_vcd = 1;
-            break;
-
-        case  'q':
-            opp_enabled = 1;
-            break;
-
-        case  'R' :
-            online_log_messages =1;
-            break;
-
-        /*case 'r':
-            UE_scan = 0;
-
-            for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-                switch(atoi(optarg)) {
-                case 6:
-                    frame_parms[CC_id]->N_RB_DL=6;
-                    frame_parms[CC_id]->N_RB_UL=6;
-                    break;
-
-                case 25:
-                    frame_parms[CC_id]->N_RB_DL=25;
-                    frame_parms[CC_id]->N_RB_UL=25;
-                    break;
-
-                case 50:
-                    frame_parms[CC_id]->N_RB_DL=50;
-                    frame_parms[CC_id]->N_RB_UL=50;
-                    break;
-
-                case 100:
-                    frame_parms[CC_id]->N_RB_DL=100;
-                    frame_parms[CC_id]->N_RB_UL=100;
-                    break;
-
-                default:
-                    printf("Unknown N_RB_DL %d, switching to 25\n",atoi(optarg));
-                    break;
-                }
-            }
-
-            break;*/
-
-        case 's':
-#if defined(OAI_USRP) || defined(CPRIGW) || defined(OAI_ADRV9371_ZC706)
-
-            clock_src = atoi(optarg);
-
-            if (clock_src == 0) {
-                //  char ref[128] = "internal";
-                //strncpy(uhd_ref, ref, strlen(ref)+1);
-            } else if (clock_src == 1) {
-                //char ref[128] = "external";
-                //strncpy(uhd_ref, ref, strlen(ref)+1);
-            }
-
-#else
-            printf("Note: -s not defined for ExpressMIMO2\n");
-#endif
-            break;
-
-        case 'S':
-            exit_missed_slots=0;
-            printf("Skip exit for missed slots\n");
-            break;
-
-        case 'g':
-            glog_level=atoi(optarg); // value between 1 - 9
-            break;
-
-        case 'F':
-            break;
-
-        case 'G':
-            glog_verbosity=atoi(optarg);// value from 0, 0x5, 0x15, 0x35, 0x75
-            break;
-
-        case 'x':
-            printf("Transmission mode should be set in config file now\n");
-            exit(-1);
-            /*
-            transmission_mode = atoi(optarg);
-
-            if (transmission_mode > 7) {
-              printf("Transmission mode %d not supported for the moment\n",transmission_mode);
-              exit(-1);
-            }
-            */
-            break;
-
-        case 'T':
-            for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++)
-                frame_parms[CC_id]->frame_type = TDD;
-            break;
-
-        case 'n':
-	  numerology=atoi(optarg);
-	  break;
-
-        case 'h':
-            help ();
-            exit (-1);
-
-        default:
-            help ();
-            exit (-1);
-            break;
-        }
-    }
-
-    if (UE_flag == 0)
-        AssertFatal(conf_config_file_name != NULL,"Please provide a configuration file\n");
-
-    if (UE_flag == 1) {
-        if (conf_config_file_name != NULL) {
-
-            // Here the configuration file is the XER encoded UE capabilities
-            // Read it in and store in asn1c data structures
-            strcpy(uecap_xer,conf_config_file_name);
-            uecap_xer_in=1;
-        }
-    }
 }
 
 #if T_TRACER
@@ -1163,11 +624,11 @@ int T_port = 2021;    /* default port to listen to to wait for the tracer */
 int T_dont_fork = 0;  /* default is to fork, see 'T_init' to understand */
 #endif
 
-void set_default_frame_parms(nfapi_config_request_t *config[MAX_NUM_CCs], NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
+  void set_default_frame_parms(nfapi_config_request_t *config[MAX_NUM_CCs], NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
 
-    int CC_id;
+  int CC_id;
 
-    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
         frame_parms[CC_id] = (NR_DL_FRAME_PARMS*) malloc(sizeof(NR_DL_FRAME_PARMS));
         /* Set some default values that may be overwritten while reading options */
         frame_parms[CC_id] = (NR_DL_FRAME_PARMS*) malloc(sizeof(NR_DL_FRAME_PARMS));
@@ -1181,7 +642,7 @@ void set_default_frame_parms(nfapi_config_request_t *config[MAX_NUM_CCs], NR_DL_
         config[CC_id]->rf_config.rx_antenna_ports.value = 1;
         config[CC_id]->sch_config.physical_cell_id.value = 0;
 
-        /*frame_parms[CC_id]->frame_type          = FDD;
+    /*frame_parms[CC_id]->frame_type          = FDD;
         frame_parms[CC_id]->tdd_config          = 3;
         frame_parms[CC_id]->tdd_config_S        = 0;
         frame_parms[CC_id]->N_RB_DL             = 100;
@@ -1198,7 +659,7 @@ void set_default_frame_parms(nfapi_config_request_t *config[MAX_NUM_CCs], NR_DL_
 
         ///frame_parms[CC_id]->phich_config_common.phich_resource = oneSixth;
         //frame_parms[CC_id]->phich_config_common.phich_duration = normal;
-        // UL RS Config
+    // UL RS Config
         /*frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 1;//n_DMRS1 set to 0
         frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
         frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
@@ -1229,7 +690,7 @@ void set_default_frame_parms(nfapi_config_request_t *config[MAX_NUM_CCs], NR_DL_
     }
 
 }
-/*void init_openair0(void);
+void init_openair0(void);
 void init_openair0() {
 
     int card;
@@ -1329,7 +790,7 @@ void init_openair0() {
 
 
   }
-}*/
+}
 
 int main( int argc, char **argv ) {
     int i,j,k,aa,re;
@@ -1356,6 +817,8 @@ int main( int argc, char **argv ) {
 #endif
 
     PHY_VARS_NR_UE *UE[MAX_NUM_CCs];
+    UE[0] = malloc(sizeof(PHY_VARS_NR_UE*));
+    //UE[1] = (PHY_VARS_NR_UE *)malloc(sizeof(PHY_VARS_NR_UE));
 
     mode = normal_txrx;
     memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS);
@@ -1378,7 +841,7 @@ int main( int argc, char **argv ) {
 #endif
 
     // initialize the log (see log.h for details)
-    set_glog(glog_level, glog_verbosity);
+    //set_glog(glog_level, glog_verbosity);
 
     //randominit (0);
     set_taus_seed (0);
@@ -1453,7 +916,7 @@ int main( int argc, char **argv ) {
 #endif
 
 
-    check_clock();
+  check_clock();
 
 #ifndef PACKAGE_VERSION
 #  define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL"
@@ -1464,13 +927,13 @@ int main( int argc, char **argv ) {
   // init the parameters
   for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
 
-    if (UE_flag==1) {
+
       frame_parms[CC_id]->nb_antennas_tx     = nb_antenna_tx;
       frame_parms[CC_id]->nb_antennas_rx     = nb_antenna_rx;
       frame_parms[CC_id]->nb_antenna_ports_eNB = 1; //initial value overwritten by initial sync later
 
       LOG_I(PHY,"Set nb_rx_antenna %d , nb_tx_antenna %d \n",frame_parms[CC_id]->nb_antennas_rx, frame_parms[CC_id]->nb_antennas_tx);
-    }
+
 
     //init_ul_hopping(frame_parms[CC_id]);
     //nr_init_frame_parms(frame_parms[CC_id],1);
@@ -1480,27 +943,28 @@ int main( int argc, char **argv ) {
 
 
 
-    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
         //init prach for openair1 test
-
         // prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type);
         // N_ZC = (prach_fmt <4)?839:139;
     }
 
-    if (UE_flag==1) {
-        NB_UE_INST=1;
+        /*NB_UE_INST=1;
         NB_INST=1;
-
-
         PHY_vars_UE_g = malloc(sizeof(PHY_VARS_NR_UE**));
-        PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE*)*MAX_NUM_CCs);
+        PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE*)*MAX_NUM_CCs);*/
 
         for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+        	NB_UE_INST=1;
+        	        NB_INST=1;
+        	        PHY_vars_UE_g = malloc(sizeof(PHY_VARS_NR_UE**));
+        	        PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE*)*MAX_NUM_CCs);
 
-            //PHY_vars_UE_g[0][CC_id] = init_lte_UE(frame_parms[CC_id], 0,abstraction_flag);
-            UE[CC_id] = PHY_vars_UE_g[0][CC_id];
             printf("PHY_vars_UE_g[0][%d] = %p\n",CC_id,UE[CC_id]);
 
+            PHY_vars_UE_g[0][CC_id] = init_nr_ue_vars(frame_parms[CC_id], 0,abstraction_flag);
+            UE[CC_id] = PHY_vars_UE_g[0][CC_id];
+
             if (phy_test==1)
                 UE[CC_id]->mac_enabled = 0;
             else
@@ -1508,24 +972,28 @@ int main( int argc, char **argv ) {
 
             if (UE[CC_id]->mac_enabled == 0) {  //set default UL parameters for testing mode
                 for (i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) {
-                    UE[CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
+                	//UE[CC_id]->pusch_config_dedicated[i] = malloc(sizeof(PUSCH_CONFIG_DEDICATED));
+
+                    //UE[CC_id]->scheduling_request_config[i] = malloc(sizeof(SCHEDULING_REQUEST_CONFIG));
+
+                    /*UE[CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
                     UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
                     UE[CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI;
 
                     UE[CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = 0;
                     UE[CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(0%3);
-                    UE[CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4;
+                    UE[CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4;*/
                 }
             }
 
             UE[CC_id]->UE_scan = UE_scan;
             UE[CC_id]->UE_scan_carrier = UE_scan_carrier;
             UE[CC_id]->mode    = mode;
-            printf("UE[%d]->mode = %d\n",CC_id,mode);
+            //printf("UE[%d]->mode = %d\n",CC_id,mode);
 
             for (uint8_t i=0; i<RX_NB_TH_MAX; i++) {
-                UE[CC_id]->pdcch_vars[i][0]->agregationLevel = agregation_Level;
-                UE[CC_id]->pdcch_vars[i][0]->dciFormat     = dci_Format;
+                //UE[CC_id]->pdcch_vars[i][0]->agregationLevel = agregation_Level;
+                //UE[CC_id]->pdcch_vars[i][0]->dciFormat     = dci_Format;
             }
 
             /*compute_prach_seq(&UE[CC_id]->frame_parms.prach_config_common,
@@ -1534,17 +1002,17 @@ int main( int argc, char **argv ) {
 
             if (UE[CC_id]->mac_enabled == 1)
             {
-                UE[CC_id]->pdcch_vars[0][0]->crnti = 0x1234;
-                UE[CC_id]->pdcch_vars[1][0]->crnti = 0x1234;
+                //UE[CC_id]->pdcch_vars[0][0]->crnti = 0x1234;
+                //UE[CC_id]->pdcch_vars[1][0]->crnti = 0x1234;
             }
             else
             {
-                UE[CC_id]->pdcch_vars[0][0]->crnti = 0x1235;
-                UE[CC_id]->pdcch_vars[1][0]->crnti = 0x1235;
+                //UE[CC_id]->pdcch_vars[0][0]->crnti = 0x1235;
+                //UE[CC_id]->pdcch_vars[1][0]->crnti = 0x1235;
             }
 
-            UE[CC_id]->rx_total_gain_dB =  (int)rx_gain[CC_id][0] + rx_gain_off;
-            UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id];
+            //UE[CC_id]->rx_total_gain_dB =  (int)rx_gain[CC_id][0] + rx_gain_off;
+            //UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id];
 
             if (frame_parms[CC_id]->frame_type==FDD) {
                 UE[CC_id]->N_TA_offset = 0;
@@ -1560,7 +1028,7 @@ int main( int argc, char **argv ) {
         }
 
         //  printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_poHwer,tx_max_power));
-    }
+  
 
     fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx);
     cpuf=get_cpu_freq_GHz();
@@ -1592,28 +1060,24 @@ int main( int argc, char **argv ) {
     }
 #endif
 
-    /* Check the actual affinity mask assigned to the thread */
-    s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
-    if (s != 0) {
-        perror( "pthread_getaffinity_np");
-        exit_fun("Error getting processor affinity ");
-    }
-    memset(cpu_affinity, 0 , sizeof(cpu_affinity));
-    for (int j = 0; j < CPU_SETSIZE; j++) {
-        if (CPU_ISSET(j, &cpuset)) {
-            char temp[1024];
-            sprintf(temp, " CPU_%d ", j);
-            strcat(cpu_affinity, temp);
-        }
+  /* Check the actual affinity mask assigned to the thread */
+  s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
+  if (s != 0) {
+    perror( "pthread_getaffinity_np");
+    exit_fun("Error getting processor affinity ");
+  }
+  memset(cpu_affinity, 0 , sizeof(cpu_affinity));
+  for (int j = 0; j < CPU_SETSIZE; j++) {
+    if (CPU_ISSET(j, &cpuset)) {
+      char temp[1024];
+      sprintf(temp, " CPU_%d ", j);
+      strcat(cpu_affinity, temp);
     }
-    LOG_I(HW, "CPU Affinity of main() function is... %s\n", cpu_affinity);
+  }
+  LOG_I(HW, "CPU Affinity of main() function is... %s\n", cpu_affinity);
 #endif
 
     openair0_cfg[0].log_level = glog_level;
-
-
-
-
     /*int eMBMS_active=0;
     if (node_function[0] <= NGFI_RAU_IF4p5) { // don't initialize L2 for RRU
         LOG_I(PHY,"Intializing L2\n");
@@ -1658,13 +1122,12 @@ int main( int argc, char **argv ) {
 #ifdef XFORMS
     int UE_id;
 
-    if (do_forms==1) {
-        fl_initialize (&argc, argv, NULL, 0, 0);
+  if (do_forms==1) {
+    fl_initialize (&argc, argv, NULL, 0, 0);
 
-        if (UE_flag==1) {
-            //form_stats = create_form_stats_form();
-            //fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
-            UE_id = 0;
+         //form_stats = create_form_stats_form();
+         //fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
+       UE_id = 0;
             form_ue[UE_id] = create_lte_phy_scope_ue();
             sprintf (title, "LTE DL SCOPE UE");
             fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
@@ -1679,7 +1142,7 @@ int main( int argc, char **argv ) {
             }*/
             fl_set_button(form_ue[UE_id]->button_0,0);
             fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
-        }
+        
 
         ret = pthread_create(&forms_thread, NULL, scope_thread, NULL);
 
@@ -1696,15 +1159,15 @@ int main( int argc, char **argv ) {
 
 
     // start the main thread
-    if (UE_flag == 1) {
+   if (UE_flag == 1) {
         init_UE(1);
         number_of_cards = 1;
 
-        for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-            PHY_vars_UE_g[0][CC_id]->rf_map.card=0;
-            PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+chain_offset;
-        }
+    for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+      PHY_vars_UE_g[0][CC_id]->rf_map.card=0;
+      PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+chain_offset;
     }
+   }
 
     // connect the TX/RX buffers
     if (UE_flag==1) {
@@ -1715,10 +1178,10 @@ int main( int argc, char **argv ) {
 #if defined(OAI_USRP) || defined(OAI_ADRV9371_ZC706)
             UE[CC_id]->hw_timing_advance = timing_advance;
 #else
-            UE[CC_id]->hw_timing_advance = 160;
+      UE[CC_id]->hw_timing_advance = 160;
 #endif
-        }
-        if (setup_ue_buffers(UE,&openair0_cfg[0])!=0) {
+    }
+	if (setup_ue_buffers(UE,&openair0_cfg[0])!=0) {
             printf("Error setting up eNB buffer\n");
             exit(-1);
         }
@@ -1760,44 +1223,24 @@ int main( int argc, char **argv ) {
 
 #endif
 
-    // stop threads
+  // stop threads
 #ifdef XFORMS
-    printf("waiting for XFORMS thread\n");
-
-    if (do_forms==1) {
-        pthread_join(forms_thread,&status);
-        fl_hide_form(form_stats->stats_form);
-        fl_free_form(form_stats->stats_form);
-
-        if (UE_flag==1) {
-            fl_hide_form(form_ue[0]->lte_phy_scope_ue);
-            fl_free_form(form_ue[0]->lte_phy_scope_ue);
-        } else {
-            fl_hide_form(form_stats_l2->stats_form);
-            fl_free_form(form_stats_l2->stats_form);
-
-            for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
-                for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-                    fl_hide_form(form_enb[CC_id][UE_id]->lte_phy_scope_enb);
-                    fl_free_form(form_enb[CC_id][UE_id]->lte_phy_scope_enb);
-                }
-            }
-        }
-    }
+  printf("waiting for XFORMS thread\n");
+
+  if (do_forms==1) {
+    pthread_join(forms_thread,&status);
+    fl_hide_form(form_stats->stats_form);
+    fl_free_form(form_stats->stats_form);
+    fl_hide_form(form_ue[0]->lte_phy_scope_ue);
+    fl_free_form(form_ue[0]->lte_phy_scope_ue);
+  }
 
 #endif
 
-    printf("stopping MODEM threads\n");
-
-    // cleanup
-    if (UE_flag == 1) {
-    } else {
-    //    stop_eNB(1);
-    }
-
+  printf("stopping MODEM threads\n");
 
-    pthread_cond_destroy(&sync_cond);
-    pthread_mutex_destroy(&sync_mutex);
+  pthread_cond_destroy(&sync_cond);
+  pthread_mutex_destroy(&sync_mutex);
 
 
     // *** Handle per CC_id openair0