diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 23b4c2a8376e90349ce8a7f03fbc36dd85dcfb0a..32f7f28a3730b6c53d8b0aa5f3da1cf0d28bb6bf 100755
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -102,6 +102,8 @@ typedef enum {
 #define CONFIG_STRING_RU_MAX_RXGAIN               "max_rxgain"
 #define CONFIG_STRING_RU_IF_COMPRESSION           "if_compression"
 #define CONFIG_STRING_RU_NBIOTRRC_LIST            "NbIoT_RRC_instances"
+#define CONFIG_STRING_RU_SDR_ADDRS                "sdr_addrs"
+#define CONFIG_STRING_RU_SDR_CLK_SRC              "clock_src"
 
 #define RU_LOCAL_IF_NAME_IDX          0
 #define RU_LOCAL_ADDRESS_IDX          1
@@ -121,6 +123,8 @@ typedef enum {
 #define RU_ATT_TX_IDX                 15
 #define RU_ATT_RX_IDX                 16
 #define RU_NBIOTRRC_LIST_IDX          17
+#define RU_SDR_ADDRS                  18
+#define RU_SDR_CLK_SRC                19
 
 
 
@@ -147,6 +151,8 @@ typedef enum {
 {CONFIG_STRING_RU_ATT_TX,                   	 NULL,       0,       uptr:NULL,       defintval:0,		TYPE_UINT,	  0}, \
 {CONFIG_STRING_RU_ATT_RX,                   	 NULL,       0,       uptr:NULL,       defintval:0,		TYPE_UINT,	  0}, \
 {CONFIG_STRING_RU_NBIOTRRC_LIST,                 NULL,       0,       uptr:NULL,       defintarrayval:DEFENBS,  TYPE_INTARRAY,    1}, \
+{CONFIG_STRING_RU_SDR_ADDRS,                 	 NULL,       0,       strptr:NULL,     defstrval:"0.0.0.0",   TYPE_STRING,      0}, \
+{CONFIG_STRING_RU_SDR_CLK_SRC,               	 NULL,       0,       strptr:NULL,     defstrval:"internal",   TYPE_STRING,      0}, \
 }
 
 /*---------------------------------------------------------------------------------------------------------------------------------------*/
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 433e29e97db7b15322b51d8f3282daa91b922c09..0ef3cd233f57433e6ca3dad9ad399d630206d7d7 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -199,6 +199,8 @@ typedef struct {
   double tx_bw;
   //! clock source 
   clock_source_t clock_source;
+  //! Manual SDR IP address
+  char *sdr_addrs;
   //! Auto calibration flag
   int autocal[4];
   //! rf devices work with x bits iqs when oai have its own iq format
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index e2ecaed04453194c40afe3604d63a3b88385ac9f..0c02075a1d2deae000293345444376ce9b77e72a 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -950,11 +950,15 @@ int trx_usrp_recplay_config_init(paramdef_t *usrp_recplay_params) {
 #endif
 
 extern "C" {
-    /*! \brief Initialize Openair USRP target. It returns 0 if OK
-    * \param device the hardware to use
-         * \param openair0_cfg RF frontend parameters set by application
-         */
-    int device_init(openair0_device* device, openair0_config_t *openair0_cfg) {
+  /*! \brief Initialize Openair USRP target. It returns 0 if OK
+   * \param device the hardware to use
+   * \param openair0_cfg RF frontend parameters set by application
+   */
+  int device_init(openair0_device* device, openair0_config_t *openair0_cfg) {
+
+    LOG_D(PHY, "openair0_cfg[0].sdr_addrs == '%s'\n", openair0_cfg[0].sdr_addrs);
+    LOG_D(PHY, "openair0_cfg[0].clock_source == '%d'\n", openair0_cfg[0].clock_source);
+
 #if defined(USRP_REC_PLAY)
       paramdef_t usrp_recplay_params[7];
       struct sysinfo systeminfo;
@@ -1022,8 +1026,30 @@ extern "C" {
         // Initialize USRP device
         device->openair0_cfg = openair0_cfg;
 
-        std::string args = "type=b200";
-        uhd::device_addrs_t device_adds = uhd::device::find(args);
+      std::string args = "type=b200";
+
+      char *addr_args = NULL;
+      // Check whether sdr_addrs is set in the config or not
+      if (openair0_cfg[0].sdr_addrs != NULL) {
+	if (strcmp(openair0_cfg[0].sdr_addrs, "0.0.0.0") != 0) {
+        // Check whether sdr_addrs contains multiple IP addresses
+        // and split and add them to addr_args
+          if (strstr(openair0_cfg[0].sdr_addrs, ",") != NULL) {
+            char *addr0 = openair0_cfg[0].sdr_addrs;
+            // Replace , with \0
+            strsep(&openair0_cfg[0].sdr_addrs, ",");
+            char *addr1 = openair0_cfg[0].sdr_addrs;
+            // Allocate memory for ",addr0=,addr1=\0" and the addresses
+            size_t addr_args_len = sizeof(char)*(15 + strlen(addr0) + strlen(addr1));
+            addr_args = (char *)malloc(addr_args_len);
+            snprintf(addr_args, addr_args_len, ",addr0=%s,addr1=%s", addr0, addr1);
+            args += addr_args;
+            LOG_D(PHY, "addr_args == '%s'\n", addr_args);
+	  }
+        }
+      }
+
+      uhd::device_addrs_t device_adds = uhd::device::find(args);
 
         int vers=0,subvers=0,subsubvers=0;
         int bw_gain_adjust=0;
@@ -1037,12 +1063,17 @@ extern "C" {
         LOG_I(PHY,"Checking for USRPs : UHD %s (%d.%d.%d)\n",
               uhd::get_version_string().c_str(),vers,subvers,subsubvers);
 
-        if(device_adds.size() == 0)  {
-            double usrp_master_clock = 184.32e6;
-            std::string args = "type=x300";
+      if(device_adds.size() == 0)  {
+
+        double usrp_master_clock = 184.32e6;
+        std::string args = "type=x300";
+        
+	if (addr_args) {
+          args += addr_args;
+        }
 
-            // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate
-            args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
+        // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate
+        args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
 
             //    args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096";
             uhd::device_addrs_t device_adds = uhd::device::find(args);
@@ -1232,12 +1263,14 @@ extern "C" {
             }
         }
 
-        for(int i=0; i<s->usrp->get_tx_num_channels(); i++) {
-	  ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i);
-            if (i<openair0_cfg[0].tx_num_channels) {
-                s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i);
-                s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i);
-                s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i);
+      LOG_D(PHY, "usrp->get_tx_num_channels() == %d\n", s->usrp->get_tx_num_channels());
+      LOG_D(PHY, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels);
+      for(int i=0; i<s->usrp->get_tx_num_channels(); i++) {
+        ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i);
+        if (i<openair0_cfg[0].tx_num_channels) {
+          s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i);
+          s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i);
+          s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i);
 
                 LOG_I(PHY,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]);
             }
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 891dd9e272ff29cbe523236a3eff4b1cc206df4f..40906f09ce81c1f3e4ae4ea80f01bec2588168e5 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -2837,6 +2837,24 @@ void RCconfig_RU(void) {
 	    RC.ru[j]->num_eNB                           = 0;
       for (i=0;i<RC.ru[j]->num_eNB;i++) RC.ru[j]->eNB_list[i] = RC.eNB[RUParamList.paramarray[j][RU_ENB_LIST_IDX].iptr[i]][0];     
 
+      if (config_isparamset(RUParamList.paramarray[j], RU_SDR_ADDRS)) {
+        RC.ru[j]->openair0_cfg.sdr_addrs = strdup(*(RUParamList.paramarray[j][RU_SDR_ADDRS].strptr));
+      }
+
+      if (config_isparamset(RUParamList.paramarray[j], RU_SDR_CLK_SRC)) {
+        if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "internal") == 0) {
+          RC.ru[j]->openair0_cfg.clock_source = internal;
+          LOG_D(PHY, "RU clock source set as internal\n");
+        } else if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "external") == 0) {
+          RC.ru[j]->openair0_cfg.clock_source = external;
+          LOG_D(PHY, "RU clock source set as external\n");
+        } else if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "gpsdo") == 0) {
+          RC.ru[j]->openair0_cfg.clock_source = gpsdo;
+          LOG_D(PHY, "RU clock source set as gpsdo\n");
+        } else {
+          LOG_E(PHY, "Erroneous RU clock source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr));
+        }
+      }
 
       if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) {
 	if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) {