diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 54345dc6b022cf4555dd81a49cdbe64c55831dee..3a47a6bc795be0353e488be6b22d7bb23a553309 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -833,16 +833,14 @@ int main( int argc, char **argv ) {
 
   /* release memory used by the RU/gNB threads (incomplete), after all
    * threads have been stopped (they partially use the same memory) */
-  for (int inst = 0; inst < NB_gNB_INST; inst++) {
-    //free_transport(RC.gNB[inst]);
-    phy_free_nr_gNB(RC.gNB[inst]);
-  }
-
   for (int inst = 0; inst < NB_RU; inst++) {
-    kill_NR_RU_proc(inst);
     nr_phy_free_RU(RC.ru[inst]);
   }
 
+  for (int inst = 0; inst < NB_gNB_INST; inst++) {
+    phy_free_nr_gNB(RC.gNB[inst]);
+  }
+
   pthread_cond_destroy(&sync_cond);
   pthread_mutex_destroy(&sync_mutex);
   pthread_cond_destroy(&nfapi_sync_cond);
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index c3baa06da64d3e469e22fafc32611bef59c0beca..fec343ccfb00d3a4dd623f69fabcdfbb54cfaec1 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -625,7 +625,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
 
   gNB->first_run_I0_measurements = 1;
 
-  common_vars->rxdata  = (int32_t **)malloc16(Prx*sizeof(int32_t*));
   common_vars->txdataF = (int32_t **)malloc16(Ptx*sizeof(int32_t*));
   common_vars->rxdataF = (int32_t **)malloc16(Prx*sizeof(int32_t*));
   common_vars->beam_id = (uint8_t **)malloc16(Ptx*sizeof(uint8_t*));
@@ -640,7 +639,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
   }
   for (i=0;i<Prx;i++){
     common_vars->rxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t));
-    common_vars->rxdata[i] = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t));
   }
   common_vars->debugBuff = (int32_t*)malloc16_clear(fp->samples_per_frame*sizeof(int32_t)*100);	
   common_vars->debugBuff_sample_offset = 0; 
@@ -786,11 +784,9 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
 
   for (int i = 0; i < Prx; ++i) {
     free_and_zero(common_vars->rxdataF[i]);
-    free_and_zero(common_vars->rxdata[i]);
   }
 
   free_and_zero(common_vars->txdataF);
-  free_and_zero(common_vars->rxdata);
   free_and_zero(common_vars->rxdataF);
   free_and_zero(common_vars->beam_id);
 
diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c
index 75d78738fc6fa74f9d3e821087ea5479a43654ea..d12834d620bcb9031fbdf794ad0b469ad22440af 100644
--- a/openair1/PHY/INIT/nr_init_ru.c
+++ b/openair1/PHY/INIT/nr_init_ru.c
@@ -176,8 +176,11 @@ void nr_phy_free_RU(RU_t *ru)
   LOG_I(PHY, "Feeing RU signal buffers (if_south %s) nb_tx %d\n", ru_if_types[ru->if_south], ru->nb_tx);
 
   if (ru->if_south <= REMOTE_IF5) { // this means REMOTE_IF5 or LOCAL_RF, so free memory for time-domain signals
-    for (i = 0; i < ru->nb_tx; i++)
-      free_and_zero(ru->common.txdata[i]);
+    // Hack: undo what is done at allocation
+    for (i = 0; i < ru->nb_tx; i++) {
+      int32_t *p = &ru->common.txdata[i][-ru->sf_extension];
+      free_and_zero(p);
+    }
     free_and_zero(ru->common.txdata);
 
     for (i = 0; i < ru->nb_rx; i++)
@@ -198,8 +201,10 @@ void nr_phy_free_RU(RU_t *ru)
     free_and_zero(ru->common.txdataF_BF);
 
     // free FFT output buffers (RX)
-    for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdataF[i]);
-    free_and_zero(ru->common.rxdataF);
+    // HACK: cannot free here, or the gNB code in phy_free_nr_gNB() will
+    // segfault. The rxdataF memory between RU and gNB is not properly handled!
+    //for (i = 0; i < ru->nb_rx; i++) free_and_zero(ru->common.rxdataF[i]);
+    //free_and_zero(ru->common.rxdataF);
 
     for (j=0;j<NUMBER_OF_NR_RU_PRACH_OCCASIONS_MAX;j++) {
       for (i = 0; i < ru->nb_rx; i++)