diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 106fb369db1bb6472a66d479d33a79df566998a7..baa4ff1642c37f54327df9f4982fcf2859fad543 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -360,7 +360,15 @@ static bool is_equal(double a, double b)
   return std::fabs(a-b) < std::numeric_limits<double>::epsilon();
 }
 
-/*! \brief Set frequencies (TX/RX)
+void *freq_thread(void *arg) {
+  
+  openair0_device *device=(openair0_device *)arg;
+  usrp_state_t *s = (usrp_state_t*)device->priv;
+  
+  s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]);
+  s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]);
+}
+/*! \brief Set frequencies (TX/RX). Spawns a thread to handle the frequency change to not block the calling thread
  * \param device the hardware to use
  * \param openair0_cfg RF frontend parameters set by application
  * \param dummy dummy variable not used
@@ -369,10 +377,12 @@ static bool is_equal(double a, double b)
 int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) {
 
   usrp_state_t *s = (usrp_state_t*)device->priv;
+  pthread_t f_thread;
 
   printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]);
-  s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[0]);
-  s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[0]);
+
+  // spawn a thread to handle the frequency change to not block the calling thread
+  pthread_create(&f_thread,NULL,freq_thread,(void*)device);
 
   return(0);