diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 9dac378d32620e66853063dc57a01c52bef6290b..105aafd90e0ef9b3287a10f3d8a65b12e680b51e 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -54,6 +54,8 @@ typedef struct {
   int Mod_id;
   /* the sample rate for both transmit and receive. */
   double sample_rate;
+  /* number of samples per RX/TX packet (USRP + Ethernet) */
+  int samples_per_packet;
   /* number of RX channels (=RX antennas) */
   int rx_num_channels;
   /* number of TX channels (=TX antennas) */
@@ -106,7 +108,7 @@ struct openair0_device_t {
    * the first channel. timestamp if the time (in samples) at which the first sample
    * MUST be sent
    * use flags = 1 to send as timestamp specfied*/
-  void (*trx_write_func)(openair0_device *device, openair0_timestamp timestamp, const void **buff, int nsamps, int cc, int flags);
+  void (*trx_write_func)(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags);
 
   /* Read 'nsamps' samples from each channel to buffers. buff[0] is the array for
    * the first channel. *ptimestamp is the time at which the first sample
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index becf4b4026f80c04c8389b4951467879d42dd533..6c439928b7b10b348fb4e165a15952091464f734 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -119,7 +119,7 @@ static void trx_usrp_end(openair0_device *device)
 	s->tx_stream->send("", 0, s->tx_md);
 	s->tx_md.end_of_burst = false;
 }
-static void trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, const void **buff, int nsamps, int cc, int flags)
+static void trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags)
 {
   usrp_state_t *s = (usrp_state_t*)device->priv;
 
@@ -128,7 +128,14 @@ static void trx_usrp_write(openair0_device *device, openair0_timestamp timestamp
     s->tx_md.has_time_spec = true;
   else
     s->tx_md.has_time_spec = false;
-  s->tx_stream->send(buff, nsamps, s->tx_md);
+
+  if (cc>1) {
+    std::vector<void *> buff_ptrs;
+    for (int i=0;i<cc;i++) buff_ptrs.push_back(buff[i]);
+    s->tx_stream->send(buff_ptrs, nsamps, s->tx_md);
+  }
+  else
+    s->tx_stream->send(buff[0], nsamps, s->tx_md);
   s->tx_md.start_of_burst = false;
 }
 
@@ -139,7 +146,13 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
 
   int samples_received,i;
   
-  samples_received = s->rx_stream->recv(buff, nsamps, s->rx_md);
+  if (cc>1) {
+    std::vector<void *> buff_ptrs;
+    for (int i=0;i<cc;i++) buff_ptrs.push_back(buff[i]);
+    samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md);
+  }
+  else
+    samples_received = s->rx_stream->recv(buff[0], nsamps, s->rx_md);
 
   //handle the error code
   switch(s->rx_md.error_code){
@@ -203,6 +216,10 @@ int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cf
 
   // Initialize USRP device
   std::string args = "type=b200";
+
+  /*  std::string rx_subdev = "A:A A:B";
+      std::string tx_subdev = "A:A A:B";*/
+
   uhd::device_addrs_t device_adds = uhd::device::find(args);
   size_t i;
 
@@ -214,31 +231,44 @@ int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cf
   }
   s->usrp = uhd::usrp::multi_usrp::make(args);
 
+  //  s->usrp->set_rx_subdev_spec(rx_subdev);
+  //  s->usrp->set_tx_subdev_spec(tx_subdev);
+
   // lock mboard clocks
   s->usrp->set_clock_source("internal");
   // set master clock rate and sample rate for tx & rx for streaming
-  s->usrp->set_master_clock_rate(30.72e6);
-  s->usrp->set_rx_rate(openair0_cfg[0].sample_rate);
-  s->usrp->set_tx_rate(openair0_cfg[0].sample_rate);
+  s->usrp->set_master_clock_rate(15.36e6);
+
+
+
 
   for(i=0;i<s->usrp->get_rx_num_channels();i++) {
     if (i<openair0_cfg[0].rx_num_channels) {
-      s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i]);
-      s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]);
+      s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i);
+      s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw);
+      printf("Setting rx freq/gain on channel %d/%d\n",i,s->usrp->get_rx_num_channels());
+      s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i);
+      s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i],i);
     }
   }
   for(i=0;i<s->usrp->get_tx_num_channels();i++) {
     if (i<openair0_cfg[0].tx_num_channels) {
-      s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i]);
-      s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[i]);
+      s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i);
+      s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i);
+      printf("Setting tx freq/gain on channel %d/%d\n",i,s->usrp->get_tx_num_channels());
+      s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i);
+      s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[i],i);
     }
   }
-  s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw);
-  s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw);
+
+
 
   // create tx & rx streamer
   uhd::stream_args_t stream_args_rx("sc16", "sc16");
+  stream_args_rx.args["spp"] = str(boost::format("%d") % openair0_cfg[0].samples_per_packet);
+  
   uhd::stream_args_t stream_args_tx("sc16", "sc16");
+  stream_args_tx.args["spp"] = str(boost::format("%d") % openair0_cfg[0].samples_per_packet);
   for (i = 0; i<openair0_cfg[0].rx_num_channels; i++)
       stream_args_rx.channels.push_back(i);
   for (i = 0; i<openair0_cfg[0].tx_num_channels; i++)
@@ -250,21 +280,29 @@ int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cf
   s->usrp->set_time_now(uhd::time_spec_t(0.0));
 
   // display USRP settings
-  std::cout << std::endl<<boost::format("Actual TX sample rate: %fMSps...") % (s->usrp->get_tx_rate()/1e6) << std::endl;
-  std::cout << boost::format("Actual RX sample rate: %fMSps...") % (s->usrp->get_rx_rate()/1e6) << std::endl;
-  
-  std::cout << boost::format("Actual TX frequency: %fGHz...") % (s->usrp->get_tx_freq()/1e9) << std::endl;
-  std::cout << boost::format("Actual RX frequency: %fGHz...") % (s->usrp->get_rx_freq()/1e9) << std::endl;
-  
-  std::cout << boost::format("Actual TX gain: %f...") % (s->usrp->get_tx_gain()) << std::endl;
-  std::cout << boost::format("Actual RX gain: %f...") % (s->usrp->get_rx_gain()) << std::endl;
-  
-  std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth()/1e6) << std::endl;
-  std::cout << boost::format("Actual RX bandwidth: %fM...") % (s->usrp->get_rx_bandwidth()/1e6) << std::endl;
-  
-  std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna()) << std::endl;
-  std::cout << boost::format("Actual RX antenna: %s...") % (s->usrp->get_rx_antenna()) << std::endl;
-  
+  for (i=0;i<openair0_cfg[0].rx_num_channels;i++) {
+    if (i<openair0_cfg[0].rx_num_channels) {
+      printf("RX Channel %d\n",i);
+      std::cout << boost::format("Actual RX sample rate: %fMSps...") % (s->usrp->get_rx_rate(i)/1e6) << std::endl;
+      std::cout << boost::format("Actual RX frequency: %fGHz...") % (s->usrp->get_rx_freq(i)/1e9) << std::endl;
+      std::cout << boost::format("Actual RX gain: %f...") % (s->usrp->get_rx_gain(i)) << std::endl;
+      std::cout << boost::format("Actual RX bandwidth: %fM...") % (s->usrp->get_rx_bandwidth(i)/1e6) << std::endl;
+      std::cout << boost::format("Actual RX antenna: %s...") % (s->usrp->get_rx_antenna(i)) << std::endl;
+    }
+  }
+
+  for (i=0;i<openair0_cfg[0].tx_num_channels;i++) {
+
+    if (i<openair0_cfg[0].tx_num_channels) { 
+      printf("TX Channel %d\n",i);
+      std::cout << std::endl<<boost::format("Actual TX sample rate: %fMSps...") % (s->usrp->get_tx_rate(i)/1e6) << std::endl;
+      std::cout << boost::format("Actual TX frequency: %fGHz...") % (s->usrp->get_tx_freq(i)/1e9) << std::endl;
+      std::cout << boost::format("Actual TX gain: %f...") % (s->usrp->get_tx_gain(i)) << std::endl;
+      std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl;
+      std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl;
+    }
+  }
+
   std::cout << boost::format("Device timestamp: %f...") % (s->usrp->get_time_now().get_real_secs()) << std::endl;
 
   device->priv = s;