diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container
index 57738a318334aad50a3d5f8a6fdee7f4a2664b96..c22e6fabec717bc8f889846ee04c4cc3bcee9916 100644
--- a/ci-scripts/Jenkinsfile-GitLab-Container
+++ b/ci-scripts/Jenkinsfile-GitLab-Container
@@ -238,6 +238,26 @@ pipeline {
             }
           }
         }
+        stage ("5G L2 Simulators") {
+          when { expression {doMandatoryTests} }
+          steps {
+            script {
+              triggerSlaveJob ('RAN-L2-Sim-Test-5G', 'Test-L2-Sim-Container-5G')
+            }
+          }
+          post {
+            always {
+              script {
+                finalizeSlaveJob('RAN-L2-Sim-Test-5G')
+              }
+            }
+            failure {
+              script {
+                currentBuild.result = 'FAILURE'
+              }
+            }
+          }
+        }
         stage ("NSA B200 Sanity Check") {
           when { expression {doMandatoryTests} }
           steps {
diff --git a/ci-scripts/as_ue/oai_ext_app.sh b/ci-scripts/as_ue/oai_ext_app.sh
new file mode 100755
index 0000000000000000000000000000000000000000..727e2b5db2d1300ad5eea99de80d01b570773735
--- /dev/null
+++ b/ci-scripts/as_ue/oai_ext_app.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+ue_id="$1"      # UE id
+duration="$2"   # Sim duration
+
+shift
+shift
+
+function end
+{
+    exit 0
+}
+trap end INT TERM
+
+echo "ip netns exec $ue_id $@ > /tmp/test_${ue_id}.log"
+ip netns exec $ue_id $@ > /tmp/test_$ue_id.log
+
+
diff --git a/ci-scripts/as_ue/oaicicd-3xue-noPing-SATest.cfg b/ci-scripts/as_ue/oaicicd-3xue-noPing-SATest.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..a9299b67e319753e6ccd85813d8bb0305e72aa50
--- /dev/null
+++ b/ci-scripts/as_ue/oaicicd-3xue-noPing-SATest.cfg
@@ -0,0 +1,172 @@
+/* UE simulator configuration */
+
+
+/* UE simulator configuration file version 2021-06-17
+ * LTE / 5G Non StandAlone
+ * Copyright (C) 2019-2021 Amarisoft
+ */
+{
+#define N_ANTENNA_DL 1
+#define TDD 1
+#define CELL_BANDWIDTH 40
+#define UE_COUNT 3 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129
+
+
+log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
+log_filename: "/tmp/ue0.log",
+
+/* Enable remote API and Web interface */
+com_addr: "0.0.0.0:9002",
+
+include "rf_driver/1chan.cfg",
+
+/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */
+                    
+cell_groups: [{
+    group_type: "nr",
+    multi_ue: true,
+    cells: [{
+      rf_port: 0,
+      bandwidth: CELL_BANDWIDTH,
+#if TDD == 1
+      band: 78,
+      dl_nr_arfcn:621312,
+      ssb_nr_arfcn:621312,
+
+      //band: 41,
+      //dl_nr_arfcn:517020,
+      //ssb_nr_arfcn:516990,
+#else
+      band: 7,
+      dl_nr_arfcn: 536020,
+      ssb_nr_arfcn: 535930,
+      ssb_subcarrier_spacing: 15,
+#endif
+      subcarrier_spacing: 30,
+      n_antenna_dl: N_ANTENNA_DL,
+      n_antenna_ul: 1,
+      rx_to_tx_latency:2,
+    }],
+}],
+
+    
+/* Enable it to allow sim_events to be handled remotely */
+//rue_bind_addr: "127.0.10.11",
+
+
+
+ue_list: [
+  {
+    /* UE capabilities */ 
+    /* USIM data */    
+    "ue_id" : 0,
+    "imsi": "208970100001127",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      }, 
+      {
+        event: "power_off",
+        start_time: 30,
+      }
+    ] /*end sim events */
+  }, /*end UE object 0*/
+  {
+    /* UE capabilities */ 
+    /* USIM data */  
+    "ue_id" : 1, 
+    "imsi": "208970100001128",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      }, 
+      {
+        event: "power_off",
+        start_time: 30,
+      }
+    ] /*end sim events */
+  }, /*end UE object 1*/
+  {
+    /* UE capabilities */
+    /* USIM data */
+    "ue_id" : 2,
+    "imsi": "208970100001129",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      },
+      {
+        event: "power_off",
+        start_time: 30,
+      }
+    ] /*end sim events */
+  } /*end UE object 2*/
+  ],/*end UE list*/
+}/*end json*/
+
diff --git a/ci-scripts/as_ue/oaicicd-multi-ue-1xPing-SATest.cfg b/ci-scripts/as_ue/oaicicd-multi-ue-1xPing-SATest.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..3405f99a59ddee7f7294b2fa838dea6798ec5ef3
--- /dev/null
+++ b/ci-scripts/as_ue/oaicicd-multi-ue-1xPing-SATest.cfg
@@ -0,0 +1,142 @@
+/* UE simulator configuration */
+
+
+/* UE simulator configuration file version 2021-06-17
+ * LTE / 5G Non StandAlone
+ * Copyright (C) 2019-2021 Amarisoft
+ */
+{
+#define N_ANTENNA_DL 1
+#define TDD 1
+#define CELL_BANDWIDTH 40
+#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129
+
+
+log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
+log_filename: "/tmp/ue0.log",
+
+/* Enable remote API and Web interface */
+com_addr: "0.0.0.0:9002",
+
+include "rf_driver/1chan.cfg",
+
+/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */
+                    
+cell_groups: [{
+    group_type: "nr",
+    multi_ue: true,
+    cells: [{
+      rf_port: 0,
+      bandwidth: CELL_BANDWIDTH,
+#if TDD == 1
+      band: 78,
+      dl_nr_arfcn:621312,
+      ssb_nr_arfcn:621312,
+
+      //band: 41,
+      //dl_nr_arfcn:517020,
+      //ssb_nr_arfcn:516990,
+#else
+      band: 7,
+      dl_nr_arfcn: 536020,
+      ssb_nr_arfcn: 535930,
+      ssb_subcarrier_spacing: 15,
+#endif
+      subcarrier_spacing: 30,
+      n_antenna_dl: N_ANTENNA_DL,
+      n_antenna_ul: 1,
+      rx_to_tx_latency:2,
+    }],
+}],
+
+    
+/* Enable it to allow sim_events to be handled remotely */
+//rue_bind_addr: "127.0.10.11",
+
+
+
+ue_list: [
+  {
+    /* UE capabilities */ 
+    /* USIM data */    
+    "ue_id" : 1,
+    "imsi": "208970100001127",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      }, 
+      {
+        event: "power_off",
+        start_time: 30,
+      }
+    ] /*end sim events */
+  }, /*end UE object 0*/
+  {
+    /* UE capabilities */ 
+    /* USIM data */  
+    "ue_id" : 2, 
+    "imsi": "208970100001128",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      }, 
+      {
+       "tag": "ping",
+       "prog":"oai_ext_app.sh",
+        start_time: 15,
+        end_time: 25,
+        "args":["ping 192.168.70.136"],
+        "event":"ext_app"              
+      },
+      {
+        event: "power_off",
+        start_time: 30,
+      }
+    ] /*end sim events */
+  } /*end UE object 1*/
+  ],/*end UE list*/
+}/*end json*/
diff --git a/ci-scripts/as_ue/oaicicd-multi-ue-2xPing-SATest.cfg b/ci-scripts/as_ue/oaicicd-multi-ue-2xPing-SATest.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..eaa9b894fca3fe740c5af0fe870c42ba7c00fbc0
--- /dev/null
+++ b/ci-scripts/as_ue/oaicicd-multi-ue-2xPing-SATest.cfg
@@ -0,0 +1,150 @@
+/* UE simulator configuration */
+
+
+/* UE simulator configuration file version 2021-06-17
+ * LTE / 5G Non StandAlone
+ * Copyright (C) 2019-2021 Amarisoft
+ */
+{
+#define N_ANTENNA_DL 1
+#define TDD 1
+#define CELL_BANDWIDTH 40
+#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129
+
+
+log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
+log_filename: "/tmp/ue0.log",
+
+/* Enable remote API and Web interface */
+com_addr: "0.0.0.0:9002",
+
+include "rf_driver/1chan.cfg",
+
+/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */
+                    
+cell_groups: [{
+    group_type: "nr",
+    multi_ue: true,
+    cells: [{
+      rf_port: 0,
+      bandwidth: CELL_BANDWIDTH,
+#if TDD == 1
+      band: 78,
+      dl_nr_arfcn:621312,
+      ssb_nr_arfcn:621312,
+
+      //band: 41,
+      //dl_nr_arfcn:517020,
+      //ssb_nr_arfcn:516990,
+#else
+      band: 7,
+      dl_nr_arfcn: 536020,
+      ssb_nr_arfcn: 535930,
+      ssb_subcarrier_spacing: 15,
+#endif
+      subcarrier_spacing: 30,
+      n_antenna_dl: N_ANTENNA_DL,
+      n_antenna_ul: 1,
+      rx_to_tx_latency:2,
+    }],
+}],
+
+    
+/* Enable it to allow sim_events to be handled remotely */
+//rue_bind_addr: "127.0.10.11",
+
+
+
+ue_list: [
+  {
+    /* UE capabilities */ 
+    /* USIM data */    
+    "ue_id" : 1,
+    "imsi": "208970100001127",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      }, 
+      {
+       "tag": "ping",
+       "prog":"oai_ext_app.sh",
+        start_time: 15,
+        end_time: 25,
+        "args":["ping 192.168.70.136"],
+        "event":"ext_app"              
+      },
+      {
+        event: "power_off",
+        start_time: 30,
+      }
+    ] /*end sim events */
+  }, /*end UE object 0*/
+  {
+    /* UE capabilities */ 
+    /* USIM data */  
+    "ue_id" : 2, 
+    "imsi": "208970100001128",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      }, 
+      {
+       "tag": "ping",
+       "prog":"oai_ext_app.sh",
+        start_time: 15,
+        end_time: 25,
+        "args":["ping 192.168.70.136"],
+        "event":"ext_app"              
+      },
+      {
+        event: "power_off",
+        start_time: 30,
+      }
+    ] /*end sim events */
+  } /*end UE object 1*/
+  ],/*end UE list*/
+}/*end json*/
diff --git a/ci-scripts/as_ue/oaicicd-multi-ue-2xPingSeq-SATest.cfg b/ci-scripts/as_ue/oaicicd-multi-ue-2xPingSeq-SATest.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..9ebb3e01c5769d570a0148cce2ebf2fa8f2306e6
--- /dev/null
+++ b/ci-scripts/as_ue/oaicicd-multi-ue-2xPingSeq-SATest.cfg
@@ -0,0 +1,150 @@
+/* UE simulator configuration */
+
+
+/* UE simulator configuration file version 2021-06-17
+ * LTE / 5G Non StandAlone
+ * Copyright (C) 2019-2021 Amarisoft
+ */
+{
+#define N_ANTENNA_DL 1
+#define TDD 1
+#define CELL_BANDWIDTH 40
+#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129
+
+
+log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
+log_filename: "/tmp/ue0.log",
+
+/* Enable remote API and Web interface */
+com_addr: "0.0.0.0:9002",
+
+include "rf_driver/1chan.cfg",
+
+/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */
+                    
+cell_groups: [{
+    group_type: "nr",
+    multi_ue: true,
+    cells: [{
+      rf_port: 0,
+      bandwidth: CELL_BANDWIDTH,
+#if TDD == 1
+      band: 78,
+      dl_nr_arfcn:621312,
+      ssb_nr_arfcn:621312,
+
+      //band: 41,
+      //dl_nr_arfcn:517020,
+      //ssb_nr_arfcn:516990,
+#else
+      band: 7,
+      dl_nr_arfcn: 536020,
+      ssb_nr_arfcn: 535930,
+      ssb_subcarrier_spacing: 15,
+#endif
+      subcarrier_spacing: 30,
+      n_antenna_dl: N_ANTENNA_DL,
+      n_antenna_ul: 1,
+      rx_to_tx_latency:2,
+    }],
+}],
+
+    
+/* Enable it to allow sim_events to be handled remotely */
+//rue_bind_addr: "127.0.10.11",
+
+
+
+ue_list: [
+  {
+    /* UE capabilities */ 
+    /* USIM data */    
+    "ue_id" : 1,
+    "imsi": "208970100001127",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      },
+      {
+       "tag": "ping",
+       "prog":"oai_ext_app.sh",
+        start_time: 20,
+        end_time: 30,
+        "args":["ping 192.168.70.136"],
+        "event":"ext_app"
+      },
+      {
+        event: "power_off",
+        start_time: 60,
+      }
+    ] /*end sim events */
+  }, /*end UE object 0*/
+  {
+    /* UE capabilities */ 
+    /* USIM data */  
+    "ue_id" : 2, 
+    "imsi": "208970100001128",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+      {
+      sst: 1,
+      sd: 66051,
+      },
+    ],
+    default_pdu_session_snssai: {
+      sst: 1,
+      sd: 66051,
+    },
+    /* Enable it to allow sim_events to be handled remotely */
+    //rue_addr: "127.1.0.0",
+    /* Enable it to create a TUN interface for each UE PDN */
+    tun_setup_script: "ue-ifup",
+    sim_events: [
+      {
+        event: "power_on",
+        start_time: 5,
+      }, 
+      {
+       "tag": "ping",
+       "prog":"oai_ext_app.sh",
+        start_time: 40,
+        end_time: 50,
+        "args":["ping 192.168.70.136"],
+        "event":"ext_app"              
+      },
+      {
+        event: "power_off",
+        start_time: 60,
+      }
+    ] /*end sim events */
+  } /*end UE object 1*/
+  ],/*end UE list*/
+}/*end json*/
diff --git a/ci-scripts/as_ue/oaicicd-ue-Ping-SATest.cfg b/ci-scripts/as_ue/oaicicd-ue-Ping-SATest.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..ba22cbb233bb9e11a385005f822bb410597a6af1
--- /dev/null
+++ b/ci-scripts/as_ue/oaicicd-ue-Ping-SATest.cfg
@@ -0,0 +1,113 @@
+/* UE simulator configuration */
+
+
+
+/* UE simulator configuration file version 2021-06-17
+ * LTE / 5G Non StandAlone
+ * Copyright (C) 2019-2021 Amarisoft
+ */
+{
+#define N_ANTENNA_DL 1
+#define TDD 1
+#define CELL_BANDWIDTH 40
+
+
+  log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
+  log_filename: "/tmp/ue1.log",
+
+  /* Enable remote API and Web interface */
+  com_addr: "0.0.0.0:9002",
+
+  include "rf_driver/1chan.cfg",
+
+      /* If true, allow the simulation of several UEs at the same time and
+         allow dynamic UE creation from remote API */
+                    
+cell_groups: [{
+    group_type: "nr",
+    multi_ue: false,
+    cells: [{
+      rf_port: 0,
+      bandwidth: CELL_BANDWIDTH,
+#if TDD == 1
+      band: 78,
+      dl_nr_arfcn:621312,
+      ssb_nr_arfcn:621312,
+
+      //band: 41,
+      //dl_nr_arfcn:517020,
+      //ssb_nr_arfcn:516990,
+#else
+      band: 7,
+      dl_nr_arfcn: 536020,
+      ssb_nr_arfcn: 535930,
+      ssb_subcarrier_spacing: 15,
+#endif
+      subcarrier_spacing: 30,
+      n_antenna_dl: N_ANTENNA_DL,
+      n_antenna_ul: 1,
+      rx_to_tx_latency:2,
+    }],
+  }],
+
+
+
+       
+  /* Enable it to allow sim_events to be handled remotely */
+  //rue_bind_addr: "127.0.10.11",
+
+  ue_list: [
+    {
+      /* UE capabilities */
+   
+    /* USIM data */
+
+
+    "imsi": "208970100001127",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+
+
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+    {
+    sst: 1,
+    sd: 66051,
+    },
+    ],
+
+    default_pdu_session_snssai: {
+    sst: 1,
+    sd: 66051,
+    },
+
+
+      /* Enable it to allow sim_events to be handled remotely */
+      //rue_addr: "127.1.0.0",
+
+      /* Enable it to create a TUN interface for each UE PDN */
+      tun_setup_script: "ue-ifup",
+
+      sim_events: [{
+        event: "power_on",
+        start_time: 5,
+      }, {
+       "tag": "ping",
+       "prog":"oai_ext_app.sh",
+        start_time: 15,
+        end_time: 25,
+        "args":["ping 192.168.70.136"],
+        "event":"ext_app"
+              
+      },
+      {
+        event: "power_off",
+        start_time: 30,
+      }]
+    }
+  ],
+}
diff --git a/ci-scripts/as_ue/oaicicd-ue-iperf-SATest.cfg b/ci-scripts/as_ue/oaicicd-ue-iperf-SATest.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..841dafb74605d5ab006362d845fc8541a744eeae
--- /dev/null
+++ b/ci-scripts/as_ue/oaicicd-ue-iperf-SATest.cfg
@@ -0,0 +1,109 @@
+/* UE simulator configuration */
+
+
+
+/* UE simulator configuration file version 2021-06-17
+ * LTE / 5G Non StandAlone
+ * Copyright (C) 2019-2021 Amarisoft
+ */
+{
+#define N_ANTENNA_DL 1
+#define TDD 1
+#define CELL_BANDWIDTH 20
+
+
+  log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1",
+  log_filename: "/tmp/ue0.log",
+
+  /* Enable remote API and Web interface */
+  com_addr: "0.0.0.0:9002",
+
+  include "rf_driver/1chan.cfg",
+
+      /* If true, allow the simulation of several UEs at the same time and
+         allow dynamic UE creation from remote API */
+                    
+cell_groups: [{
+    group_type: "nr",
+    multi_ue: false,
+    cells: [{
+      rf_port: 0,
+      bandwidth: CELL_BANDWIDTH,
+#if TDD == 1
+     // band: 78,
+     // dl_nr_arfcn:621312,
+     // ssb_nr_arfcn:621312,*/
+
+      band: 41,
+      dl_nr_arfcn:517020,
+      ssb_nr_arfcn:516990,
+#else
+      band: 7,
+      dl_nr_arfcn: 536020,
+      ssb_nr_arfcn: 535930,
+      ssb_subcarrier_spacing: 15,
+#endif
+      subcarrier_spacing: 30,
+      n_antenna_dl: N_ANTENNA_DL,
+      n_antenna_ul: 1,
+      rx_to_tx_latency:2,
+    }],
+  }],
+
+
+
+       
+  /* Enable it to allow sim_events to be handled remotely */
+  //rue_bind_addr: "127.0.10.11",
+
+  ue_list: [
+    {
+      /* UE capabilities */
+   
+    /* USIM data */
+     
+    "imsi": "208970100001127",
+    "K": "fec86ba6eb707ed08905757b1bb44b8f",
+    "sim_algo":"milenage",
+    "op": "1006020f0a478bf6b699f15c062e42b3",
+
+
+    as_release: 15,
+    ue_category: "nr",
+    apn:"oai",
+    attach_pdn_type:"ipv4",
+    default_nssai: [
+    {
+    sst: 1,
+    sd: 1,
+    },
+    ],
+
+    default_pdu_session_snssai: {
+    sst: 1,
+    sd: 1,
+    },
+
+
+      /* Enable it to allow sim_events to be handled remotely */
+      //rue_addr: "127.1.0.0",
+
+      /* Enable it to create a TUN interface for each UE PDN */
+      tun_setup_script: "ue-ifup",
+
+      sim_events: [{
+        event: "power_on",
+        start_time: 5,
+      }, {
+        event: "ext_app",
+        start_time: 15,
+        end_time: 25,
+        prog: "ext_app.sh",
+        args: ["iperf", " -c  172.21.10.5", " -u"," -b 1M"," -i 1"," -t 10"]
+      }, {
+        event: "power_off",
+        start_time: 30,
+      }]
+    }
+  ],
+}
diff --git a/ci-scripts/ci_ueinfra.yaml b/ci-scripts/ci_ueinfra.yaml
index 0a915740f243cbb114120ed6971140ee7c3e5ee6..89bda5fa920008349644726ab08146ceee7631d9 100644
--- a/ci-scripts/ci_ueinfra.yaml
+++ b/ci-scripts/ci_ueinfra.yaml
@@ -39,6 +39,53 @@ nrmodule2_quectel:
   StartCommands :
     - sudo -S ip link set dev wwan1 mtu 1500
   MTU : 1500
+
+#single UE single ping
+amarisoft_ue_1:
+  ID: amarisoft_ue_1
+  State : enabled
+  Kind : amarisoft
+  #not required for AS config but needed for py script
+  WakeupScript : none
+  DetachScript : none
+  #end 
+  Cmd : /root/NV17-12-21/ue/lteue 
+  Config : /root/NV17-12-21/ue/config/oaicicd-ue-Ping-SATest.cfg 
+  Duration : 60
+  Ping : /tmp/test_ue1.log
+  UELog : /tmp/ue1.log
+  HostIPAddress : 192.168.18.89
+  HostUsername : root
+  HostPassword : toor 
+  HostSourceCodePath : /tmp
+
+
+#an other scenario example
+#notice : this will not work as such, only suggestion for multi ue scenario
+amarisoft_ue_2:
+  ID: amarisoft_ue_2
+  State : enabled
+  Kind : amarisoft
+  #not required for AS config but needed for py script
+  WakeupScript : none
+  DetachScript : none
+  #end 
+  Cmd : /root/NV17-12-21/ue/lteue 
+  Config : /root/NV17-12-21/ue/config/xxxxxxx.cfg #to be updated for an other scenario 
+  Duration : 60
+  Ping :
+    - /tmp/test_ue1.log #to be updated fo an other scenario
+    - /tmp/test_ue2.log #could be a list for a multi ue scenario
+  UELog :
+    - /tmp/ue1.log
+    - /tmp/ue1.log
+  HostIPAddress : 192.168.18.89
+  HostUsername : root
+  HostPassword : toor 
+  HostSourceCodePath : /tmp
+
+
+#do not remove
 dummy:
   ID: ''
   State : ''
diff --git a/ci-scripts/cls_amarisoft_ue.py b/ci-scripts/cls_amarisoft_ue.py
new file mode 100644
index 0000000000000000000000000000000000000000..367bfaac3f7810a7dd1cd5ba32d98d81f0cdca06
--- /dev/null
+++ b/ci-scripts/cls_amarisoft_ue.py
@@ -0,0 +1,81 @@
+# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+# * contributor license agreements.  See the NOTICE file distributed with
+# * this work for additional information regarding copyright ownership.
+# * The OpenAirInterface Software Alliance licenses this file to You under
+# * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+# * except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *      http://www.openairinterface.org/?page_id=698
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# *-------------------------------------------------------------------------------
+# * For more information about the OpenAirInterface (OAI) Software Alliance:
+# *      contact@openairinterface.org
+# */
+#---------------------------------------------------------------------
+#
+#   Required Python Version
+#     Python 3.x
+#
+#---------------------------------------------------------------------
+
+#to use isfile
+import os
+import sys
+import logging
+#to create a SSH object locally in the methods
+import sshconnection
+#time.sleep
+import time
+
+
+import re
+import subprocess
+
+from datetime import datetime
+
+
+class AS_UE:
+
+	def __init__(self,Module):
+		#create attributes as in the UE dictionary
+		for k, v in Module.items():
+			setattr(self, k, v)
+	
+
+
+
+#-----------------$
+#PUBLIC Methods$
+#-----------------$
+
+	def WaitEndScenario(self):
+		logging.debug('waiting for scenario duration')
+		time.sleep(int(self.Duration))
+
+	def KillASUE(self):
+		mySSH = sshconnection.SSHConnection()
+		mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword)
+		mySSH.command('killall --signal SIGKILL lteue-avx2', '#', 5)
+		mySSH.close()
+
+	def RunScenario(self):
+		mySSH = sshconnection.SSHConnection()
+		mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword)
+
+		logging.debug("Deleting old artifacts :")
+		cmd='rm -rf ' + self.Ping + ' ' + self.UELog 
+		mySSH.command(cmd,'#',5)
+		logging.debug("Running scenario :")
+		cmd='echo $USER; nohup '+self.Cmd + ' ' + self.Config + ' &'
+		mySSH.command(cmd,'#',5)
+
+		mySSH.close()
+
+
+
diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index d85659568bc76b4973b89ed9b5cbbecf4a8944c1..ee9f726c1187a238ed5d24efa71e8ca8da6ff50f 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -93,6 +93,7 @@ class Containerize():
 		self.allImagesSize = {}
 		self.collectInfo = {}
 
+		self.deployedContainers = []
 		self.tsharkStarted = False
 		self.pingContName = ''
 		self.pingOptions = ''
@@ -682,12 +683,28 @@ class Containerize():
 		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps -a'
 		count = 0
 		healthy = 0
+		newContainers = []
 		while (count < 10):
 			count += 1
 			containerStatus = []
 			deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
 			healthy = 0
 			for state in deployStatus.split('\n'):
+				res = re.search('Name|----------', state)
+				if res is not None:
+					continue
+				if len(state) == 0:
+					continue
+				res = re.search('^(?P<container_name>[a-zA-Z0-9\-\_]+) ', state)
+				if res is not None:
+					cName = res.group('container_name')
+					found = False
+					for alreadyDeployed in self.deployedContainers:
+						if cName == alreadyDeployed:
+							found = True
+					if not found:
+						newContainers.append(cName)
+						self.deployedContainers.append(cName)
 				if re.search('Up \(healthy\)', state) is not None:
 					healthy += 1
 				if re.search('rfsim4g-db-init.*Exit 0', state) is not None:
@@ -698,16 +715,33 @@ class Containerize():
 			else:
 				time.sleep(10)
 
+		imagesInfo = ''
+		for newCont in newContainers:
+			cmd = 'docker inspect -f "{{.Config.Image}}" ' + newCont
+			imageName = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
+			imageName = str(imageName).strip()
+			cmd = 'docker image inspect --format "{{.RepoTags}}\t{{.Size}}\t{{.Created}}" ' + imageName
+			imagesInfo += subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
+
+		html_queue = SimpleQueue()
+		html_cell = '<pre style="background-color:white">\n'
+		for imageInfo in imagesInfo.split('\n'):
+			html_cell += imageInfo[:-11] + '\n'
+		html_cell += '\n'
+		for cState in containerStatus:
+			html_cell += cState + '\n'
+		html_cell += '</pre>'
+		html_queue.put(html_cell)
 		if count == 100 and healthy == self.nb_healthy[0]:
 			if self.tsharkStarted == False:
 				logging.debug('Starting tshark on public network')
 				self.CaptureOnDockerNetworks()
-			HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
+			HTML.CreateHtmlTestRowQueue('n/a', 'OK', 1, html_queue)
 			for cState in containerStatus:
 				logging.debug(cState)
 			logging.info('\u001B[1m Deploying OAI Object(s) PASS\u001B[0m')
 		else:
-			HTML.CreateHtmlTestRow('Could not deploy in time', 'KO', CONST.ALL_PROCESSES_OK)
+			HTML.CreateHtmlTestRowQueue('Could not deploy in time', 'KO', 1, html_queue)
 			for cState in containerStatus:
 				logging.debug(cState)
 			logging.error('\u001B[1m Deploying OAI Object(s) FAILED\u001B[0m')
@@ -726,10 +760,12 @@ class Containerize():
 			cmd = 'sudo nohup tshark -f "(host 192.168.61.11 and icmp) or (not host 192.168.61.11 and not host 192.168.61.30 and not arp and not port 53 and not port 2152)"'
 		elif re.search('5g.*rfsimulator', self.yamlPath[0]) is not None:
 			cmd = 'sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not host 192.168.71.150 and not arp and not port 53 and not port 2152 and not port 2153)"'
+		elif re.search('5g_l2sim', self.yamlPath[0]) is not None:
+			cmd = 'sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not arp and not port 53 and not port 2152 and not port 2153)"'
 		else:
 			return
 		for name in networkNames.split('\n'):
-			if re.search('rfsim', name) is not None:
+			if re.search('rfsim', name) is not None or re.search('l2sim', name) is not None:
 				cmd += ' -i ' + name
 		cmd += ' -w /tmp/capture_'
 		ymlPath = self.yamlPath[0].split('/')
@@ -781,7 +817,7 @@ class Containerize():
 			# Analyzing log file(s)!
 			listOfPossibleRanContainers = ['enb', 'gnb', 'cu', 'du']
 			for container in listOfPossibleRanContainers:
-				filename = self.yamlPath[0] + '/rfsim?g-oai-' + container + '.log'
+				filename = self.yamlPath[0] + '/*-oai-' + container + '.log'
 				cmd = 'ls ' + filename
 				containerStatus = True
 				try:
@@ -803,7 +839,7 @@ class Containerize():
 
 			listOfPossibleUeContainers = ['lte-ue*', 'nr-ue*']
 			for container in listOfPossibleUeContainers:
-				filename = self.yamlPath[0] + '/rfsim?g-oai-' + container + '.log'
+				filename = self.yamlPath[0] + '/*-oai-' + container + '.log'
 				cmd = 'ls ' + filename
 				containerStatus = True
 				try:
@@ -851,6 +887,7 @@ class Containerize():
 			logging.error('\u001B[1m Undeploying OAI Object(s) FAILED\u001B[0m')
 			return
 
+		self.deployedContainers = []
 		# Cleaning any created tmp volume
 		cmd = 'docker volume prune --force || true'
 		logging.debug(cmd)
@@ -863,6 +900,40 @@ class Containerize():
 			HTML.CreateHtmlTestRow('n/a', 'KO', CONST.ALL_PROCESSES_OK)
 			logging.info('\u001B[1m Undeploying OAI Object(s) FAIL\u001B[0m')
 
+	def StatsFromGenObject(self, HTML):
+		self.exitStatus = 0
+		ymlPath = self.yamlPath[0].split('/')
+		logPath = '../cmake_targets/log/' + ymlPath[1]
+
+		# if the containers are running, recover the logs!
+		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all'
+		logging.debug(cmd)
+		deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
+		cmd = 'docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" '
+		anyLogs = False
+		for state in deployStatus.split('\n'):
+			res = re.search('Name|----------', state)
+			if res is not None:
+				continue
+			if len(state) == 0:
+				continue
+			res = re.search('^(?P<container_name>[a-zA-Z0-9\-\_]+) ', state)
+			if res is not None:
+				anyLogs = True
+				cmd += res.group('container_name') + ' '
+		message = ''
+		if anyLogs:
+			logging.debug(cmd)
+			stats = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
+			for statLine in stats.split('\n'):
+				logging.debug(statLine)
+				message += statLine + '\n'
+
+		html_queue = SimpleQueue()
+		html_cell = '<pre style="background-color:white">\n' + message + '</pre>'
+		html_queue.put(html_cell)
+		HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', 1, html_queue)
+
 	def PingFromContainer(self, HTML, RAN, UE):
 		self.exitStatus = 0
 		ymlPath = self.yamlPath[0].split('/')
diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py
index 0865d4efb5b961555ad44f7d479eca9aed935783..33910f1f9bd5dbe8ebe0e025d1745c9a3d61baba 100644
--- a/ci-scripts/cls_oaicitest.py
+++ b/ci-scripts/cls_oaicitest.py
@@ -55,6 +55,7 @@ import constants as CONST
 import sshconnection
 
 import cls_module_ue
+import cls_amarisoft_ue
 import cls_ci_ueinfra		#class defining the multi Ue infrastrucure
 
 logging.getLogger("matplotlib").setLevel(logging.WARNING)
@@ -419,49 +420,63 @@ class OaiCiTest():
 			for job in multi_jobs:
 				job.join()
 			HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
-		else: #if an ID is specified, it is a module from the yaml infrastructure file
-			#RH
-			Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
-			Module_UE.ue_trace=ue_trace
-			is_module=Module_UE.CheckCMProcess(EPC.Type)
-			if is_module:
-				Module_UE.EnableTrace()
-				time.sleep(5)
-
-				# Looping attach / detach / wait to be successful at least once
-				cnt = 0
-				status = -1
-				while cnt < 4:
-					Module_UE.Command("wup")
-					logging.debug("Waiting for IP address to be assigned")
-					time.sleep(20)
-					logging.debug("Retrieve IP address")
-					status=Module_UE.GetModuleIPAddress()
-					if status==0:
-						cnt = 10
-					else:
-						cnt += 1
-						Module_UE.Command("detach")
+		else: #if an ID is specified, it is a UE from the yaml infrastructure file
+			ue_kind = InfraUE.ci_ue_infra[self.ue_id]['Kind']
+			logging.debug("Detected UE Kind : " + ue_kind)
+
+			#case it is a quectel module (only 1 at a time supported at the moment)
+			if ue_kind == 'quectel':
+				Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
+				Module_UE.ue_trace=ue_trace
+				is_module=Module_UE.CheckCMProcess(EPC.Type)
+				if is_module:
+					Module_UE.EnableTrace()
+					time.sleep(5)
+
+					# Looping attach / detach / wait to be successful at least once
+					cnt = 0
+					status = -1
+					while cnt < 4:
+						Module_UE.Command("wup")
+						logging.debug("Waiting for IP address to be assigned")
 						time.sleep(20)
+						logging.debug("Retrieve IP address")
+						status=Module_UE.GetModuleIPAddress()
+						if status==0:
+							cnt = 10
+						else:
+							cnt += 1
+							Module_UE.Command("detach")
+							time.sleep(20)
+
+					if cnt == 10 and status == 0:
+						HTML.CreateHtmlTestRow(Module_UE.UEIPAddress, 'OK', CONST.ALL_PROCESSES_OK)	
+						logging.debug('UE IP addresss : '+ Module_UE.UEIPAddress)
+						#execute additional commands from yaml file after UE attach
+						SSH = sshconnection.SSHConnection()
+						SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
+						if hasattr(Module_UE,'StartCommands'):
+							for startcommand in Module_UE.StartCommands:
+								cmd = 'echo ' + Module_UE.HostPassword + ' | ' + startcommand
+								SSH.command(cmd,'\$',5)
+						SSH.close()
+						#check that the MTU is as expected / requested
+						Module_UE.CheckModuleMTU()
+					else: #status==-1 failed to retrieve IP address
+						HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE)
+						self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
+						return
 
-				if cnt == 10 and status == 0:
-					HTML.CreateHtmlTestRow(Module_UE.UEIPAddress, 'OK', CONST.ALL_PROCESSES_OK)	
-					logging.debug('UE IP addresss : '+ Module_UE.UEIPAddress)
-					#execute additional commands from yaml file after UE attach
-					SSH = sshconnection.SSHConnection()
-					SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
-					if hasattr(Module_UE,'StartCommands'):
-						for startcommand in Module_UE.StartCommands:
-							cmd = 'echo ' + Module_UE.HostPassword + ' | ' + startcommand
-							SSH.command(cmd,'\$',5)
-					SSH.close()
-					#check that the MTU is as expected / requested
-					Module_UE.CheckModuleMTU()
-				else: #status==-1 failed to retrieve IP address
-					HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE)
-					self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
-					return
-			
+			#case it is a amarisoft ue (only 1 at a time supported at the moment)
+			elif ue_kind == 'amarisoft':
+				AS_UE = cls_amarisoft_ue.AS_UE(InfraUE.ci_ue_infra[self.ue_id])
+				HTML.CreateHtmlTestRow(AS_UE.Config, 'OK', CONST.ALL_PROCESSES_OK)
+				AS_UE.RunScenario()
+				AS_UE.WaitEndScenario()
+				AS_UE.KillASUE()
+
+			else:
+				logging.debug("Incorrect UE Kind was detected")								
 
 
 	def InitializeOAIUE(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS):
@@ -1570,16 +1585,23 @@ class OaiCiTest():
 			SSH = sshconnection.SSHConnection()
 			# Launch ping on the EPC side (true for ltebox and old open-air-cn)
 			# But for OAI-Rel14-CUPS, we launch from python executor
+			ping_status = 0
 			launchFromEpc = True
 			launchFromModule = False
+			launchFromASUE = False
 			if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE):
 				launchFromEpc = False
 			#if module, ping from module to EPC
 			if self.ue_id!='':
-				launchFromEpc = False
-				launchfromModule = True
-
-			ping_time = re.findall("-c (\d+)",str(self.ping_args))
+				if (re.match('amarisoft', self.ue_id, re.IGNORECASE)):
+					launchFromEpc = False
+					launchFromASUE = True
+				else:
+					launchFromEpc = False
+					launchFromModule = True
+			#no ping args for ASUE
+			if self.ping_args!='':
+				ping_time = re.findall("-c (\d+)",str(self.ping_args))
 
 			if launchFromEpc:
 				SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
@@ -1597,14 +1619,14 @@ class OaiCiTest():
 				#copy the ping log file to have it locally for analysis (ping stats)
 				SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')				
 			else:
-				if launchfromModule == False:
+				if (launchFromModule == False) and (launchFromASUE == False):
 					#ping log file is on the python executor
 					cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' > ping_' + self.testCase_id + '_' + device_id + '.log 2>&1'
 					message = cmd + '\n'
 					logging.debug(cmd)
 					ret = subprocess.run(cmd, shell=True)
 					ping_status = ret.returncode
-					#copy the ping log file to an other folder for log collection (source and destination are EPC)
+					#copy the ping log file to an other folder for log collection (source and desti				elif (launchfromModule == True) and (launchfromASUE == False): #launch from Modulenation are EPC)
 					SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'ping_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
                 	#copy the ping log file to have it locally for analysis (ping stats)
 					logging.debug(EPC.SourceCodePath + 'ping_' + self.testCase_id + '_' + device_id + '.log')
@@ -1614,7 +1636,8 @@ class OaiCiTest():
 					#cat is executed on EPC
 					SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
 					ping_log_file='/scripts/ping_' + self.testCase_id + '_' + device_id + '.log'
-				else: #launch from Module
+
+				elif (launchFromModule == True) and (launchFromASUE == False): #launch from Module
 					SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
 					#target address is different depending on EPC type
 					if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
@@ -1626,13 +1649,27 @@ class OaiCiTest():
 					#ping from module NIC rather than IP address to make sure round trip is over the air	
 					cmd = 'ping -I ' + Module_UE.UENetwork  + ' ' + self.ping_args + ' ' +  Target  + ' > ping_' + self.testCase_id + '_' + self.ue_id + '.log 2>&1'
 					SSH.command(cmd,'\$',int(ping_time[0])*1.5)
+
 					#copy the ping log file to have it locally for analysis (ping stats)
 					SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, 'ping_' + self.testCase_id + '_' + self.ue_id + '.log', '.')
 
 					#cat is executed locally 
 					SSH.command('cat ping_' + self.testCase_id + '_' + self.ue_id + '.log', '\$', 5)
 					ping_log_file='ping_' + self.testCase_id + '_' + self.ue_id + '.log'
-					ping_status=0
+
+				elif (launchFromASUE == True): 
+					#ping was already executed when running scenario
+					#we only need to retrieve ping log file, whose location is in the ci_ueinfra.yaml
+					logging.debug("Get logs from AS server : " + Module_UE.Ping + ", " + Module_UE.UELog)
+					SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, Module_UE.Ping, '.')
+					SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, Module_UE.UELog, '.')
+					logging.debug("Ping analysis from Amarisoft scenario")
+					path,ping_log_file = os.path.split(Module_UE.Ping)
+					SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
+					SSH.command('cat ' + Module_UE.Ping, '\#', 5)
+
+				else:
+					ping_status=-1
 
 			# TIMEOUT CASE
 			if ping_status < 0:
@@ -1680,28 +1717,30 @@ class OaiCiTest():
 
 			#adding extra ping stats from local file
 			#ping_log_file variable is defined above in this function, depending on device/ue
-			logging.debug('Analyzing Ping log file : ' + os.getcwd() + '/' + ping_log_file)
-			ping_stat=GetPingTimeAnalysis(RAN,ping_log_file,self.ping_rttavg_threshold)
 			ping_stat_msg=''
-			if (ping_stat!=-1) and (len(ping_stat)!=0):
-				ping_stat_msg+='Ping stats before removing largest value : \n'
-				ping_stat_msg+='RTT(Min)    : ' + str("{:.2f}".format(ping_stat['min_0'])) + 'ms \n'
-				ping_stat_msg+='RTT(Mean)   : ' + str("{:.2f}".format(ping_stat['mean_0'])) + 'ms \n'
-				ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_0'])) + 'ms \n'
-				ping_stat_msg+='RTT(Max)    : ' + str("{:.2f}".format(ping_stat['max_0'])) + 'ms \n'
-				ping_stat_msg+='Max Index   : ' + str(ping_stat['max_loc']) + '\n'
-				ping_stat_msg+='Ping stats after removing largest value : \n'
-				ping_stat_msg+='RTT(Min)    : ' + str("{:.2f}".format(ping_stat['min_1'])) + 'ms \n'
-				ping_stat_msg+='RTT(Mean)   : ' + str("{:.2f}".format(ping_stat['mean_1'])) + 'ms \n'
-				ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_1'])) + 'ms \n'
-				ping_stat_msg+='RTT(Max)    : ' + str("{:.2f}".format(ping_stat['max_1'])) + 'ms \n'
+			if launchFromASUE == False : #skip in case of AS UE (for the moment)
+				logging.debug('Analyzing Ping log file : ' + os.getcwd() + '/' + ping_log_file)
+				ping_stat=GetPingTimeAnalysis(RAN,ping_log_file,self.ping_rttavg_threshold)
+
+				if (ping_stat!=-1) and (len(ping_stat)!=0):
+					ping_stat_msg+='Ping stats before removing largest value : \n'
+					ping_stat_msg+='RTT(Min)    : ' + str("{:.2f}".format(ping_stat['min_0'])) + 'ms \n'
+					ping_stat_msg+='RTT(Mean)   : ' + str("{:.2f}".format(ping_stat['mean_0'])) + 'ms \n'
+					ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_0'])) + 'ms \n'
+					ping_stat_msg+='RTT(Max)    : ' + str("{:.2f}".format(ping_stat['max_0'])) + 'ms \n'
+					ping_stat_msg+='Max Index   : ' + str(ping_stat['max_loc']) + '\n'
+					ping_stat_msg+='Ping stats after removing largest value : \n'
+					ping_stat_msg+='RTT(Min)    : ' + str("{:.2f}".format(ping_stat['min_1'])) + 'ms \n'
+					ping_stat_msg+='RTT(Mean)   : ' + str("{:.2f}".format(ping_stat['mean_1'])) + 'ms \n'
+					ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_1'])) + 'ms \n'
+					ping_stat_msg+='RTT(Max)    : ' + str("{:.2f}".format(ping_stat['max_1'])) + 'ms \n'
 
 			#building html message
 			qMsg = pal_msg + '\n' + min_msg + '\n' + avg_msg + '\n' + max_msg + '\n'  + ping_stat_msg
 
 			#checking packet loss compliance
 			packetLossOK = True
-			if packetloss is not None:
+			if (packetloss is not None) :
 				if float(packetloss) > float(self.ping_packetloss_threshold):
 					qMsg += '\nPacket Loss too high'
 					logging.debug('\u001B[1;37;41m Packet Loss too high; Target: '+ self.ping_packetloss_threshold + '%\u001B[0m')
@@ -1729,6 +1768,7 @@ class OaiCiTest():
 			lock.release()
 			SSH.close()
 		except:
+			logging.debug('exit from Ping_Common except')
 			os.kill(os.getppid(),signal.SIGUSR1)
 
 	def PingNoS1_wrong_exit(self, qMsg,HTML):
@@ -1856,11 +1896,21 @@ class OaiCiTest():
 				HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
 				self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS)
 				return
-		else:
-			self.UEIPAddresses=[]
-			Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
-			Module_UE.GetModuleIPAddress()
-			self.UEIPAddresses.append(Module_UE.UEIPAddress)
+		else: #if an ID is specified, it is a UE from the yaml infrastructure file
+			ue_kind = InfraUE.ci_ue_infra[self.ue_id]['Kind']
+			logging.debug("Detected UE Kind : " + ue_kind)
+
+			if ue_kind == 'quectel':
+				self.UEIPAddresses=[]
+				Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
+				Module_UE.GetModuleIPAddress()
+				self.UEIPAddresses.append(Module_UE.UEIPAddress)
+			elif ue_kind == 'amarisoft':
+				self.UEIPAddresses=['AS UE IP']
+				Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
+			else:
+				logging.debug("Incorrect UE Kind was detected")	
+
 		logging.debug(self.UEIPAddresses)
 		multi_jobs = []
 		i = 0
@@ -1871,6 +1921,7 @@ class OaiCiTest():
 				device_id = self.UEDevices[i]
 			else:
 				device_id = Module_UE.ID + "-" + Module_UE.Kind 
+				logging.debug(device_id)
 			p = Process(target = self.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,EPC,Module_UE,RAN,))
 			p.daemon = True
 			p.start()
@@ -3156,10 +3207,12 @@ class OaiCiTest():
 		nrFoundDCI = 0
 		nrCRCOK = 0
 		mbms_messages = 0
+		nbPduSessAccept = 0
+		nbPduDiscard = 0
 		HTML.htmlUEFailureMsg=''
 		global_status = CONST.ALL_PROCESSES_OK
 		for line in ue_log_file.readlines():
-			result = re.search('nr_synchro_time', str(line))
+			result = re.search('nr_synchro_time|Starting NR UE soft modem', str(line))
 			if result is not None:
 				nrUEFlag = True
 			if nrUEFlag:
@@ -3172,6 +3225,15 @@ class OaiCiTest():
 				result = re.search('CRC OK', str(line))
 				if result is not None:
 					nrCRCOK += 1
+				result = re.search('Received PDU Session Establishment Accept', str(line))
+				if result is not None:
+					nbPduSessAccept += 1
+				result = re.search('warning: discard PDU, sn out of window', str(line))
+				if result is not None:
+					nbPduDiscard += 1
+				result = re.search('--nfapi 5 --node-number 2 --sa', str(line))
+				if result is not None:
+					frequency_found = True
 			result = re.search('Exiting OAI softmodem', str(line))
 			if result is not None:
 				exitSignalReceived = True
@@ -3302,21 +3364,29 @@ class OaiCiTest():
 			HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
 		if nrUEFlag:
 			if nrDecodeMib > 0:
-				statMsg = 'UE showed ' + str(nrDecodeMib) + ' MIB decode message(s)'
+				statMsg = 'UE showed ' + str(nrDecodeMib) + ' "MIB decode" message(s)'
 				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
 				HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
 			if nrFoundDCI > 0:
-				statMsg = 'UE showed ' + str(nrFoundDCI) + ' DCI found message(s)'
+				statMsg = 'UE showed ' + str(nrFoundDCI) + ' "DCI found" message(s)'
 				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
 				HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
 			if nrCRCOK > 0:
-				statMsg = 'UE showed ' + str(nrCRCOK) + ' PDSCH decoding message(s)'
+				statMsg = 'UE showed ' + str(nrCRCOK) + ' "PDSCH decoding" message(s)'
 				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
 				HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
 			if not frequency_found:
 				statMsg = 'NR-UE could NOT synch!'
 				logging.error('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
 				HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
+			if nbPduSessAccept > 0:
+				statMsg = 'UE showed ' + str(nbPduSessAccept) + ' "Received PDU Session Establishment Accept" message(s)'
+				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
+				HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
+			if nbPduDiscard > 0:
+				statMsg = 'UE showed ' + str(nbPduDiscard) + ' "warning: discard PDU, sn out of window" message(s)'
+				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
+				HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n'
 		if uciStatMsgCount > 0:
 			statMsg = 'UE showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
 			logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
@@ -3447,16 +3517,23 @@ class OaiCiTest():
 				job.join()
 			HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
 		else: #if an ID is specified, it is a module from the yaml infrastructure file
-			Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
-			Module_UE.ue_trace=ue_trace
-			Module_UE.Command("detach")	
-			Module_UE.DisableTrace()
-			Module_UE.DisableCM()
-			archive_destination=Module_UE.LogCollect()
-			if Module_UE.ue_trace=='yes':
-				HTML.CreateHtmlTestRow('QLog at : '+archive_destination, 'OK', CONST.ALL_PROCESSES_OK)
+			ue_kind = InfraUE.ci_ue_infra[self.ue_id]['Kind']
+			logging.debug("Detected UE Kind : " + ue_kind)
+			if ue_kind == 'quectel':
+				Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id])
+				Module_UE.ue_trace=ue_trace
+				Module_UE.Command("detach")
+				Module_UE.DisableTrace()
+				Module_UE.DisableCM()
+				archive_destination=Module_UE.LogCollect()
+				if Module_UE.ue_trace=='yes':
+					HTML.CreateHtmlTestRow('QLog at : '+archive_destination, 'OK', CONST.ALL_PROCESSES_OK)
+				else:
+					HTML.CreateHtmlTestRow('QLog trace is disabled', 'OK', CONST.ALL_PROCESSES_OK)
+			elif ue_kind == 'amarisoft':
+				HTML.CreateHtmlTestRow('AS UE is already terminated', 'OK', CONST.ALL_PROCESSES_OK)
 			else:
-				HTML.CreateHtmlTestRow('QLog trace is disabled', 'OK', CONST.ALL_PROCESSES_OK)			
+				logging.debug("Incorrect UE Kind was detected")
 
 	def TerminateOAIUE(self,HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS):
 		SSH = sshconnection.SSHConnection()
diff --git a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
index 480ba3952a7dd90bafc5b8cd99ec2524131a59a0..dfc9beda715c695b17672f780d7344af3f46572b 100644
--- a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
@@ -231,7 +231,7 @@ RUs = (
        local_rf       = "yes"
          nb_tx          = 2
          nb_rx          = 2
-         att_tx         = 0
+         att_tx         = 10
          att_rx         = 5;
          bands          = [38];
          max_pdschReferenceSignalPower = -27;
diff --git a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
index a98179197f159bef82afb5fc3e91cfe7eebc11d3..40f6f911b16f017ef20b1f552ce449f35323f461 100644
--- a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -33,9 +33,6 @@ gNBs =
     ////////// Physical parameters:
 
     ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts                                        = 1;
-    pusch_AntennaPorts                                        = 1;
-    ul_prbblacklist                                           = "51,52,53,54"
     min_rxtxtime = 6;
      pdcch_ConfigSIB1 = (
       {
@@ -73,15 +70,6 @@ gNBs =
       #pdcch-ConfigCommon
         initialDLBWPcontrolResourceSetZero                              = 12;
         initialDLBWPsearchSpaceZero                                     = 0;
-      #pdsch-ConfigCommon
-        #pdschTimeDomainAllocationList (up to 16 entries)
-        initialDLBWPk0_0                    = 0;  #for DL slot
-        initialDLBWPmappingType_0           = 0;  #0=typeA,1=typeB
-        initialDLBWPstartSymbolAndLength_0  = 40; #this is SS=1,L=13
-
-        initialDLBWPk0_1                    = 0;  #for mixed slot
-        initialDLBWPmappingType_1           = 0;
-        initialDLBWPstartSymbolAndLength_1  = 57; #this is SS=1,L=5
 
   #uplinkConfigCommon
      #frequencyInfoUL
@@ -136,19 +124,6 @@ gNBs =
 # 0=unrestricted, 1=restricted type A, 2=restricted type B
         restrictedSetConfig                                         = 0,
 
-      # pusch-ConfigCommon (up to 16 elements)
-        initialULBWPk2_0                      = 6;  # used for UL slot
-        initialULBWPmappingType_0             = 1
-        initialULBWPstartSymbolAndLength_0    = 41; # this is SS=0 L=13
-
-        initialULBWPk2_1                      = 6;  # used for mixed slot
-        initialULBWPmappingType_1             = 1;
-        initialULBWPstartSymbolAndLength_1    = 52; # this is SS=10 L=4
-
-        initialULBWPk2_2                      = 7;  # used for Msg.3 during RA
-        initialULBWPmappingType_2             = 1;
-        initialULBWPstartSymbolAndLength_2    = 52; # this is SS=10 L=4
-
         msg3_DeltaPreamble                                          = 1;
         p0_NominalWithGrant                                         =-90;
 
diff --git a/ci-scripts/conf_files/episci/episci_nr-ue0.nfapi.conf b/ci-scripts/conf_files/episci/episci_nr-ue0.nfapi.conf
deleted file mode 100644
index 22ffb4cd3d2317e93a1e050b905bf124bc767d39..0000000000000000000000000000000000000000
--- a/ci-scripts/conf_files/episci/episci_nr-ue0.nfapi.conf
+++ /dev/null
@@ -1,45 +0,0 @@
-log_config = {
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-};
-
-uicc0 = {
-imsi = "208950000000031";
-key = "0c0a34601d4f07677303652c0462535b";
-opc= "63bfa50ee6523365ff14c1f45f88737d";
-dnn= "oai";
-nssai_sst=222;
-nssai_sd=123;
-}
-
-L1s = (
-        {
-	num_cc = 1;
-	tr_n_preference = "nfapi";
-	local_n_if_name  = "ens3";
-	remote_n_address = "127.0.0.1"; //Proxy IP
-	local_n_address  = "127.0.0.1";
-	local_n_portc    = 50600;
-	remote_n_portc   = 50601;
-	local_n_portd    = 50610;
-	remote_n_portd   = 50611;
-        }  
-);
-
-RUs = (
-    {
-       local_rf       = "yes"
-       nb_tx          = 1
-       nb_rx          = 1
-       att_tx         = 90
-       att_rx         = 0;
-       bands          = [7,38,42,43];
-       max_pdschReferenceSignalPower = -27;
-       max_rxgain                    = 125;
-    }
-);
diff --git a/ci-scripts/conf_files/episci/episci_nr-ue1.nfapi.conf b/ci-scripts/conf_files/episci/episci_nr-ue1.nfapi.conf
deleted file mode 100644
index 3d1c008f2361836fac94e8634a8fb096701ae7ce..0000000000000000000000000000000000000000
--- a/ci-scripts/conf_files/episci/episci_nr-ue1.nfapi.conf
+++ /dev/null
@@ -1,45 +0,0 @@
-log_config = {
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-};
-
-uicc0 = {
-imsi = "208950000000032";
-key = "0c0a34601d4f07677303652c0462535b";
-opc= "63bfa50ee6523365ff14c1f45f88737d";
-dnn= "oai";
-nssai_sst=222;
-nssai_sd=123;
-}
-
-L1s = (
-        {
-	num_cc = 1;
-	tr_n_preference = "nfapi";
-	local_n_if_name  = "ens3";
-	remote_n_address = "127.0.0.1"; //Proxy IP
-	local_n_address  = "127.0.0.1";
-	local_n_portc    = 50600;
-	remote_n_portc   = 50601;
-	local_n_portd    = 50610;
-	remote_n_portd   = 50611;
-        }  
-);
-
-RUs = (
-    {
-       local_rf       = "yes"
-       nb_tx          = 1
-       nb_rx          = 1
-       att_tx         = 90
-       att_rx         = 0;
-       bands          = [7,38,42,43];
-       max_pdschReferenceSignalPower = -27;
-       max_rxgain                    = 125;
-    }
-);
diff --git a/ci-scripts/conf_files/episci/episci_nr-ue2.nfapi.conf b/ci-scripts/conf_files/episci/episci_nr-ue2.nfapi.conf
deleted file mode 100644
index 73c3292809f0a27ca4cb752b3db33dec7fd8aee4..0000000000000000000000000000000000000000
--- a/ci-scripts/conf_files/episci/episci_nr-ue2.nfapi.conf
+++ /dev/null
@@ -1,45 +0,0 @@
-log_config = {
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-};
-
-uicc0 = {
-imsi = "208950000000033";
-key = "0c0a34601d4f07677303652c0462535b";
-opc= "63bfa50ee6523365ff14c1f45f88737d";
-dnn= "oai";
-nssai_sst=222;
-nssai_sd=123;
-}
-
-L1s = (
-        {
-	num_cc = 1;
-	tr_n_preference = "nfapi";
-	local_n_if_name  = "ens3";
-	remote_n_address = "127.0.0.1"; //Proxy IP
-	local_n_address  = "127.0.0.1";
-	local_n_portc    = 50600;
-	remote_n_portc   = 50601;
-	local_n_portd    = 50610;
-	remote_n_portd   = 50611;
-        }  
-);
-
-RUs = (
-    {
-       local_rf       = "yes"
-       nb_tx          = 1
-       nb_rx          = 1
-       att_tx         = 90
-       att_rx         = 0;
-       bands          = [7,38,42,43];
-       max_pdschReferenceSignalPower = -27;
-       max_rxgain                    = 125;
-    }
-);
diff --git a/ci-scripts/conf_files/episci/episci_nr-ue3.nfapi.conf b/ci-scripts/conf_files/episci/episci_nr-ue3.nfapi.conf
deleted file mode 100644
index 1f8f7306c60eeea212660b5ab9d587694aee34c9..0000000000000000000000000000000000000000
--- a/ci-scripts/conf_files/episci/episci_nr-ue3.nfapi.conf
+++ /dev/null
@@ -1,45 +0,0 @@
-log_config = {
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-};
-
-uicc0 = {
-imsi = "208950000000034";
-key = "0c0a34601d4f07677303652c0462535b";
-opc= "63bfa50ee6523365ff14c1f45f88737d";
-dnn= "oai";
-nssai_sst=222;
-nssai_sd=123;
-}
-
-L1s = (
-        {
-	num_cc = 1;
-	tr_n_preference = "nfapi";
-	local_n_if_name  = "ens3";
-	remote_n_address = "127.0.0.1"; //Proxy IP
-	local_n_address  = "127.0.0.1";
-	local_n_portc    = 50600;
-	remote_n_portc   = 50601;
-	local_n_portd    = 50610;
-	remote_n_portd   = 50611;
-        }  
-);
-
-RUs = (
-    {
-       local_rf       = "yes"
-       nb_tx          = 1
-       nb_rx          = 1
-       att_tx         = 90
-       att_rx         = 0;
-       bands          = [7,38,42,43];
-       max_pdschReferenceSignalPower = -27;
-       max_rxgain                    = 125;
-    }
-);
diff --git a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
index 9b3f205a0f36b69f3ddc66f8bf71236ca96f1a0f..eac0b746336cdd9901d1ae5a73e862843c05048b 100644
--- a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
+++ b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf
@@ -22,9 +22,14 @@ gNBs =
     ////////// Physical parameters:
 
     ssb_SubcarrierOffset                                      = 31; //0;
-    pdsch_AntennaPorts                                        = 1;
-    pusch_AntennaPorts                                        = 1;
- 
+    min_rxtxtime = 6;
+
+     pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 12;
+        searchSpaceZero = 0;
+      }
+      );
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
@@ -54,15 +59,6 @@ gNBs =
       #pdcch-ConfigCommon
         initialDLBWPcontrolResourceSetZero                                      = 0;
         initialDLBWPsearchSpaceZero                                             = 0;
-      #pdsch-ConfigCommon
-        #pdschTimeDomainAllocationList (up to 16 entries)
-        initialDLBWPk0_0                    = 0;  #for DL slot
-        initialDLBWPmappingType_0           = 0;  #0=typeA,1=typeB
-        initialDLBWPstartSymbolAndLength_0  = 40; #this is SS=1,L=13
-
-        initialDLBWPk0_1                    = 0;  #for mixed slot
-        initialDLBWPmappingType_1           = 0;
-        initialDLBWPstartSymbolAndLength_1  = 57; #this is SS=1,L=5
 
   #uplinkConfigCommon 
      #frequencyInfoUL
@@ -117,18 +113,6 @@ gNBs =
 # restrictedSetConfig
 # 0=unrestricted, 1=restricted type A, 2=restricted type B
         restrictedSetConfig                                         = 0,
-      # pusch-ConfigCommon (up to 16 elements)
-        initialULBWPk2_0                      = 6;  # used for UL slot
-        initialULBWPmappingType_0             = 1
-        initialULBWPstartSymbolAndLength_0    = 41; # this is SS=0 L=13
-
-        initialULBWPk2_1                      = 6;  # used for mixed slot
-        initialULBWPmappingType_1             = 1;
-        initialULBWPstartSymbolAndLength_1    = 52; # this is SS=10 L=4
-
-        initialULBWPk2_2                      = 7;  # used for Msg.3 during RA
-        initialULBWPmappingType_2             = 1;
-        initialULBWPstartSymbolAndLength_2    = 52; # this is SS=10 L=4
 
         msg3_DeltaPreamble                                          = 1;
         p0_NominalWithGrant                                         =-90;
diff --git a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
index 0597e962455666686da6f69dd2331cd5714dac62..edcd4f06ffcf66f06868cf321fba144c6026bd94 100644
--- a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -33,9 +33,6 @@ gNBs =
     ////////// Physical parameters:
 
     ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts                                        = 1;
-    pusch_AntennaPorts                                        = 1;
-    ul_prbblacklist                                           = "51,52,53,54"
     min_rxtxtime = 6;
 
      pdcch_ConfigSIB1 = (
@@ -74,15 +71,6 @@ gNBs =
       #pdcch-ConfigCommon
         initialDLBWPcontrolResourceSetZero                              = 12;
         initialDLBWPsearchSpaceZero                                     = 0;
-      #pdsch-ConfigCommon
-        #pdschTimeDomainAllocationList (up to 16 entries)
-        initialDLBWPk0_0                    = 0;  #for DL slot
-        initialDLBWPmappingType_0           = 0;  #0=typeA,1=typeB
-        initialDLBWPstartSymbolAndLength_0  = 40; #this is SS=1,L=13
-
-        initialDLBWPk0_1                    = 0;  #for mixed slot
-        initialDLBWPmappingType_1           = 0;
-        initialDLBWPstartSymbolAndLength_1  = 57; #this is SS=1,L=5
 
   #uplinkConfigCommon
      #frequencyInfoUL
@@ -137,19 +125,6 @@ gNBs =
 # 0=unrestricted, 1=restricted type A, 2=restricted type B
         restrictedSetConfig                                         = 0,
 
-      # pusch-ConfigCommon (up to 16 elements)
-        initialULBWPk2_0                      = 6;  # used for UL slot
-        initialULBWPmappingType_0             = 1
-        initialULBWPstartSymbolAndLength_0    = 41; # this is SS=0 L=13
-
-        initialULBWPk2_1                      = 6;  # used for mixed slot
-        initialULBWPmappingType_1             = 1;
-        initialULBWPstartSymbolAndLength_1    = 52; # this is SS=10 L=4
-
-        initialULBWPk2_2                      = 7;  # used for Msg.3 during RA
-        initialULBWPmappingType_2             = 1;
-        initialULBWPstartSymbolAndLength_2    = 52; # this is SS=10 L=4
-
         msg3_DeltaPreamble                                          = 1;
         p0_NominalWithGrant                                         =-90;
 
diff --git a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
index 341010419928648bea390634dfac1c81006724c0..f61039ff17349fe8b7abca2109e6d491f1ab2e85 100644
--- a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
+++ b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf
@@ -22,7 +22,7 @@ gNBs =
     ////////// Physical parameters:
 
     ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts                                        = 1;
+    min_rxtxtime = 6;
 	
     servingCellConfigCommon = (
     {
@@ -53,29 +53,6 @@ gNBs =
       #pdcch-ConfigCommon
         initialDLBWPcontrolResourceSetZero                                      = 12;
         initialDLBWPsearchSpaceZero                                             = 0;
-      #pdsch-ConfigCommon
-        #pdschTimeDomainAllocationList (up to 16 entries)
-             initialDLBWPk0_0                    = 0;
-             #initialULBWPmappingType
-	     #0=typeA,1=typeB
-             initialDLBWPmappingType_0           = 0;
-             #this is SS=1,L=13
-             initialDLBWPstartSymbolAndLength_0  = 40;
-
-             initialDLBWPk0_1                    = 0;
-             initialDLBWPmappingType_1           = 0;
-             #this is SS=2,L=12 
-             initialDLBWPstartSymbolAndLength_1  = 53;
-
-             initialDLBWPk0_2                    = 0;
-             initialDLBWPmappingType_2           = 0;
-             #this is SS=1,L=12 
-             initialDLBWPstartSymbolAndLength_2  = 54;
-
-             initialDLBWPk0_3                    = 0;
-             initialDLBWPmappingType_3           = 0;
-             #this is SS=1,L=5
-             initialDLBWPstartSymbolAndLength_3  = 57;
 
   #uplinkConfigCommon 
      #frequencyInfoUL
@@ -130,22 +107,6 @@ gNBs =
 # 0=unrestricted, 1=restricted type A, 2=restricted type B
         restrictedSetConfig                                         = 0,
 
-      # pusch-ConfigCommon (up to 16 elements)
-        initialULBWPk2_0                      = 6;
-        initialULBWPmappingType_0             = 1
-        # this is SS=0 L=11
-        initialULBWPstartSymbolAndLength_0    = 55;
-
-        initialULBWPk2_1                      = 6;
-        initialULBWPmappingType_1             = 1;
-        # this is SS=0 L=12
-        initialULBWPstartSymbolAndLength_1    = 69;
-
-        initialULBWPk2_2                      = 7;
-        initialULBWPmappingType_2             = 1;
-        # this is SS=10 L=4
-        initialULBWPstartSymbolAndLength_2    = 52;
-
         msg3_DeltaPreamble                                          = 1;
         p0_NominalWithGrant                                         =-90;
 
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf
new file mode 100644
index 0000000000000000000000000000000000000000..0feb0bb8119446d2dec442ba037648c789e1850a
--- /dev/null
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf
@@ -0,0 +1,308 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_CU_ID = 0xe00;
+
+#     cell_type =  "CELL_MACRO_GNB";
+
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+
+    plmn_list = ({
+                  mcc = 208;
+                  mnc = 97;
+                  mnc_length = 2;
+                  snssaiList = (
+                                {
+                                  sst = 1;
+                                  sd  = 0x1; // 0 false, else true
+                                },
+                                {
+                                  sst = 1;
+                                  sd  = 0x010203; // 0 false, else true
+                                },
+                                                                                                                                                                   {
+                                  sst = 1;
+                                  sd  = 0x112233; // 0 false, else true
+                                }
+                               );
+                 });
+
+    nr_cellid = 12345678L
+
+#     tr_s_preference     = "local_mac"
+
+    ////////// Physical parameters:
+
+    ssb_SubcarrierOffset                                      = 0;
+    pdsch_AntennaPorts                                        = 1;
+    pusch_AntennaPorts                                        = 2;
+    ul_prbblacklist                                           = "51,52,53,54"
+    do_SRS                                                    = 1;
+
+    pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 11;
+        searchSpaceZero = 0;
+      }
+    );
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
+      #absoluteFrequencySSB                                          = 620640;
+      # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
+      absoluteFrequencySSB                                          = 621312;
+      # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
+      #absoluteFrequencySSB                                          = 634080;
+      # this is 3600.48 MHz
+      #absoluteFrequencySSB                                          = 640032;
+      #dl_frequencyBand                                                 = 78;
+      # this is 3301.68 MHz
+      #dl_absoluteFrequencyPointA                                       = 620112;
+      # this is 3300.60 MHz
+      dl_absoluteFrequencyPointA                                       = 620040;
+      # this is 3502.56 MHz
+      #dl_absoluteFrequencyPointA                                       = 633552;
+      # this is 3600.48 MHz
+      #dl_absoluteFrequencyPointA                                       = 640032;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                           = 1;
+        dl_carrierBandwidth                                            = 106;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=0,L=106 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                                        = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                                           = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                                      = 11;
+        initialDLBWPsearchSpaceZero                                             = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                                 = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                           = 1;
+      ul_carrierBandwidth                                            = 106;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                                        = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                                           = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 12;
+          preambleReceivedTargetPower                               = -104;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+  ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+    ////////// AMF parameters:
+        amf_ip_address      = ( { ipv4       = "CI_MME_IP_ADDR";
+                                  ipv6       = "192:168:30::17";
+                                  active     = "yes";
+                                  preference = "ipv4";
+                                                                                                                              }
+                                                                                                                                          );
+
+        NETWORK_INTERFACES :
+        {
+
+           GNB_INTERFACE_NAME_FOR_NG_AMF            = "em1";
+           GNB_IPV4_ADDRESS_FOR_NG_AMF              = "CI_GNB_IP_ADDR";
+           GNB_INTERFACE_NAME_FOR_NGU               = "em1";
+           GNB_IPV4_ADDRESS_FOR_NGU                 = "CI_GNB_IP_ADDR";
+           GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+        };
+
+  }
+);
+
+MACRLCs = (
+  {
+    num_cc           = 1;
+    tr_s_preference  = "local_L1";
+    tr_n_preference  = "local_RRC";
+#    pusch_TargetSNRx10 = 200;
+#    pucch_TargetSNRx10 = 150;
+     ulsch_max_frame_inactivity = 0;
+  }
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  thread_pool_size = 8;
+  prach_dtx_threshold = 120;
+#  pucch0_dtx_threshold = 150;
+}
+);
+
+RUs = (
+    {
+       local_rf       = "yes"
+         nb_tx          = 2
+         nb_rx          = 2
+         att_tx         = 0
+         att_rx         = 0;
+         bands          = [78];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 75;
+         eNB_instances  = [0];
+         ##beamforming 1x2 matrix: 1 layer x 2 antennas
+         bf_weights = [0x00007fff, 0x0000];
+         ##beamforming 1x4 matrix: 1 layer x 4 antennas
+         #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
+         ## beamforming 2x2 matrix:
+         # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+         ## beamforming 4x4 matrix:
+         #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
+         sf_extension = 0
+         sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
+    }
+);
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+#security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+#  ciphering_algorithms = ( "nea2" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+#  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+#  drb_ciphering = "yes";
+#  drb_integrity = "no";
+#};
+
+     log_config :
+     {
+       global_log_level                      ="info";
+       hw_log_level                          ="info";
+       phy_log_level                         ="info";
+       mac_log_level                         ="info";
+       rlc_log_level                         ="info";
+       pdcp_log_level                        ="info";
+       rrc_log_level                         ="info";
+       f1ap_log_level                         ="debug";
+    };
diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py
index 9ed9f06d8e9701e96b64a3343a6f5dde5ccbdd73..0fc37d4ead75759dfacecc3474be9e956afe1dc4 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -66,6 +66,8 @@ class EPCManagement():
 		self.mmeConfFile = 'mme.conf'
 		self.yamlPath = ''
 		self.isMagmaUsed = False
+		self.cfgDeploy = '--type start-mini --fqdn yes --scenario 1 --capture /tmp/oai-cn5g-v1.3.pcap' #from xml, 'mini' is default normal for docker-network.py 
+		self.cfgUnDeploy = '--type stop-mini --fqdn yes --scenario 1' #from xml, 'mini' is default normal for docker-network.py 
 
 
 #-----------------------------------------------------------
@@ -251,8 +253,8 @@ class EPCManagement():
 			logging.debug('Starting OAI CN5G')
 			mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
 			mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
-			mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
-			mySSH.command('./core-network.sh start nrf spgwu', '\$', 60)
+			mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5)
+			mySSH.command('python3 ./core-network.py '+self.cfgDeploy, '\$', 60)
 			time.sleep(2)
 			mySSH.command('docker-compose -p 5gcn ps -a', '\$', 60)
 			if mySSH.getBefore().count('Up (healthy)') != 6:
@@ -530,8 +532,8 @@ class EPCManagement():
 				mySSH.command('docker logs ' + c + ' > ' + self.SourceCodePath + '/logs/' + c + '.log', '\$', 5)
 
 			logging.debug('Terminating OAI CN5G')
-			mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
-			mySSH.command('./core-network.sh stop nrf spgwu', '\$', 60)
+			mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5)
+			mySSH.command('python3 ./core-network.py '+self.cfgUnDeploy, '\$', 60)
 			mySSH.command('docker volume prune --force || true', '\$', 60)
 			time.sleep(2)
 			mySSH.command('tshark -r /tmp/oai-cn5g.pcap | egrep --colour=never "Tracking area update" ','\$', 30)
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index aa7d512b3dbc52352c429c047a1ca0f231010e49..c838c3740d9cb3482b8b2e19d9bc593f8242fbbd 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -376,6 +376,16 @@ def GetParametersFromXML(action):
 		if (string_field is not None):
 			EPC.yamlPath = string_field
 
+	elif action == 'Initialize_5GCN':
+		string_field = test.findtext('args')
+		if (string_field is not None):
+			EPC.cfgDeploy = string_field	
+
+	elif action == 'Terminate_5GCN':
+		string_field = test.findtext('args')
+		if (string_field is not None):
+			EPC.cfgUnDeploy = string_field	
+
 	elif action == 'Deploy_Object' or action == 'Undeploy_Object':
 		eNB_instance=test.findtext('eNB_instance')
 		if (eNB_instance is None):
@@ -391,7 +401,7 @@ def GetParametersFromXML(action):
 		if (string_field is not None):
 			CONTAINERS.yamlPath[CONTAINERS.eNB_instance] = string_field
 
-	elif action == 'DeployGenObject' or action == 'UndeployGenObject':
+	elif action == 'DeployGenObject' or action == 'UndeployGenObject' or action == 'StatsFromGenObject':
 		string_field=test.findtext('yaml_path')
 		if (string_field is not None):
 			CONTAINERS.yamlPath[0] = string_field
@@ -931,6 +941,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 					CONTAINERS.IperfFromContainer(HTML, RAN)
 					if CONTAINERS.exitStatus==1:
 						RAN.prematureExit = True
+				elif action == 'StatsFromGenObject':
+					CONTAINERS.StatsFromGenObject(HTML)
 				else:
 					sys.exit('Invalid class (action) from xml')
 				if RAN.prematureExit:
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index beb89370d24cd0968e68a18f34b120b96345eb13..1551c1ea9a906bd6cf5e73c784363050736d29a7 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -677,13 +677,13 @@ class RANManagement():
 		# if T tracer was run with option 0 (no logs), analyze logs
 		# from textlog, otherwise do normal analysis (e.g., option 2)
 		result = re.search('T_stdout 0', str(self.Initialize_eNB_args))
-		enbLogFile = self.eNBLogFiles[int(self.eNB_instance)]
-		raw_record_file = enbLogFile.replace('.log', '_record.raw')
-		replay_log_file = enbLogFile.replace('.log', '_replay.log')
 		if (result is not None):
 			logging.debug('\u001B[1m Replaying RAW record file\u001B[0m')
 			mySSH.open(lIpAddr, lUserName, lPassWord)
 			mySSH.command('cd ' + lSourcePath + '/common/utils/T/tracer/', '\$', 5)
+			enbLogFile = self.eNBLogFiles[int(self.eNB_instance)]
+			raw_record_file = enbLogFile.replace('.log', '_record.raw')
+			replay_log_file = enbLogFile.replace('.log', '_replay.log')
 			extracted_txt_file = enbLogFile.replace('.log', '_extracted_messages.txt')
 			extracted_log_file = enbLogFile.replace('.log', '_extracted_messages.log')
 			mySSH.command('./extract_config -i ' + lSourcePath + '/cmake_targets/' + raw_record_file + ' > ' + lSourcePath + '/cmake_targets/' + extracted_txt_file, '\$', 5)
@@ -706,8 +706,6 @@ class RANManagement():
 				mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*stats.log', '.')
 				mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*.pickle', '.')
 				mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*.png', '.')
-				mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/'+raw_record_file, '.')
-				mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/'+replay_log_file, '.')
 				#
 				copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + fileToAnalyze, '.')
 				if (copyin_res == -1):
@@ -723,9 +721,7 @@ class RANManagement():
 					mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './nrL1_stats.log', self.eNBSourceCodePath + '/cmake_targets/')
 					mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './nrMAC_stats.log', self.eNBSourceCodePath + '/cmake_targets/')
 					mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.pickle', self.eNBSourceCodePath + '/cmake_targets/')
-					mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.png', self.eNBSourceCodePath + '/cmake_targets/')#RH 21/02/2002 this does not work, there are more than 1 png file
-					mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword,'./'+raw_record_file, self.eNBSourceCodePath + '/cmake_targets/')
-					mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword,'./'+replay_log_file, self.eNBSourceCodePath + '/cmake_targets/')
+					mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.png', self.eNBSourceCodePath + '/cmake_targets/')
 					#
 					mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + fileToAnalyze, self.eNBSourceCodePath + '/cmake_targets/')
 				logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + fileToAnalyze)
@@ -826,6 +822,8 @@ class RANManagement():
 		RealTimeProcessingIssue = False
 		DLRetxIssue = False
 		ULRetxIssue = False
+		nrRrcRcfgComplete = 0
+		harqFeedbackPast = 0
 	
 		line_cnt=0 #log file line counter
 		for line in enb_log_file.readlines():
@@ -1002,6 +1000,13 @@ class RANManagement():
 					#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
 					dlsch_ulsch_stats[k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
 
+			result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line))
+			if result is not None:
+				nrRrcRcfgComplete += 1
+			result = re.search('HARQ feedback is in the past', str(line))
+			if result is not None:
+				harqFeedbackPast += 1
+
 
 			#count "problem receiving samples" msg
 			result = re.search('\[PHY\]\s+problem receiving samples', str(line))
@@ -1089,6 +1094,14 @@ class RANManagement():
 				statMsg = nodeB_prefix + 'NB ran with TX Write thread enabled'
 				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
 				htmleNBFailureMsg += statMsg + '\n'
+			if nrRrcRcfgComplete > 0:
+				statMsg = nodeB_prefix + 'NB showed ' + str(nrRrcRcfgComplete) + ' "Received NR_RRCReconfigurationComplete from UE" message(s)'
+				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
+				htmleNBFailureMsg += statMsg + '\n'
+			if harqFeedbackPast > 0:
+				statMsg = nodeB_prefix + 'NB showed ' + str(harqFeedbackPast) + ' "HARQ feedback is in the past" message(s)'
+				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
+				htmleNBFailureMsg += statMsg + '\n'
 			#FR1 NSA test : add new markers to make sure gNB is used
 			if NSA_RAPROC_PUSCH_check:
 				statMsg = '[RAPROC] PUSCH with TC_RNTI message check for ' + nodeB_prefix + 'NB : PASS '
diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh
index 31ffa9d727053deb6577ae6e351f0418966b1dda..2472ffe3bcb89fd8abd7086e5d0ef751929e075b 100755
--- a/ci-scripts/runTestOnVM.sh
+++ b/ci-scripts/runTestOnVM.sh
@@ -1899,7 +1899,7 @@ function run_test_on_vm {
             CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_sa_test.log
             #last argument = 2 is to enable --sa for SA test for 106PRB
             start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 2
-            if [ $NR_UE_SYNC -eq 0 ]
+            if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ]
             then
                 echo "Problem w/ gNB and NR-UE not syncing"
                 terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
@@ -1939,6 +1939,12 @@ function run_test_on_vm {
                 SA_106PRB_STATUS=0
             fi
         done
+        #manage SYNC issue after try_cnt
+        if [ $SYNC_STATUS -ne 0 ]
+        then
+            echo "SA 106PRB test NOT OK, NOT SYNC'ED"
+            SA_106PRB_STATUS=-1
+        fi
         ########### end SA test
 
         sleep 30
@@ -1982,7 +1988,7 @@ function run_test_on_vm {
             CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_sa_test.log
             #last argument = 3 is to enable --sa for SA test for 24PRB
             start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 3
-            if [ $NR_UE_SYNC -eq 0 ]
+            if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ]
             then
                 echo "Problem w/ gNB and NR-UE not syncing"
                 terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
@@ -2022,6 +2028,12 @@ function run_test_on_vm {
                 SA_24PRB_STATUS=0
             fi
         done
+        #manage SYNC issue after try_cnt
+        if [ $SYNC_STATUS -ne 0 ]
+        then
+            echo "SA 24PRB test NOT OK, NOT SYNC'ED"
+            SA_24PRB_STATUS=-1
+        fi
         ########### end SA test
 
         sleep 30
@@ -2070,7 +2082,7 @@ function run_test_on_vm {
             CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_ra_fr2_test.log
             #last argument = 1 is to enable --do-ra for RA test
             start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
-            if [ $NR_UE_SYNC -eq 0 ]
+            if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ]
             then
                 echo "Problem w/ gNB and NR-UE not syncing"
                 terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
@@ -2110,6 +2122,12 @@ function run_test_on_vm {
                 try_cnt=$((try_cnt+10))
             fi
         done
+        #manage SYNC issue after try_cnt
+        if [ $SYNC_STATUS -ne 0 ]
+        then
+            echo "RA FR2 test NOT OK, NOT SYNC'ED"
+            RA_FR2_STATUS=-1
+        fi
         ########### end RA FR2 test
 
         sleep 30
@@ -2172,7 +2190,7 @@ function run_test_on_vm {
             CURRENT_NR_UE_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ue_ra_test.log
             #last argument = 1 is to enable --do-ra for RA test
             start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
-            if [ $NR_UE_SYNC -eq 0 ]
+            if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ]
             then
                 echo "Problem w/ gNB and NR-UE not syncing"
                 terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
@@ -2212,6 +2230,13 @@ function run_test_on_vm {
                 try_cnt=$((try_cnt+10))
             fi
           done
+          #manage SYNC issue after try_cnt
+          if [ $SYNC_STATUS -ne 0 ]
+          then
+            echo "RA FR1 test NOT OK, NOT SYNC'ED"
+            RA_FR1_STATUS=-1
+          fi
+
         done
         ########### end RA test
         
@@ -2253,7 +2278,7 @@ function run_test_on_vm {
             echo "############################################################"
             CURRENT_NR_UE_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ue.log
             start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 0
-            if [ $NR_UE_SYNC -eq 0 ]
+            if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ]
             then
                 echo "Problem w/ gNB and NR-UE not syncing"
                 terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
@@ -2332,6 +2357,13 @@ function run_test_on_vm {
                 try_cnt=$((try_cnt+10))
             fi
           done
+          #manage SYNC issue after try_cnt
+          if [ $SYNC_STATUS -ne 0 ]
+          then
+              echo "PHY test NOT OK, NOT SYNC'ED"
+              IPERF_STATUS=-1
+          fi
+
         done
         ######### end of loop
         full_l2_sim_destroy
@@ -2345,7 +2377,6 @@ function run_test_on_vm {
         if [ $SA_24PRB_STATUS -ne 0 ]; then NR_STATUS=-1; fi  
         if [ $RA_FR2_STATUS -ne 0 ]; then NR_STATUS=-1; fi        
         if [ $RA_FR1_STATUS -ne 0 ]; then NR_STATUS=-1; fi
-        if [ $SYNC_STATUS -ne 0 ]; then NR_STATUS=-1; fi
         if [ $PING_STATUS -ne 0 ]; then NR_STATUS=-1; fi
         if [ $IPERF_STATUS -ne 0 ]; then NR_STATUS=-1; fi
         if [ $NR_STATUS -eq 0 ]
diff --git a/ci-scripts/sshconnection.py b/ci-scripts/sshconnection.py
index d5b4a4c83e459ce8825977420949b2fe6588152f..dca3daa817ce8c1ab13cff291b29df605894092f 100644
--- a/ci-scripts/sshconnection.py
+++ b/ci-scripts/sshconnection.py
@@ -56,6 +56,7 @@ class SSHConnection():
 		self.picocom_closure = True
 
 	def open(self, ipaddress, username, password):
+		prompt = "#" if username == "root" else "\$"
 		count = 0
 		connect_status = False
 		while count < 4:
@@ -68,7 +69,7 @@ class SSHConnection():
 				self.sshresponse = self.ssh.expect(['password:', username + '@'])
 				if self.sshresponse == 0:
 					self.ssh.sendline(password)
-				self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+				self.sshresponse = self.ssh.expect([prompt, 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
 				if self.sshresponse == 0:
 					count = 10
 					connect_status = True
@@ -76,7 +77,7 @@ class SSHConnection():
 					logging.debug('self.sshresponse = ' + str(self.sshresponse))
 			elif self.sshresponse == 1:
 				self.ssh.sendline(password)
-				self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+				self.sshresponse = self.ssh.expect([prompt, 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
 				if self.sshresponse == 0:
 					count = 10
 					connect_status = True
@@ -84,7 +85,7 @@ class SSHConnection():
 					logging.debug('self.sshresponse = ' + str(self.sshresponse))
 			elif self.sshresponse == 2:
 				# Checking if we are really on the remote client defined by its IP address
-				self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', '\$', 5)
+				self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', prompt, 5)
 				result = re.search(str(ipaddress), str(self.ssh.before))
 				if result is None:
 					self.close()
@@ -100,7 +101,7 @@ class SSHConnection():
 				time.sleep(1)
 			count += 1
 		if connect_status:
-			self.command('unset HISTFILE', '\$', 5, silent=True)
+			self.command('unset HISTFILE', prompt, 5, silent=True)
 		else:
 			sys.exit('SSH Connection Failed')
 		self.ipaddress = ipaddress
diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml
index 9e33ee468de70d1ef0eb6b1484e02a6f539f5204..d6f75191a8da8bc7818d9c7d55adc8b9aad5d21d 100755
--- a/ci-scripts/xml_class_list.yml
+++ b/ci-scripts/xml_class_list.yml
@@ -46,3 +46,4 @@
   - UndeployGenObject
   - PingFromContainer
   - IperfFromContainer
+  - StatsFromGenObject
diff --git a/ci-scripts/xml_files/container_5g_l2sim_tdd.xml b/ci-scripts/xml_files/container_5g_l2sim_tdd.xml
new file mode 100644
index 0000000000000000000000000000000000000000..be6b789b6bc87d9ffa31661c55f7d273bb786376
--- /dev/null
+++ b/ci-scripts/xml_files/container_5g_l2sim_tdd.xml
@@ -0,0 +1,115 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+        <htmlTabRef>l2sim-5gnr-tdd</htmlTabRef>
+        <htmlTabName>Testing 5G NR L2 sim - TDD gNB</htmlTabName>
+        <htmlTabIcon>wrench</htmlTabIcon>
+        <repeatCount>2</repeatCount>
+        <TestCaseRequestedList>
+ 100001
+ 000000
+ 000001
+ 000002
+ 000003
+ 000011
+ 200000
+ 020001
+ 020002
+ 200001
+ 100001
+        </TestCaseRequestedList>
+        <TestCaseExclusionList></TestCaseExclusionList>
+
+        <testCase id="000000">
+                <class>DeployGenObject</class>
+                <desc>Deploy MySql Database</desc>
+                <yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
+                <services>mysql</services>
+                <nb_healthy>1</nb_healthy>
+        </testCase>
+
+        <testCase id="000001">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 5G CoreNetwork</desc>
+                <yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
+                <services>oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn</services>
+                <nb_healthy>6</nb_healthy>
+        </testCase>
+
+        <testCase id="000002">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 5G gNB L2 sim SA</desc>
+                <yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
+                <services>oai-gnb</services>
+                <nb_healthy>7</nb_healthy>
+        </testCase>
+
+        <testCase id="000003">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 5G NR-UE L2 sim SA and Proxy</desc>
+                <yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
+                <services>proxy oai-nr-ue0</services>
+                <nb_healthy>9</nb_healthy>
+        </testCase>
+
+        <testCase id="000011">
+                <class>IdleSleep</class>
+                <desc>Sleep</desc>
+                <idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
+        </testCase>
+
+        <testCase id="020001">
+                <class>PingFromContainer</class>
+                <desc>Ping ext-dn from NR-UE</desc>
+                <container_name>l2sim-oai-nr-ue0</container_name>
+                <options>-I oaitun_ue1 -c 20 192.168.72.135</options>
+                <loss_threshold>5</loss_threshold>
+        </testCase>
+
+        <testCase id="020002">
+                <class>PingFromContainer</class>
+                <desc>Ping NR-UE from ext-dn</desc>
+                <container_name>l2sim-oai-ext-dn</container_name>
+                <options>-c 20 12.1.1.2</options>
+                <loss_threshold>5</loss_threshold>
+        </testCase>
+
+        <testCase id="100001">
+                <class>UndeployGenObject</class>
+                <desc>Undeploy all OAI 5G stack</desc>
+                <yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
+        </testCase>
+
+        <testCase id="200000">
+                <class>StatsFromGenObject</class>
+                <desc>Statistics before Traffic Test</desc>
+                <yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
+        </testCase>
+
+        <testCase id="200001">
+                <class>StatsFromGenObject</class>
+                <desc>Statistics after Traffic Test</desc>
+                <yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
+        </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_l2sim_tdd_down.xml b/ci-scripts/xml_files/container_5g_l2sim_tdd_down.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d3630cd9059aaa8927a4738fdcdde5b291f44702
--- /dev/null
+++ b/ci-scripts/xml_files/container_5g_l2sim_tdd_down.xml
@@ -0,0 +1,38 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+        <htmlTabRef>l2sim-5gnr-down</htmlTabRef>
+        <htmlTabName>CleanUp 5G L2 sim - TDD gNB</htmlTabName>
+        <htmlTabIcon>trash</htmlTabIcon>
+        <TestCaseRequestedList>
+ 100002
+        </TestCaseRequestedList>
+        <TestCaseExclusionList></TestCaseExclusionList>
+
+        <testCase id="100002">
+                <class>UndeployGenObject</class>
+                <desc>Undeploy all OAI 5G stack</desc>
+                <yaml_path>yaml_files/5g_l2sim_tdd</yaml_path>
+        </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/fr1_sa_amarisoft_ue_1x.xml b/ci-scripts/xml_files/fr1_sa_amarisoft_ue_1x.xml
new file mode 100644
index 0000000000000000000000000000000000000000..194ed4e453e072de6e1c66c258b1c0a64590cd86
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_sa_amarisoft_ue_1x.xml
@@ -0,0 +1,87 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+	<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
+	<htmlTabName>SA Ping DL UL with 1 AS UE</htmlTabName>
+	<htmlTabIcon>tasks</htmlTabIcon>
+	<repeatCount>1</repeatCount>
+	<TestCaseRequestedList>
+ 040000
+ 000001
+ 010000
+ 000002
+ 050000
+ 080000
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="010000">
+		<class>Initialize_UE</class>
+		<desc>Run AS UE Scenario</desc>
+		<id>amarisoft_ue_1</id>
+	</testCase>
+
+
+	<testCase id="040000">
+		<class>Initialize_eNB</class>
+		<desc>Initialize gNB</desc>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
+		<eNB_instance>0</eNB_instance>
+		<eNB_serverId>0</eNB_serverId>
+		<air_interface>nr</air_interface>
+		<eNB_Trace>yes</eNB_Trace>
+		<eNB_Stats>yes</eNB_Stats>
+		<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
+		<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
+	</testCase>
+
+	<testCase id="050000">
+		<class>Ping</class>
+		<desc>Ping Log Analysis</desc>
+		<id>amarisoft_ue_1</id>
+		<ping_packetloss_threshold>1</ping_packetloss_threshold>
+	</testCase>
+
+	<testCase id="000001">
+		<class>IdleSleep</class>
+		<desc>Sleep</desc>
+		<idle_sleep_time_in_sec>60</idle_sleep_time_in_sec>
+	</testCase>
+
+	<testCase id="000002">
+		<class>IdleSleep</class>
+		<desc>Sleep</desc>
+		<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
+	</testCase>
+
+
+	<testCase id="080000">
+		<class>Terminate_eNB</class>
+		<desc>Terminate gNB</desc>
+		<eNB_instance>0</eNB_instance>
+		<eNB_serverId>0</eNB_serverId>
+		<air_interface>nr</air_interface>
+	</testCase>
+
+</testCaseList>
+
diff --git a/ci-scripts/xml_files/sa_cn5g_asue_closure.xml b/ci-scripts/xml_files/sa_cn5g_asue_closure.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b856134e367cefbe9cc7080f22a613e4ef2d775c
--- /dev/null
+++ b/ci-scripts/xml_files/sa_cn5g_asue_closure.xml
@@ -0,0 +1,38 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+	<htmlTabRef>cn5g-closure</htmlTabRef>
+	<htmlTabName>CN5G-Closure</htmlTabName>
+	<htmlTabIcon>log-out</htmlTabIcon>
+	<TestCaseRequestedList>
+060000
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="060000">
+		<class>Terminate_5GCN</class>
+		<desc>Terminate 5G Core</desc>
+		<args>--type stop-mini-as-ue --fqdn yes --scenario 1</args>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/sa_cn5g_asue_start.xml b/ci-scripts/xml_files/sa_cn5g_asue_start.xml
new file mode 100644
index 0000000000000000000000000000000000000000..740022b1c9c74b341d56bacef9ac8cb0c5368a13
--- /dev/null
+++ b/ci-scripts/xml_files/sa_cn5g_asue_start.xml
@@ -0,0 +1,39 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+	<htmlTabRef>cn5g-start-tab</htmlTabRef>
+	<htmlTabName>CN5G-Start</htmlTabName>
+	<htmlTabIcon>log-in</htmlTabIcon>
+	<TestCaseRequestedList>
+ 000100
+	</TestCaseRequestedList>
+	<TestCaseExclusionList>
+	</TestCaseExclusionList>
+
+	<testCase id="000100">
+		<class>Initialize_5GCN</class>
+		<desc>Initialize 5G Core</desc>
+		<args>--type start-mini-as-ue --fqdn yes --scenario 1 --capture /tmp/oai-cn5g-v1.3.pcap</args>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/yaml_files/5g_l2sim_tdd/README.md b/ci-scripts/yaml_files/5g_l2sim_tdd/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..531f2406ef8c622852fec4ef76108e5072ca3932
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_l2sim_tdd/README.md
@@ -0,0 +1,355 @@
+<table style="border-collapse: collapse; border: none;">
+  <tr style="border-collapse: collapse; border: none;">
+    <td style="border-collapse: collapse; border: none;">
+      <a href="http://www.openairinterface.org/">
+         <img src="../../../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
+         </img>
+      </a>
+    </td>
+    <td style="border-collapse: collapse; border: none; vertical-align: center;">
+      <b><font size = "5">OAI Full Stack 5G-NR L2 simulation with containers and a proxy</font></b>
+    </td>
+  </tr>
+</table>
+
+This page is only valid for an `Ubuntu18` host.
+
+This tutorial is only valid once this file is merged into the `develop` branch.
+
+# 1. Retrieving the images on Docker-Hub #
+
+Currently the images are hosted under the user account `rdefosseoai`.
+
+This may change in the future.
+
+Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
+
+```bash
+$ docker login
+Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
+Username:
+Password:
+```
+
+Now pull images.
+
+```bash
+$ docker pull mysql:5.7
+$ docker pull rdefosseoai/oai-amf:latest
+$ docker pull rdefosseoai/oai-nrf:latest
+$ docker pull rdefosseoai/oai-smf:latest
+$ docker pull rdefosseoai/oai-spgwu-tiny:latest
+
+$ docker pull rdefosseoai/oai-gnb:develop
+$ docker pull rdefosseoai/oai-nr-ue:develop
+$ docker pull rdefosseoai/proxy:latest
+```
+
+And **re-tag** them for tutorials' docker-compose file to work.
+
+```bash
+$ docker image tag rdefosseoai/oai-amf:latest oai-amf:latest
+$ docker image tag rdefosseoai/oai-nrf:latest oai-nrf:latest
+$ docker image tag rdefosseoai/oai-smf:latest oai-smf:latest
+$ docker image tag rdefosseoai/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
+
+$ docker image tag rdefosseoai/oai-gnb:develop oai-gnb:develop
+$ docker image tag rdefosseoai/oai-nr-ue:develop oai-nr-ue:develop
+$ docker image tag rdefosseoai/proxy:latest oai-lte-multi-ue-proxy:latest
+```
+
+```bash
+$ docker logout
+```
+
+Note that the proxy image is based on the source available at [https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy](https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy).
+
+At time of writing, the `latest` tag corresponded to `56cfdc046a5f96d5e67d42a2fc2bf6ba2fe58b41` commit.
+
+# 2. Deploy containers #
+
+**CAUTION: this SHALL be done in multiple steps.**
+
+**Just `docker-compose up -d` WILL NOT WORK!**
+
+All the following commands **SHALL** be run from the `ci-scripts/yaml_files/5g_l2sim_tdd` folder.
+
+The `gNB`, `proxy` and `NR-UE` containers will be deployed in `host`-mode. It will use the host loopback interface to connect.
+
+```bash
+sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up
+```
+
+## 2.1. Deploy OAI 5G Core Network ##
+
+```bash
+$ cd ci-scripts/yaml_files/5g_l2sim_tdd
+$ docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
+Creating network "l2sim-oai-public-net" with driver "bridge"
+Creating network "l2sim-oai-traffic_net-net" with driver "bridge"
+Creating l2sim-oai-nrf ... done
+Creating l2sim-mysql      ... done
+Creating l2sim-oai-spgwu ... done
+Creating l2sim-oai-amf   ... done
+Creating l2sim-oai-smf   ... done
+Creating l2sim-oai-ext-dn ... done
+```
+
+Wait for a bit.
+
+```bash
+$ docker-compose ps -a
+       Name                     Command                  State                  Ports
+-------------------------------------------------------------------------------------------------
+l2sim-mysql        docker-entrypoint.sh mysqld      Up (healthy)   3306/tcp, 33060/tcp         
+l2sim-oai-amf      /bin/bash /openair-amf/bin ...   Up (healthy)   38412/sctp, 80/tcp, 9090/tcp
+l2sim-oai-ext-dn   /bin/bash -c  apt update;  ...   Up (healthy)                               
+l2sim-oai-nrf      /bin/bash /openair-nrf/bin ...   Up (healthy)   80/tcp, 9090/tcp            
+l2sim-oai-smf      /bin/bash /openair-smf/bin ...   Up (healthy)   80/tcp, 8805/udp, 9090/tcp  
+l2sim-oai-spgwu    /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp          
+```
+
+At this point, you can prepare a capture on the newly-created public docker bridges:
+
+```bash
+$ ifconfig
+...
+l2sim-public: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
+        inet 192.168.71.129  netmask 255.255.255.192  broadcast 192.168.71.191
+        inet6 fe80::42:c4ff:fe2b:3d38  prefixlen 64  scopeid 0x20<link>
+        ether 02:42:c4:2b:3d:38  txqueuelen 0  (Ethernet)
+        RX packets 4  bytes 112 (112.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 7  bytes 626 (626.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+l2sim-traffic: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
+        inet 192.168.72.129  netmask 255.255.255.192  broadcast 192.168.72.191
+        inet6 fe80::42:b5ff:fed3:e732  prefixlen 64  scopeid 0x20<link>
+        ether 02:42:b5:d3:e7:32  txqueuelen 0  (Ethernet)
+        RX packets 2652  bytes 142335 (142.3 KB)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 3999  bytes 23367972 (23.3 MB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+...
+
+$ sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not arp and not port 53 and not port 2152 and not port 2153)" -i l2sim-public -i l2sim-traffic -w /tmp/capture_5g_l2sim_tdd.pcap > /tmp/tshark.log 2>&1 &
+```
+
+## 2.2. Deploy OAI gNB in Standalone Mode as a VNF ##
+
+**CAUTION: To execute this 2nd step, the whole `CN5G` SHALL be in `healthy` state (especially the `mysql` container).**
+
+```bash
+$ docker-compose up -d oai-gnb
+l2sim-oai-nrf is up-to-date
+l2sim-oai-spgwu is up-to-date
+l2sim-oai-ext-dn is up-to-date
+Creating l2sim-oai-gnb ... done
+```
+
+Wait for a bit.
+
+```bash
+$ docker-compose ps -a
+       Name                     Command                  State                  Ports
+-------------------------------------------------------------------------------------------------
+l2sim-mysql        docker-entrypoint.sh mysqld      Up (healthy)   3306/tcp, 33060/tcp         
+l2sim-oai-amf      /bin/bash /openair-amf/bin ...   Up (healthy)   38412/sctp, 80/tcp, 9090/tcp
+l2sim-oai-ext-dn   /bin/bash -c  apt update;  ...   Up (healthy)                               
+l2sim-oai-gnb      /opt/oai-gnb/bin/entrypoin ...   Up (healthy)                               
+l2sim-oai-nrf      /bin/bash /openair-nrf/bin ...   Up (healthy)   80/tcp, 9090/tcp            
+l2sim-oai-smf      /bin/bash /openair-smf/bin ...   Up (healthy)   80/tcp, 8805/udp, 9090/tcp  
+l2sim-oai-spgwu    /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp          
+```
+
+You can verify that the `gNB` is connected with the `AMF`:
+
+```bagh
+$ docker logs rfsim5g-oai-amf
+...
+[AMF] [amf_app] [info ] |----------------------------------------------------gNBs' information-------------------------------------------|
+[AMF] [amf_app] [info ] |    Index    |      Status      |       Global ID       |       gNB Name       |               PLMN             |
+[AMF] [amf_app] [info ] |      1      |    Connected     |         0x0       |         gnb-l2sim-vnf    |            208, 99             |
+[AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
+...
+```
+
+## 2.3. Deploy OAI NR-UE and proxy
+
+```bash
+$ docker-compose up -d proxy oai-nr-ue0
+l2sim-mysql is up-to-date
+l2sim-oai-nrf is up-to-date
+l2sim-oai-amf is up-to-date
+l2sim-oai-smf is up-to-date
+l2sim-oai-spgwu is up-to-date
+l2sim-oai-ext-dn is up-to-date
+l2sim-oai-gnb is up-to-date
+Creating l2sim-oai-nr-ue ... done
+Creating l2sim-proxy ... done
+```
+
+Wait for a bit.
+
+```bash
+$ docker-compose ps -a
+       Name                     Command                  State                  Ports
+-------------------------------------------------------------------------------------------------
+l2sim-mysql        docker-entrypoint.sh mysqld      Up (healthy)   3306/tcp, 33060/tcp         
+l2sim-oai-amf      /bin/bash /openair-amf/bin ...   Up (healthy)   38412/sctp, 80/tcp, 9090/tcp
+l2sim-oai-ext-dn   /bin/bash -c  apt update;  ...   Up (healthy)                               
+l2sim-oai-gnb      /opt/oai-gnb/bin/entrypoin ...   Up (healthy)                               
+l2sim-oai-nr-ue0   /opt/oai-nr-ue/bin/entrypo ...   Up (healthy)                               
+l2sim-oai-nrf      /bin/bash /openair-nrf/bin ...   Up (healthy)   80/tcp, 9090/tcp            
+l2sim-oai-smf      /bin/bash /openair-smf/bin ...   Up (healthy)   80/tcp, 8805/udp, 9090/tcp  
+l2sim-oai-spgwu    /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp          
+l2sim-proxy        /oai-lte-multi-ue-proxy/bi ...   Up (healthy)                               
+
+$ docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}	{{.MemUsage}}\t{{.MemPerc}}" l2sim-mysql l2sim-oai-amf l2sim-oai-ext-dn l2sim-oai-gnb l2sim-oai-nr-ue0 l2sim-oai-nrf l2sim-oai-smf l2sim-oai-spgwu l2sim-proxy
+CONTAINER          CPU %     MEM USAGE / LIMIT     MEM %
+l2sim-mysql        0.03%     206.7MiB / 62.54GiB   0.32%
+l2sim-oai-amf      4.05%     29.49MiB / 62.54GiB   0.05%
+l2sim-oai-ext-dn   0.00%     31.27MiB / 62.54GiB   0.05%
+l2sim-oai-gnb      1.29%     1.853GiB / 62.54GiB   2.96%
+l2sim-oai-nr-ue0   1.43%     350.8MiB / 62.54GiB   0.55%
+l2sim-oai-nrf      0.21%     9.105MiB / 62.54GiB   0.01%
+l2sim-oai-smf      3.24%     30.23MiB / 62.54GiB   0.05%
+l2sim-oai-spgwu    0.00%     11.78MiB / 62.54GiB   0.02%
+l2sim-proxy        6.97%     290.4MiB / 62.54GiB   0.45%
+```
+
+**CAUTION: As you can see the CPU usage is not that important compared to a 5G RF simulator equivalent.**
+
+But the CPU speed matters; I am running on a fast server:
+
+```bash
+$ lscpu
+Architecture:        x86_64
+CPU(s):              16
+...
+Model name:          Intel(R) Xeon(R) Silver 4215R CPU @ 3.20GHz
+```
+
+I tried on a slower server with more CPUs and it did not work:
+
+```bash
+oaici@orion:~$ lscpu
+Architecture:        x86_64
+CPU(s):              48
+...
+Model name:          Intel(R) Xeon(R) CPU E5-2658 v3 @ 2.20GHz
+```
+
+We will work on this issue.
+
+
+Making sure the OAI UE is connected:
+
+```bash
+$ docker exec -it l2sim-oai-nr-ue /bin/bash
+root@bb4d400a832d:/opt/oai-nr-ue# ifconfig
+eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
+        inet 192.168.71.137  netmask 255.255.255.192  broadcast 192.168.71.191
+        ether 02:42:c0:a8:47:89  txqueuelen 0  (Ethernet)
+        RX packets 224259  bytes 5821372018 (5.8 GB)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 235916  bytes 7848786376 (7.8 GB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
+        inet 127.0.0.1  netmask 255.0.0.0
+        loop  txqueuelen 1000  (Local Loopback)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+oaitun_ue1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
+        inet 12.1.1.2  netmask 255.255.255.0  destination 12.1.1.2
+        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+```
+
+# 3. Check traffic #
+
+## 3.1. Check your Internet connectivity ##
+
+You can also check with the `ext-dn` container (IP address is `192.168.72.135` in docker-compose)
+
+```bash
+$ docker exec -it l2sim-oai-nr-ue /bin/bash
+root@bb4d400a832d# ping -I oaitun_ue1 -c 20 192.168.72.135
+PING 192.168.72.135 (192.168.72.135) from 12.1.1.2 oaitun_ue1: 56(84) bytes of data.
+64 bytes from 192.168.72.135: icmp_seq=1 ttl=63 time=65.1 ms
+64 bytes from 192.168.72.135: icmp_seq=2 ttl=63 time=74.2 ms
+...
+64 bytes from 192.168.72.135: icmp_seq=19 ttl=63 time=25.0 ms
+64 bytes from 192.168.72.135: icmp_seq=20 ttl=63 time=34.7 ms
+
+--- 192.168.72.135 ping statistics ---
+20 packets transmitted, 20 received, 0% packet loss, time 19025ms
+rtt min/avg/max/mdev = 16.413/120.639/209.673/57.159 ms
+```
+
+# 4. Un-deployment #
+
+```bash
+$ docker-compose down
+Stopping l2sim-oai-nr-ue2 ... done
+Stopping l2sim-oai-nr-ue  ... done
+Stopping l2sim-oai-gnb    ... done
+Stopping l2sim-oai-ext-dn ... done
+Stopping l2sim-oai-spgwu  ... done
+Stopping l2sim-oai-smf    ... done
+Stopping l2sim-oai-amf    ... done
+Stopping l2sim-oai-nrf    ... done
+Stopping l2sim-mysql      ... done
+Removing l2sim-oai-nr-ue2 ... done
+Removing l2sim-oai-nr-ue  ... done
+Removing l2sim-oai-gnb    ... done
+Removing l2sim-oai-ext-dn ... done
+Removing l2sim-oai-spgwu  ... done
+Removing l2sim-oai-smf    ... done
+Removing l2sim-oai-amf    ... done
+Removing l2sim-oai-nrf    ... done
+Removing l2sim-mysql      ... done
+Removing network l2sim-oai-public-net
+Removing network l2sim-oai-traffic-net
+```
+
+# 5. Adapt the `docker-compose` to your environment #
+
+In the `SMF` section, provide your own DNS IP address:
+
+```yaml
+            DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
+```
+
+In the `gNB` section, provide your docker-host primary IP address and interface name: in our case `192.168.18.193` and `eno1`.
+
+```yaml
+            GNB_NGA_IF_NAME: eno1
+            GNB_NGA_IP_ADDRESS: 192.168.18.193
+            GNB_NGU_IF_NAME: eno1
+            GNB_NGU_IP_ADDRESS: 192.168.18.193
+```
+
+Same thing in the `nr-ue` section:
+
+```yaml
+            NR_UE_NFAPI_IF_NAME: eno1
+```
+
+This tutorial is a first draft. This nFAPI feature and the proxy are still under development.
+
+At time of writing, we were able to run in `host-mode`, 1 `NR-UE` and just ping traffic.
+
+Later development will include:
+
+  -  deploying `gNB-VNF`, `proxy` and `UE` in isolated containers (with their own IP address)
+  -  more UEs
+  -  more traffic (`UDP` and `TCP`)
diff --git a/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml b/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c899f8cc7e2076593e8f848cf2d3dbd36bb75c53
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml
@@ -0,0 +1,322 @@
+version: '3.8'
+services:
+    oai-nrf:
+        container_name: "l2sim-oai-nrf"
+        image: oai-nrf:latest
+        environment:
+            - NRF_INTERFACE_NAME_FOR_SBI=eth0
+            - NRF_INTERFACE_PORT_FOR_SBI=80
+            - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
+            - NRF_API_VERSION=v1
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.130
+        volumes:
+            - ../5g_rfsimulator/nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    mysql:
+        container_name: "l2sim-mysql"
+        image: mysql:5.7
+        volumes:
+            - ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
+            - ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
+        environment:
+            - TZ=Europe/Paris
+            - MYSQL_DATABASE=oai_db
+            - MYSQL_USER=test
+            - MYSQL_PASSWORD=test
+            - MYSQL_ROOT_PASSWORD=linux
+        healthcheck:
+            test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.131
+    oai-amf:
+        container_name: "l2sim-oai-amf"
+        image: oai-amf:latest
+        environment:
+            - TZ=Europe/paris
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+            - MCC=208
+            - MNC=99
+            - REGION_ID=128
+            - AMF_SET_ID=1
+            - SERVED_GUAMI_MCC_0=208
+            - SERVED_GUAMI_MNC_0=99
+            - SERVED_GUAMI_REGION_ID_0=128
+            - SERVED_GUAMI_AMF_SET_ID_0=1
+            - SERVED_GUAMI_MCC_1=460
+            - SERVED_GUAMI_MNC_1=11
+            - SERVED_GUAMI_REGION_ID_1=10
+            - SERVED_GUAMI_AMF_SET_ID_1=1
+            - PLMN_SUPPORT_MCC=208
+            - PLMN_SUPPORT_MNC=99
+            - PLMN_SUPPORT_TAC=0x0001
+            - SST_0=1
+            - SD_0=1
+            - SST_1=1
+            - SD_1=12
+            - AMF_INTERFACE_NAME_FOR_NGAP=eth0
+            - AMF_INTERFACE_NAME_FOR_N11=eth0
+            - SMF_INSTANCE_ID_0=1
+            - SMF_FQDN_0=oai-smf
+            - SMF_IPV4_ADDR_0=0.0.0.0
+            - SMF_HTTP_VERSION_0=v1
+            - SELECTED_0=true
+            - SMF_INSTANCE_ID_1=2
+            - SMF_FQDN_1=oai-smf
+            - SMF_IPV4_ADDR_1=0.0.0.0
+            - SMF_HTTP_VERSION_1=v1
+            - SELECTED_1=false
+            - MYSQL_SERVER=192.168.71.131
+            - MYSQL_USER=root
+            - MYSQL_PASS=linux
+            - MYSQL_DB=oai_db
+            - OPERATOR_KEY=c42449363bbad02b66d16bc975d77cc1
+            - NRF_IPV4_ADDRESS=192.168.71.130
+            - NRF_PORT=80
+            - NF_REGISTRATION=yes
+            - SMF_SELECTION=yes
+            - USE_FQDN_DNS=yes
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+            - EXTERNAL_AUSF=no
+            - AUSF_IPV4_ADDRESS=0.0.0.0
+            - AUSF_PORT=80
+            - AUSF_API_VERSION=v1
+            - AUSF_FQDN=localhost
+        depends_on:
+            - oai-nrf
+            - mysql
+        volumes:
+            - ../5g_rfsimulator/amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh"
+            interval: 10s
+            timeout: 15s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.132
+    oai-smf:
+        container_name: "l2sim-oai-smf"
+        image: oai-smf:latest
+        environment:
+            - TZ=Europe/Paris
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+            - SMF_INTERFACE_NAME_FOR_N4=eth0
+            - SMF_INTERFACE_NAME_FOR_SBI=eth0
+            - SMF_INTERFACE_PORT_FOR_SBI=80
+            - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
+            - SMF_API_VERSION=v1
+            - DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
+            - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
+            - AMF_IPV4_ADDRESS=0.0.0.0
+            - AMF_PORT=80
+            - AMF_API_VERSION=v1
+            - AMF_FQDN=oai-amf
+            - UDM_IPV4_ADDRESS=127.0.0.1
+            - UDM_PORT=80
+            - UDM_API_VERSION=v1
+            - UDM_FQDN=localhost
+            - UPF_IPV4_ADDRESS=192.168.71.134
+            - UPF_FQDN_0=oai-spgwu
+            - NRF_IPV4_ADDRESS=192.168.71.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+            - REGISTER_NRF=yes
+            - DISCOVER_UPF=yes
+            - USE_FQDN_DNS=yes
+            - DNN_NI0=oai
+            - DNN_NI2=oai.ipv4
+        depends_on:
+            - oai-nrf
+            - oai-amf
+        volumes:
+            - ../5g_rfsimulator/smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.133
+    oai-spgwu:
+        container_name: "l2sim-oai-spgwu"
+        image: oai-spgwu-tiny:latest
+        environment:
+            - TZ=Europe/Paris
+            - PID_DIRECTORY=/var/run
+            - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
+            - SGW_INTERFACE_NAME_FOR_SX=eth0
+            - PGW_INTERFACE_NAME_FOR_SGI=eth0
+            - NETWORK_UE_NAT_OPTION=yes
+            - NETWORK_UE_IP=12.1.1.0/24
+            - SPGWC0_IP_ADDRESS=192.168.71.133
+            - BYPASS_UL_PFCP_RULES=no
+            - MCC=208
+            - MNC=99
+            - MNC03=099
+            - TAC=1
+            - GTP_EXTENSION_HEADER_PRESENT=yes
+            - GW_ID=1
+            - REALM=openairinterface.org
+            - ENABLE_5G_FEATURES=yes
+            - REGISTER_NRF=yes
+            - USE_FQDN_NRF=yes
+            - UPF_FQDN_5G=oai-spgwu
+            - NRF_IPV4_ADDRESS=192.168.71.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+            - NSSAI_SST_0=1
+            - NSSAI_SD_0=1
+            - DNN_0=oai
+        depends_on:
+            - oai-nrf
+            - oai-smf
+        cap_add:
+            - NET_ADMIN
+            - SYS_ADMIN
+        cap_drop:
+            - ALL
+        privileged: true
+        volumes:
+            - ../5g_rfsimulator/spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.134
+            traffic_net:
+                ipv4_address: 192.168.72.134
+    oai-ext-dn:
+        image: ubuntu:bionic
+        privileged: true
+        container_name: "l2sim-oai-ext-dn"
+        entrypoint: /bin/bash -c \
+              "apt update; apt install -y procps iptables iproute2 iperf iputils-ping;"\
+              "ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
+        depends_on:
+            - oai-spgwu
+        networks:
+            traffic_net:
+                ipv4_address: 192.168.72.135
+        healthcheck:
+            test: /bin/bash -c "ping -c 2 192.168.72.134"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    oai-gnb:
+        image: oai-gnb:develop
+        privileged: true
+        container_name: "l2sim-oai-gnb"
+        network_mode: "host"
+        environment:
+            TZ: Europe/Paris
+            USE_SA_NFAPI_VNF: 'yes'
+            GNB_NAME: gnb-l2sim-vnf
+            TAC: 1
+            MCC: '208'
+            MNC: '99'
+            MNC_LENGTH: 2
+            NSSAI_SST: 1
+            NSSAI_SD0: 1
+            NSSAI_SD1: 112233
+            AMF_IP_ADDRESS: 192.168.71.132
+            GNB_NGA_IF_NAME: eno1
+            GNB_NGA_IP_ADDRESS: 192.168.18.193
+            GNB_NGU_IF_NAME: eno1
+            GNB_NGU_IP_ADDRESS: 192.168.18.193
+            LOCAL_S_IF_NAME: 'lo:'
+            REMOTE_S_ADDRESS: 127.0.0.1
+            LOCAL_S_ADDRESS: 127.0.0.2
+            USE_ADDITIONAL_OPTIONS: --sa --nfapi 2 --emulate-l1 --log_config.global_log_options level,time,thread_id,nocolor
+        depends_on:
+            - oai-spgwu
+            - oai-amf
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-softmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    proxy:
+        image: oai-lte-multi-ue-proxy:latest
+        privileged: true
+        container_name: "l2sim-proxy"
+        network_mode: "host"
+        environment:
+            TZ: Europe/Paris
+        command: "/oai-lte-multi-ue-proxy/bin/proxy 1 --nr"
+        depends_on:
+            - oai-gnb
+        healthcheck:
+            test: /bin/bash -c "pgrep proxy"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    oai-nr-ue0:
+        image: oai-nr-ue:develop
+        privileged: true
+        container_name: "l2sim-oai-nr-ue0"
+        network_mode: "host"
+        environment:
+            TZ: Europe/Paris
+            USE_NFAPI: 'yes'
+            OPENAIR_DIR: /opt/oai-nr-ue
+            FULL_IMSI: '208990100001100'
+            FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
+            OPC: 'C42449363BBAD02B66D16BC975D77CC1'
+            DNN: oai
+            NSSAI_SST: 1
+            NSSAI_SD: 1
+            NR_UE_NFAPI_IF_NAME: eno1
+            GNB_IP_ADDRESS: 127.0.0.1
+            NR_UE_IP_ADDRESS: 127.0.0.1
+            USE_ADDITIONAL_OPTIONS: --nokrnmod 1  --nfapi 5 --node-number 2 --sa --emulate-l1 --log_config.global_log_options level,time,thread_id,nocolor
+        volumes:
+            - ../../../openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results:/opt/oai-nr-ue/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results
+        depends_on:
+            - oai-gnb
+            - proxy
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-uesoftmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+networks:
+    public_net:
+        driver: bridge
+        name: l2sim-oai-public-net
+        ipam:
+            config:
+                - subnet: 192.168.71.128/26
+        driver_opts:
+            com.docker.network.bridge.name: "l2sim-public"
+    traffic_net:
+        driver: bridge
+        name: l2sim-oai-traffic-net
+        ipam:
+            config:
+                - subnet: 192.168.72.128/26
+        driver_opts:
+            com.docker.network.bridge.name: "l2sim-traffic"
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index bf4b57524efbd85fb7f766f91d73ef7a4892637d..4eca19c06b2360d9bcc9cf310f5116d070e65cb8 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1782,7 +1782,8 @@ set(NR_PDCP_SRC
   )
 
 set(NR_SDAP_SRC
-  ${OPENAIR2_DIR}/SDAP/nr_sdap/nr_sdap_gnb.c
+  ${OPENAIR2_DIR}/SDAP/nr_sdap/nr_sdap.c
+  ${OPENAIR2_DIR}/SDAP/nr_sdap/nr_sdap_entity.c
   )
   
 set(L2_SRC
diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c
index 5b047c082d057b2bcd795a7d9c98084b5ad34fd3..8be35680342b8ff7793af73607bab9efded6c5f7 100644
--- a/common/utils/LOG/log.c
+++ b/common/utils/LOG/log.c
@@ -478,6 +478,7 @@ int logInit (void)
   register_log_component("NAS","log",NAS);
   register_log_component("UDP","",UDP_);
   register_log_component("GTPU","",GTPU);
+  register_log_component("SDAP","",SDAP);
   register_log_component("S1AP","",S1AP);
   register_log_component("F1AP","",F1AP);
   register_log_component("M2AP","",M2AP);
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index 1fbf42f62d43c02952ffcc487acc00636fc8f735..89b9c5e94d258e4662920f7a2cdf01505dcb62d4 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -215,6 +215,7 @@ typedef enum {
   OCM,
   UDP_,
   GTPU,
+  SDAP,
   SPGW,
   S1AP,
   F1AP,
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index a8b919e5252459e007c696744515a42ef7ac7e9c..b3c06d6be8a195ea81dba9748fd96ee1a9cf839c 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -944,6 +944,27 @@ ID = LEGACY_GTPU_TRACE
     GROUP = ALL:LEGACY_GTPU:LEGACY_GROUP_TRACE:LEGACY
     FORMAT = string,log
 
+ID = LEGACY_SDAP_INFO
+    DESC = SDAP legacy logs - info level
+    GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_INFO:LEGACY
+    FORMAT = string,log
+ID = LEGACY_SDAP_ERROR
+    DESC = SDAP legacy logs - error level
+    GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_ERROR:LEGACY
+    FORMAT = string,log
+ID = LEGACY_SDAP_WARNING
+    DESC = SDAP legacy logs - warning level
+    GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_WARNING:LEGACY
+    FORMAT = string,log
+ID = LEGACY_SDAP_DEBUG
+    DESC = SDAP legacy logs - debug level
+    GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_DEBUG:LEGACY
+    FORMAT = string,log
+ID = LEGACY_SDAP_TRACE
+    DESC = SDAP legacy logs - trace level
+    GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_TRACE:LEGACY
+    FORMAT = string,log
+
 ID = LEGACY_TMR_INFO
     DESC = TMR legacy logs - info level
     GROUP = ALL:LEGACY_TMR:LEGACY_GROUP_INFO:LEGACY
diff --git a/doc/FEATURE_SET.md b/doc/FEATURE_SET.md
index eaa691d6ef07142ba399cb1e308b7b9926183c3a..a289c6d17eb491005f037b05f8037e72d9b606c8 100644
--- a/doc/FEATURE_SET.md
+++ b/doc/FEATURE_SET.md
@@ -351,6 +351,14 @@ The following features are valid for the gNB and the 5G-NR UE.
   - Interfaces with RRC, RLC 
   - Interfaces with gtp-u (data Tx/Rx over N3 and F1-U interfaces)
 
+**gNB SDAP**
+- Send/Receive operations according to 37.324 Rel.15
+  - Establishment/Handling of SDAP entities.
+  - Transfer of User Plane Data
+  - Mapping between a QoS flow and a DRB for both DL and UL
+  - Marking QoS flow ID in both DL and UL packets
+  - Reflective QoS flow to DRB mapping for UL SDAP data PDUs
+
 **gNB RRC**
 - NR RRC (38.331) Rel 16 messages using new asn1c 
 - LTE RRC (36.331) also updated to Rel 15 
@@ -400,6 +408,7 @@ The following features are valid for the gNB and the 5G-NR UE.
 - New gtp-u implementation supporting both N3 and F1-U interfaces according to 29.281 Rel.15
   - Interfaces with RRC, F1AP for tunnel creation
   - Interfaces with PDCP and RLC for data send/receive at the CU and DU respectively (F1-U interface)
+  - Interface with SDAP for data send/receive, capture of GTP-U Optional Header, GTP-U Extension Header and PDU Session Container.
 
 # OpenAirInterface 5G-NR UE Feature Set #
 
@@ -502,6 +511,13 @@ The following features are valid for the gNB and the 5G-NR UE.
    - Radio bearer establishment/handling and association with PDCP entities
    - Interfaces with RRC, RLC 
 
+**UE SDAP**
+*  Tx/Rx operations operations according to 37.324 Rel.15
+  - Establishment/Handling of SDAP entities.
+  - Transfer of User Plane Data
+  - Reflective Mapping
+  - RRC Signaling Mapping
+
 **UE RRC**
 * Integration of RRC messages and procedures supporting UE 5G SA connection according to 38.331 Rel.16 
    - RRCSetupRequest/RRCSetup/RRCSetupComplete
diff --git a/doc/L2NFAPI.md b/doc/L2NFAPI.md
index 5b8c0f546cf1c1e323e0004d7e85029d355fc1ba..77f9e5cb783ccae80805fb937be918138d2e98e5 100644
--- a/doc/L2NFAPI.md
+++ b/doc/L2NFAPI.md
@@ -46,6 +46,8 @@ This proxy allows to perform L2 nFAPI simulator for:
 * 5G-NSA
 * 5G-SA
 
+Another tutorial for 5G SA mode with 1 User is available [here](../ci-scripts/yaml_files/5g_l2sim_tdd/README.md).
+
 ----
 
 [oai wiki home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2
index 498e6bedcf09085dbd88fb4e902b64cfe0750a69..dfb28cfd1d78e48b2affee2a2e1bb682d7d17308 100644
--- a/docker/Dockerfile.nrUE.rhel8.2
+++ b/docker/Dockerfile.nrUE.rhel8.2
@@ -29,7 +29,8 @@ FROM ran-base:latest AS nr-ue-base
 
 FROM ran-build:latest AS nr-ue-build 
 
-RUN cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/nr_ue_parameters.yaml && \
+    cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
 
 #start from scratch for target executable
 FROM registry.access.redhat.com/ubi8/ubi:latest as oai-nr-ue
@@ -62,7 +63,10 @@ COPY --from=nr-ue-build \
     ./
 
 WORKDIR /opt/oai-nr-ue/etc
-COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
+COPY --from=nr-ue-build \
+    /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf \
+    /oai-ran/docker/etc/nr-ue.nfapi.conf \
+    ./
 
 COPY --from=nr-ue-build \
     /oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
@@ -118,5 +122,5 @@ WORKDIR /opt/oai-nr-ue/etc
 COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
 
 WORKDIR /opt/oai-nr-ue
-CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"]
+CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue.conf"]
 ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18
index 0edfdd21605f4498aa3007ae8acec4b1153e9317..9f68b947cd10d1a9324b2c2ba9e2b1d210da9ffc 100644
--- a/docker/Dockerfile.nrUE.ubuntu18
+++ b/docker/Dockerfile.nrUE.ubuntu18
@@ -29,7 +29,8 @@ FROM ran-base:latest AS nr-ue-base
 
 FROM ran-build:latest AS nr-ue-build
 
-RUN cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/nr_ue_parameters.yaml && \
+    cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh
 
 #start from scratch for target executable
 FROM ubuntu:bionic as oai-nr-ue
@@ -67,7 +68,10 @@ COPY --from=nr-ue-build \
     ./
 
 WORKDIR /opt/oai-nr-ue/etc
-COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
+COPY --from=nr-ue-build \
+    /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf \
+    /oai-ran/docker/etc/nr-ue.nfapi.conf \
+    ./
 
 COPY --from=nr-ue-build \
     /oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \
@@ -106,5 +110,5 @@ RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai
     ldconfig
 
 WORKDIR /opt/oai-nr-ue
-CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"]
+CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue.conf"]
 ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
diff --git a/docker/scripts/generateTemplate.py b/docker/scripts/generateTemplate.py
index 297c202a03d497287345922bf5835eabc2cae176..850bb535a52abd6bc08159d72e0593d78b03bc2d 100644
--- a/docker/scripts/generateTemplate.py
+++ b/docker/scripts/generateTemplate.py
@@ -23,6 +23,7 @@
 #-----------------------------------------------------------
 # Import
 #-----------------------------------------------------------
+import glob
 import re
 import yaml
 import os
@@ -33,7 +34,8 @@ def main():
   #read yaml input parameters
   f = open(f'{sys.argv[1]}',)
   data = yaml.full_load(f)
-  dir = os.listdir(f'{data[0]["paths"]["source_dir"]}')
+  initial_path = f'{data[0]["paths"]["source_dir"]}'
+  dir = glob.glob(initial_path + '/**/*.conf', recursive=True)
 
   #identify configs, read and replace corresponding values
   for config in data[1]["configurations"]:
@@ -42,7 +44,10 @@ def main():
     print('================================================')
     print('filePrefix = ' + filePrefix)
     print('outputfilename = ' + outputfilename)
+    found = False
     for inputfile in dir:
+      if found:
+        continue
       if inputfile.find(filePrefix) >=0:
         prefix_outputfile = {"cu.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', 
                              "du.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
@@ -58,10 +63,13 @@ def main():
                              "gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
+                             "proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
+                             "proxy_nr-ue.nfapi.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "ue.nfapi": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "ue_sim_ci": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}'
                              }
         print('inputfile = ' + inputfile)
+        found = True
         if filePrefix in prefix_outputfile:
           outputfile1 = prefix_outputfile[filePrefix]  
 
@@ -69,7 +77,7 @@ def main():
         if not os.path.exists(directory):
           os.makedirs(directory, exist_ok=True)
 
-        with open(f'{data[0]["paths"]["source_dir"]}{inputfile}', mode='r') as inputfile, \
+        with open(f'{inputfile}', mode='r') as inputfile, \
              open(outputfile1, mode='w') as outputfile:
           for line in inputfile:
             count = 0
diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh
index aec5c4805052187d8d31095aaaac223809043e56..dd6256609c8085aec0b6b0c68e63caa2fe61d601 100755
--- a/docker/scripts/gnb_entrypoint.sh
+++ b/docker/scripts/gnb_entrypoint.sh
@@ -11,8 +11,9 @@ THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
 if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi
 if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi
 if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi
-if [[ -v USE_SA_CU ]]; then ln -s $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi
+if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi
 if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi
+if [[ -v USE_SA_NFAPI_VNF ]]; then cp $PREFIX/etc/gnb.sa.nfapi.vnf.conf $PREFIX/etc/gnb.conf; fi
 # Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself.
 if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/gnb.conf; fi
 
diff --git a/docker/scripts/gnb_parameters.yaml b/docker/scripts/gnb_parameters.yaml
index 8547d48e676af3629f4c659ea27db75dc259d059..d5942f2c9b4559d6db4b8e0eb76b1b7a01d27e53 100644
--- a/docker/scripts/gnb_parameters.yaml
+++ b/docker/scripts/gnb_parameters.yaml
@@ -202,3 +202,39 @@
     - key: remote_n_portd
       env: "@F1_CU_D_PORT@"
 
+  - filePrefix: proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf
+    outputfilename: "gnb.sa.nfapi.vnf.conf"
+    config:
+    - key: Active_gNBs
+      env: "@GNB_NAME@"
+    - key: gNB_name
+      env: "@GNB_NAME@"
+    - key: mcc
+      env: "@MCC@"
+    - key: mnc
+      env: "@MNC@"
+    - key: mnc_length
+      env: "@MNC_LENGTH@"
+    - key: tracking_area_code
+      env: "@TAC@"
+    - key: sst
+      env: "@NSSAI_SST@"
+    - key: ipv4
+      env: "@AMF_IP_ADDRESS@"
+    - key: GNB_INTERFACE_NAME_FOR_NG_AMF
+      env: "@GNB_NGA_IF_NAME@"
+    - key: GNB_IPV4_ADDRESS_FOR_NG_AMF
+      env: "@GNB_NGA_IP_ADDRESS@"
+    - key: GNB_INTERFACE_NAME_FOR_NGU
+      env: "@GNB_NGU_IF_NAME@"
+    - key: GNB_IPV4_ADDRESS_FOR_NGU
+      env: "@GNB_NGU_IP_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
+    - key: local_s_if_name
+      env: "@LOCAL_S_IF_NAME@"
+    - key: remote_s_address
+      env: "@REMOTE_S_ADDRESS@"
+    - key: local_s_address
+      env: "@LOCAL_S_ADDRESS@"
+
diff --git a/docker/scripts/nr_ue_entrypoint.sh b/docker/scripts/nr_ue_entrypoint.sh
index af2b8a83333d140aefdbaae0527322d7af2de269..38b080a41b73b6c911826ada9d4ee943a1335fb1 100755
--- a/docker/scripts/nr_ue_entrypoint.sh
+++ b/docker/scripts/nr_ue_entrypoint.sh
@@ -5,12 +5,22 @@ set -euo pipefail
 PREFIX=/opt/oai-nr-ue
 
 # Based another env var, pick one template to use
-#if [[ -v USE_NFAPI ]]; then cp $PREFIX/etc/ue.nfapi.conf $PREFIX/etc/ue.conf; fi
+if [[ -v USE_NFAPI ]]; then cp $PREFIX/etc/nr-ue.nfapi.conf $PREFIX/etc/nr-ue.conf; fi
+# Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself.
+if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/nr-ue.conf; fi
+# if none, pick the default
+if [ ! -f $PREFIX/etc/nr-ue.conf ]; then cp $PREFIX/etc/nr-ue-sim.conf $PREFIX/etc/nr-ue.conf; fi
 
-# Only this template will be manipulated and the USIM one!
-CONFIG_FILES=`ls $PREFIX/etc/ue.conf $PREFIX/etc/nr-ue-sim.conf || true`
+# Only this template will be manipulated
+CONFIG_FILES=`ls $PREFIX/etc/nr-ue.conf || true`
 
 for c in ${CONFIG_FILES}; do
+    # Sometimes templates have no pattern to be replaced.
+    if ! grep -oP '@[a-zA-Z0-9_]+@' ${c}; then
+        echo "Configuration is already set"
+        break
+    fi
+
     # grep variable names (format: ${VAR}) from template to be rendered
     VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
 
diff --git a/docker/scripts/nr_ue_parameters.yaml b/docker/scripts/nr_ue_parameters.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..afdba880e1eb2ccc02ab714309a5aa7c59715369
--- /dev/null
+++ b/docker/scripts/nr_ue_parameters.yaml
@@ -0,0 +1,49 @@
+#/*
+# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+# * contributor license agreements.  See the NOTICE file distributed with
+# * this work for additional information regarding copyright ownership.
+# * The OpenAirInterface Software Alliance licenses this file to You under
+# * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+# * except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# *      http://www.openairinterface.org/?page_id=698
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# *-------------------------------------------------------------------------------
+# * For more information about the OpenAirInterface (OAI) Software Alliance:
+# *      contact@openairinterface.org
+# */
+
+---
+- paths:
+    source_dir: "ci-scripts/conf_files/"
+    dest_dir: docker/etc
+    
+- configurations:
+  - filePrefix: proxy_nr-ue.nfapi.conf
+    outputfilename: "nr-ue.nfapi.conf"
+    config:
+    - key: imsi
+      env: "@FULL_IMSI@"
+    - key: key
+      env: "@FULL_KEY@"
+    - key: opc
+      env: "@OPC@"
+    - key: dnn
+      env: "@DNN@"
+    - key: nssai_sst
+      env: "@NSSAI_SST@"
+    - key: nssai_sd
+      env: "@NSSAI_SD@"
+    - key: remote_n_address
+      env: "@GNB_IP_ADDRESS@"
+    - key: local_n_address
+      env: "@NR_UE_IP_ADDRESS@"
+    - key: local_n_if_name
+      env: "@NR_UE_NFAPI_IF_NAME@"
+
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 3cc71b8b3a0f3ef9d577176e64ab1f404557fe3c..65b74a0218a539c504b83b506c6ea7c80e491fa1 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -19,7 +19,7 @@
  *      contact@openairinterface.org
  */
 
-#define _GNU_SOURCE
+#define _GNU_SOURCE // For pthread_setname_np
 #include <pthread.h>
 #include <openair1/PHY/impl_defs_top.h>
 #include "executables/nr-uesoftmodem.h"
@@ -239,84 +239,21 @@ static void L1_nsa_prach_procedures(frame_t frame, int slot, fapi_nr_ul_config_p
   LOG_D(NR_MAC, "We have successfully filled the rach_ind queue with the recently filled rach ind\n");
 }
 
-static bool sfn_slot_matcher(void *wanted, void *candidate)
-{
-  nfapi_p7_message_header_t *msg = candidate;
-  int sfn_sf = *(int*)wanted;
-
-  switch (msg->message_id)
-  {
-    case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
-    {
-      nfapi_nr_rach_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
-    }
-
-    case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
-    {
-      nfapi_nr_rx_data_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
-    }
-
-    case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
-    {
-      nfapi_nr_crc_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
-    }
-
-    case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
-    {
-      nfapi_nr_uci_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
-    }
-
-    case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-    {
-      nfapi_nr_dl_tti_request_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
-    }
-
-    case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-    {
-      nfapi_nr_tx_data_request_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
-    }
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-    {
-      nfapi_nr_ul_dci_request_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
-    }
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-    {
-      nfapi_nr_ul_tti_request_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
-    }
-
-    default:
-      LOG_E(NR_MAC, "sfn_slot_match bad ID: %d\n", msg->message_id);
-
-  }
-
-  return false;
-}
-
 static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot)
 {
   nfapi_nr_rach_indication_t *rach_ind = unqueue_matching(&nr_rach_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
-  nfapi_nr_rx_data_indication_t *rx_ind = unqueue_matching(&nr_rx_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
-  nfapi_nr_crc_indication_t *crc_ind = unqueue_matching(&nr_crc_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
   nfapi_nr_dl_tti_request_t *dl_tti_request = get_queue(&nr_dl_tti_req_queue);
   nfapi_nr_ul_dci_request_t *ul_dci_request = get_queue(&nr_ul_dci_req_queue);
 
-  LOG_D(NR_MAC, "Try to get a ul_tti_req for sfn/slot %d %d from queue with %lu items\n",
-        NFAPI_SFNSLOT2SFN(mac->nr_ue_emul_l1.active_harq_sfn_slot),NFAPI_SFNSLOT2SLOT(mac->nr_ue_emul_l1.active_harq_sfn_slot), nr_ul_tti_req_queue.num_items);
-  nfapi_nr_ul_tti_request_t *ul_tti_request = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->nr_ue_emul_l1.active_harq_sfn_slot);
-  if (!ul_tti_request)
-  {
-      LOG_D(NR_MAC, "Try to get a ul_tti_req from seprate queue because dl_tti_req was late\n");
-      ul_tti_request = unqueue_matching(&nr_wait_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->nr_ue_emul_l1.active_harq_sfn_slot);
+  for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) {
+    LOG_D(NR_MAC, "Try to get a ul_tti_req by matching CRC active SFN %d/SLOT %d from queue with %lu items\n",
+            NFAPI_SFNSLOT2SFN(mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot),
+            NFAPI_SFNSLOT2SLOT(mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot), nr_ul_tti_req_queue.num_items);
+    nfapi_nr_ul_tti_request_t *ul_tti_request_crc = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot);
+    if (ul_tti_request_crc && ul_tti_request_crc->n_pdus > 0)
+    {
+      check_and_process_dci(NULL, NULL, NULL, ul_tti_request_crc);
+    }
   }
 
   if (rach_ind && rach_ind->number_of_pdus > 0)
@@ -333,24 +270,6 @@ static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot)
       free(rach_ind);
       nr_Msg1_transmitted(0, 0, NFAPI_SFNSLOT2SFN(sfn_slot), 0);
   }
-  if (crc_ind && crc_ind->number_crcs > 0)
-  {
-    NR_UL_IND_t UL_INFO = {
-      .crc_ind = *crc_ind,
-    };
-    send_nsa_standalone_msg(&UL_INFO, crc_ind->header.message_id);
-    free(crc_ind->crc_list);
-    free(crc_ind);
-  }
-  if (rx_ind && rx_ind->number_of_pdus > 0)
-  {
-    NR_UL_IND_t UL_INFO = {
-      .rx_ind = *rx_ind,
-    };
-    send_nsa_standalone_msg(&UL_INFO, rx_ind->header.message_id);
-    free(rx_ind->pdu_list);
-    free(rx_ind);
-  }
   if (dl_tti_request)
   {
     int dl_tti_sfn_slot = NFAPI_SFNSLOT2HEX(dl_tti_request->SFN, dl_tti_request->Slot);
@@ -380,10 +299,6 @@ static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot)
   {
     check_and_process_dci(NULL, NULL, ul_dci_request, NULL);
   }
-  if (ul_tti_request && ul_tti_request->n_pdus > 0)
-  {
-    check_and_process_dci(NULL, NULL, NULL, ul_tti_request);
-  }
 }
 
 static void check_nr_prach(NR_UE_MAC_INST_t *mac, nr_uplink_indication_t *ul_info, NR_PRACH_RESOURCES_t *prach_resources)
@@ -434,7 +349,6 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
   reset_queue(&nr_tx_req_queue);
   reset_queue(&nr_ul_dci_req_queue);
   reset_queue(&nr_ul_tti_req_queue);
-  reset_queue(&nr_wait_ul_tti_req_queue);
 
   NR_PRACH_RESOURCES_t prach_resources;
   memset(&prach_resources, 0, sizeof(prach_resources));
@@ -443,6 +357,13 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
   int last_sfn_slot = -1;
   uint16_t sfn_slot = 0;
 
+  module_id_t mod_id = 0;
+  NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
+  for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) {
+      mac->nr_ue_emul_l1.harq[i].active = false;
+      mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot = -1;
+  }
+
   while (!oai_exit)
   {
     if (sem_wait(&sfn_slot_semaphore) != 0)
@@ -459,9 +380,11 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
     }
     if (slot_ind) {
       sfn_slot = *slot_ind;
+      free_and_zero(slot_ind);
     }
     else if (ch_info) {
       sfn_slot = ch_info->sfn_slot;
+      free_and_zero(ch_info);
     }
 
     frame_t frame = NFAPI_SFNSLOT2SFN(sfn_slot);
@@ -477,8 +400,6 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
     LOG_D(NR_MAC, "The received sfn/slot [%d %d] from proxy\n",
           frame, slot);
 
-    module_id_t mod_id = 0;
-    NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
     if (get_softmodem_params()->sa && mac->mib == NULL)
     {
       LOG_D(NR_MAC, "We haven't gotten MIB. Lets see if we received it\n");
@@ -533,8 +454,10 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
                       mac->scc_SIB->tdd_UL_DL_ConfigurationCommon,
                       ul_info.slot_tx, mac->frame_type))
     {
-      LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind() from %s\n", ul_info.slot_tx, __FUNCTION__);
-      nr_ue_ul_indication(&ul_info);
+      LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind() and nr_ue_pucch_scheduler() from %s\n", ul_info.slot_tx, __FUNCTION__);
+      nr_ue_scheduler(NULL, &ul_info);
+      nr_ue_prach_scheduler(mod_id, ul_info.frame_tx, ul_info.slot_tx, ul_info.thread_id);
+      nr_ue_pucch_scheduler(mod_id, ul_info.frame_tx, ul_info.slot_tx, ul_info.thread_id);
       check_nr_prach(mac, &ul_info, &prach_resources);
     }
     if (!IS_SOFTMODEM_NOS1 && get_softmodem_params()->sa) {
@@ -544,10 +467,6 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
       pdcp_run(&ctxt);
     }
     process_queued_nr_nfapi_msgs(mac, sfn_slot);
-    free(slot_ind);
-    slot_ind = NULL;
-    free(ch_info);
-    ch_info = NULL;
   }
   return NULL;
 }
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 23615b2c9803c6ba46fe520e677a0cf39559a2ec..46fa515e0d2d050d1ccd4679c0beab3afd3b8de8 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -50,6 +50,7 @@
 #include "LAYER2/MAC/mac_vars.h"
 #include "RRC/LTE/rrc_vars.h"
 #include "PHY_INTERFACE/phy_interface_vars.h"
+#include "NR_IF_Module.h"
 #include "openair1/SIMULATION/TOOLS/sim.h"
 
 #ifdef SMBV
@@ -156,6 +157,9 @@ uint32_t       N_RB_DL    = 106;
  */
 uint8_t abstraction_flag=0;
 
+nr_bler_struct nr_bler_data[NR_NUM_MCS];
+
+static void init_bler_table(void);
 
 /*---------------------BMC: timespec helpers -----------------------------*/
 
@@ -250,7 +254,6 @@ void init_tpools(uint8_t nun_dlsch_threads) {
   free(params);
   init_dlsch_tpool( nun_dlsch_threads);
 }
-
 static void get_options(void) {
 
   nrUE_params.ofdm_offset_divisor = 8;
@@ -472,6 +475,7 @@ int main( int argc, char **argv ) {
   PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE *)*MAX_NUM_CCs);
   if (get_softmodem_params()->emulate_l1) {
     RCconfig_nr_ue_L1();
+    init_bler_table();
   }
 
   if (get_softmodem_params()->do_ra)
@@ -552,3 +556,56 @@ int main( int argc, char **argv ) {
 
   return 0;
 }
+
+// Read in each MCS file and build BLER-SINR-TB table
+static void init_bler_table(void) {
+  memset(nr_bler_data, 0, sizeof(nr_bler_data));
+
+  const char *awgn_results_dir = getenv("AWGN_RESULTS_DIR");
+  if (!awgn_results_dir) {
+    LOG_W(NR_MAC, "No $AWGN_RESULTS_DIR\n");
+    return;
+  }
+
+  for (unsigned int i = 0; i < NR_NUM_MCS; i++) {
+    char fName[1024];
+    snprintf(fName, sizeof(fName), "%s/mcs%d_awgn_5G.csv", awgn_results_dir, i);
+    FILE *pFile = fopen(fName, "r");
+    if (!pFile) {
+      LOG_E(NR_MAC, "%s: open %s: %s\n", __func__, fName, strerror(errno));
+      continue;
+    }
+    size_t bufSize = 1024;
+    char * line = NULL;
+    char * token;
+    char * temp = NULL;
+    int nlines = 0;
+    while (getline(&line, &bufSize, pFile) > 0) {
+      if (!strncmp(line, "SNR", 3)) {
+        continue;
+      }
+
+      if (nlines > NUM_SINR) {
+        LOG_E(NR_MAC, "BLER FILE ERROR - num lines greater than expected - file: %s\n", fName);
+        abort();
+      }
+
+      token = strtok_r(line, ";", &temp);
+      int ncols = 0;
+      while (token != NULL) {
+        if (ncols > NUM_BLER_COL) {
+          LOG_E(NR_MAC, "BLER FILE ERROR - num of cols greater than expected\n");
+          abort();
+        }
+
+        nr_bler_data[i].bler_table[nlines][ncols] = strtof(token, NULL);
+        ncols++;
+
+        token = strtok_r(NULL, ";", &temp);
+      }
+      nlines++;
+    }
+    nr_bler_data[i].length = nlines;
+    fclose(pFile);
+  }
+}
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index 44ee05940fc3aa6879867582f57fe65773b0f8d2..6bc5a736de53b9f67a546bd85c71f6da9516071a 100644
--- a/nfapi/oai_integration/nfapi_vnf.c
+++ b/nfapi/oai_integration/nfapi_vnf.c
@@ -244,13 +244,13 @@ void oai_create_gnb(void) {
 
   if (RC.gNB == NULL) {
     RC.gNB = (PHY_VARS_gNB **) calloc(1, sizeof(PHY_VARS_gNB *));
-    LOG_I(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB);
+    LOG_D(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB);
   }
 
 
   if (RC.gNB[0] == NULL) {
     RC.gNB[0] = (PHY_VARS_gNB *) calloc(1, sizeof(PHY_VARS_gNB));
-    LOG_I(PHY,"[nr-gnb.c] gNB structure RC.gNB[%d] allocated @ %p\n",0,RC.gNB[0]);
+    LOG_D(PHY,"[nr-gnb.c] gNB structure RC.gNB[%d] allocated @ %p\n",0,RC.gNB[0]);
   }
   
   PHY_VARS_gNB *gNB = RC.gNB[0];
@@ -491,7 +491,7 @@ int wake_gNB_rxtx(PHY_VARS_gNB *gNB, uint16_t sfn, uint16_t slot) {
   L1_proc->frame_tx     = (L1_proc->slot_rx > (19-slot_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
   L1_proc->slot_tx      = (L1_proc->slot_rx + slot_ahead)%20;
 
-  //LOG_I(PHY, "sfn/sf:%d%d proc[rx:%d%d] rx:%d%d] About to wake rxtx thread\n\n", sfn, slot, proc->frame_rx, proc->slot_rx, L1_proc->frame_rx, L1_proc->slot_rx);
+  //LOG_D(PHY, "sfn/sf:%d%d proc[rx:%d%d] rx:%d%d] About to wake rxtx thread\n\n", sfn, slot, proc->frame_rx, proc->slot_rx, L1_proc->frame_rx, L1_proc->slot_rx);
   //NFAPI_TRACE(NFAPI_TRACE_INFO, "\nEntering wake_gNB_rxtx sfn %d slot %d\n",L1_proc->frame_rx,L1_proc->slot_rx);
   // the thread can now be woken up
   if (pthread_cond_signal(&L1_proc->cond) != 0) {
@@ -757,7 +757,7 @@ int phy_nr_rach_indication(nfapi_nr_rach_indication_t *ind)
 int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind)
 {
 
-  LOG_I(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u\n",
+  LOG_D(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u\n",
           __FUNCTION__,ind->sfn, ind->slot, ind->num_ucis);
   if(NFAPI_MODE == NFAPI_MODE_VNF)
   {
@@ -787,12 +787,12 @@ int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind)
           if (ind_pdu->harq) {
             uci_ind_pdu->harq = CALLOC(1, sizeof(*uci_ind_pdu->harq));
             AssertFatal(uci_ind_pdu->harq != NULL, "Memory not allocated for uci_ind_pdu->harq in phy_nr_uci_indication.");
-
             *uci_ind_pdu->harq = *ind_pdu->harq;
+
             uci_ind_pdu->harq->harq_list = CALLOC(uci_ind_pdu->harq->num_harq, sizeof(*uci_ind_pdu->harq->harq_list));
             AssertFatal(uci_ind_pdu->harq->harq_list != NULL, "Memory not allocated for uci_ind_pdu->harq->harq_list in phy_nr_uci_indication.");
             for (int j = 0; j < uci_ind_pdu->harq->num_harq; j++)
-                uci_ind_pdu->harq->harq_list[j].harq_value =  ind_pdu->harq->harq_list[j].harq_value;
+                uci_ind_pdu->harq->harq_list[j].harq_value = ind_pdu->harq->harq_list[j].harq_value;
           }
           break;
         }
@@ -800,21 +800,27 @@ int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind)
         case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
           nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_ind_pdu = &uci_ind->uci_list[i].pucch_pdu_format_2_3_4;
           nfapi_nr_uci_pucch_pdu_format_2_3_4_t *ind_pdu = &ind->uci_list[i].pucch_pdu_format_2_3_4;
-          
-          uci_ind_pdu->harq.harq_payload = CALLOC(1, sizeof(*uci_ind_pdu->harq.harq_payload));
-          AssertFatal(uci_ind_pdu->harq.harq_payload != NULL, "Memory not allocated for uci_ind_pdu->harq.harq_payload in phy_nr_uci_indication.");
-          *uci_ind_pdu->harq.harq_payload =  *ind_pdu->harq.harq_payload;
-
-
-          uci_ind_pdu->csi_part1.csi_part1_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part1.csi_part1_payload));
-          AssertFatal(uci_ind_pdu->csi_part1.csi_part1_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part1.csi_part1_payload in phy_nr_uci_indication.");
-          *uci_ind_pdu->csi_part1.csi_part1_payload =  *ind_pdu->csi_part1.csi_part1_payload;
-
-
-          uci_ind_pdu->csi_part2.csi_part2_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part2.csi_part2_payload));
-          AssertFatal(uci_ind_pdu->csi_part2.csi_part2_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part2.csi_part2_payload in phy_nr_uci_indication.");
-          *uci_ind_pdu->csi_part2.csi_part2_payload =  *ind_pdu->csi_part2.csi_part2_payload;
-
+          *uci_ind_pdu = *ind_pdu;
+          if (ind_pdu->harq.harq_payload) {
+            uci_ind_pdu->harq.harq_payload = CALLOC(1, sizeof(*uci_ind_pdu->harq.harq_payload));
+            AssertFatal(uci_ind_pdu->harq.harq_payload != NULL, "Memory not allocated for uci_ind_pdu->harq.harq_payload in phy_nr_uci_indication.");
+            *uci_ind_pdu->harq.harq_payload = *ind_pdu->harq.harq_payload;
+          }
+          if (ind_pdu->sr.sr_payload) {
+            uci_ind_pdu->sr.sr_payload = CALLOC(1, sizeof(*uci_ind_pdu->sr.sr_payload));
+            AssertFatal(uci_ind_pdu->sr.sr_payload != NULL, "Memory not allocated for uci_ind_pdu->sr.sr_payload in phy_nr_uci_indication.");
+            *uci_ind_pdu->sr.sr_payload = *ind_pdu->sr.sr_payload;
+          }
+          if (ind_pdu->csi_part1.csi_part1_payload) {
+            uci_ind_pdu->csi_part1.csi_part1_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part1.csi_part1_payload));
+            AssertFatal(uci_ind_pdu->csi_part1.csi_part1_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part1.csi_part1_payload in phy_nr_uci_indication.");
+            *uci_ind_pdu->csi_part1.csi_part1_payload = *ind_pdu->csi_part1.csi_part1_payload;
+          }
+          if (ind_pdu->csi_part2.csi_part2_payload) {
+            uci_ind_pdu->csi_part2.csi_part2_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part2.csi_part2_payload));
+            AssertFatal(uci_ind_pdu->csi_part2.csi_part2_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part2.csi_part2_payload in phy_nr_uci_indication.");
+            *uci_ind_pdu->csi_part2.csi_part2_payload = *ind_pdu->csi_part2.csi_part2_payload;
+          }
           break;
         }
       }
@@ -944,7 +950,7 @@ int phy_crc_indication(struct nfapi_vnf_p7_config *config, nfapi_crc_indication_
 
 int phy_nr_crc_indication(nfapi_nr_crc_indication_t *ind) {
 
-  LOG_I(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u\n",
+  LOG_D(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u\n",
           __FUNCTION__,ind->sfn, ind->slot, ind->number_crcs);
 
   if(NFAPI_MODE == NFAPI_MODE_VNF)
@@ -967,7 +973,7 @@ int phy_nr_crc_indication(nfapi_nr_crc_indication_t *ind) {
       crc_ind->crc_list[j].tb_crc_status = ind->crc_list[j].tb_crc_status;
       crc_ind->crc_list[j].timing_advance = ind->crc_list[j].timing_advance;
       crc_ind->crc_list[j].ul_cqi = ind->crc_list[j].ul_cqi;
-      LOG_I(NR_MAC, "Received crc_ind.harq_id = %d for %d index SFN SLot %u %u with rnti %x\n",
+      LOG_D(NR_MAC, "Received crc_ind.harq_id = %d for %d index SFN SLot %u %u with rnti %x\n",
                     ind->crc_list[j].harq_id, j, ind->sfn, ind->slot, ind->crc_list[j].rnti);
     }
     if (!put_queue(&gnb_crc_ind_queue, crc_ind))
@@ -1063,7 +1069,7 @@ int phy_rx_indication(struct nfapi_vnf_p7_config *config, nfapi_rx_indication_t
 
 int phy_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) {
 
-  LOG_I(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u, and pdu %p\n",
+  LOG_D(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u, and pdu %p\n",
           __FUNCTION__,ind->sfn, ind->slot, ind->number_of_pdus, ind->pdu_list[0].pdu);
 
   if(NFAPI_MODE == NFAPI_MODE_VNF)
@@ -1165,7 +1171,7 @@ static void analyze_cqi_pdus_for_duplicates(nfapi_cqi_indication_t *ind)
   {
     nfapi_cqi_indication_pdu_t *src_pdu = &ind->cqi_indication_body.cqi_pdu_list[i];
 
-    LOG_I(MAC, "CQI_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti,
+    LOG_D(MAC, "CQI_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti,
           src_pdu->ul_cqi_information.ul_cqi, src_pdu->ul_cqi_information.channel);
 
     for (int j = i + 1; j < num_cqis; j++)
@@ -1887,7 +1893,7 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) {
   nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
   dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
   dl_config_req->header.message_id = NFAPI_DL_CONFIG_REQUEST;
-  LOG_I(PHY, "[VNF] %s() DL_CONFIG_REQ sfn_sf:%d_%d number_of_pdus:%d\n", __FUNCTION__,
+  LOG_D(PHY, "[VNF] %s() DL_CONFIG_REQ sfn_sf:%d_%d number_of_pdus:%d\n", __FUNCTION__,
         NFAPI_SFNSF2SFN(dl_config_req->sfn_sf),NFAPI_SFNSF2SF(dl_config_req->sfn_sf), dl_config_req->dl_config_request_body.number_pdu);
   if (dl_config_req->dl_config_request_body.number_pdu > 0)
   {
@@ -1898,7 +1904,7 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) {
             {
                 uint16_t dl_rnti = dl_config_req->dl_config_request_body.dl_config_pdu_list[i].dlsch_pdu.dlsch_pdu_rel8.rnti;
                 uint16_t numPDUs = dl_config_req->dl_config_request_body.number_pdu;
-                LOG_I(MAC, "(OAI eNB) Sending dl_config_req at VNF during Frame: %d and Subframe: %d,"
+                LOG_D(MAC, "(OAI eNB) Sending dl_config_req at VNF during Frame: %d and Subframe: %d,"
                            " with a RNTI value of: %x and with number of PDUs: %u\n",
                       NFAPI_SFNSF2SFN(dl_config_req->sfn_sf),NFAPI_SFNSF2SF(dl_config_req->sfn_sf), dl_rnti, numPDUs);
             }
@@ -1919,8 +1925,7 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) {
 
 int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
 {
-  //LOG_I(PHY, "sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot);
-  //printf("\nEntering oai_nfapi_nr_dl_config_req sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot);
+  LOG_D(NR_PHY, "Entering oai_nfapi_nr_dl_config_req sfn:%d,slot:%d\n", dl_config_req->SFN, dl_config_req->Slot);
   nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
   dl_config_req->header.message_id= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST;
   dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
@@ -1939,6 +1944,7 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
 
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req)
 {
+  LOG_D(NR_PHY, "Entering oai_nfapi_nr_tx_data_req sfn:%d,slot:%d\n", tx_data_req->SFN, tx_data_req->Slot);
   nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
   tx_data_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
   tx_data_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST;
@@ -2056,7 +2062,7 @@ int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) {
   {
     uint8_t pdu_type = pdu_list[i].pdu_type;
 
-    LOG_I(MAC, "ul_config_req num_pdus: %u pdu_number: %d pdu_type: %u SFN.SF: %d.%d\n",
+    LOG_D(MAC, "ul_config_req num_pdus: %u pdu_number: %d pdu_type: %u SFN.SF: %d.%d\n",
           num_pdus, i, pdu_type, ul_config_req->sfn_sf >> 4, ul_config_req->sfn_sf & 15);
 
     if (pdu_type != NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE)
diff --git a/nfapi/open-nFAPI/nfapi/inc/nfapi.h b/nfapi/open-nFAPI/nfapi/inc/nfapi.h
index 0f09efa78ab7d41032c4b3d68df3aac4e4c38139..c1f423a8db808fe8dd1140ff082afac10ff59bfb 100644
--- a/nfapi/open-nFAPI/nfapi/inc/nfapi.h
+++ b/nfapi/open-nFAPI/nfapi/inc/nfapi.h
@@ -44,13 +44,21 @@ uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end);
 uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end);
 uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end);
 uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end);
-uint32_t pullarray32(uint8_t **in, uint32_t out[], uint32_t max_len, uint32_t len, uint8_t *end);
+uint32_t pullarray32(uint8_t **values_to_pull,
+                     uint32_t out[],
+                     uint32_t max_num_values_to_pull,
+                     uint32_t num_values_to_pull,
+                     uint8_t *out_end);
 uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end);
 
 uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
 uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
 uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
-uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
+uint32_t pusharray32(const uint32_t *values_to_push,
+                     uint32_t max_num_values_to_push,
+                     uint32_t num_values_to_push,
+                     uint8_t **out,
+                     uint8_t *out_end);
 uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
 
 typedef uint8_t (*pack_array_elem_fn)(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end);
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi.c b/nfapi/open-nFAPI/nfapi/src/nfapi.c
index 2783781e2c39b9ceb46d00df2609bb087b453194..09c0229db0bbe528f9c97759a414173e8b970c93 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi.c
@@ -1,783 +1,855 @@
-/*
- * Copyright (c) 2001-2016, Cisco Systems, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *
- * Neither the name of the Cisco Systems, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sched.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.h>
-
-#include <nfapi_interface.h>
-#include <nfapi.h>
-#include <debug.h>
-
-
-// Fundamental routines
-
-uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end) {
-  uint8_t *pOut = *out;
-
-  if((end - pOut) >= 1) {
-    pOut[0] = in;
-    (*out)+=1;
-    return 1;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end) {
-  uint8_t *pOut = *out;
-
-  if((end - pOut) >= 1) {
-    pOut[0] = in;
-    (*out)+=1;
-    return 1;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end) {
-  uint8_t *pOut = *out;
-
-  if((end - pOut) >= 2) {
-    pOut[0] = (in & 0xFF00) >> 8;
-    pOut[1] = (in & 0xFF);
-    (*out)+=2;
-    return 2;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end) {
-  uint8_t *pOut = *out;
-
-  if((end - pOut) >= 2) {
-    pOut[0] = (in & 0xFF00) >> 8;
-    pOut[1] = (in & 0xFF);
-    (*out)+=2;
-    return 2;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end) {
-  uint8_t *pOut = *out;
-
-  if((end - pOut) >= 4) {
-    pOut[0] = (in & 0xFF000000) >> 24;
-    pOut[1] = (in & 0xFF0000) >> 16;
-    pOut[2] = (in & 0xFF00) >> 8;
-    pOut[3] = (in & 0xFF);
-    (*out)+=4;
-    return 4;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end) {
-  uint8_t *pOut = *out;
-
-  if((end - pOut) >= 4) {
-    pOut[0] = (in & 0xFF000000) >> 24;
-    pOut[1] = (in & 0xFF0000) >> 16;
-    pOut[2] = (in & 0xFF00) >> 8;
-    pOut[3] = (in & 0xFF);
-    (*out)+=4;
-    return 4;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end) {
-  uint8_t *pIn = *in;
-
-  if((end - pIn) >= 1 ) {
-    *out = *pIn;
-    (*in)+=1;
-    return 1;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end) {
-  uint8_t *pIn = *in;
-
-  if((end - pIn) >= 1 ) {
-    *out = *pIn;
-    (*in)+=1;
-    return 1;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end) {
-  uint8_t *pIn = *in;
-
-  if((end - pIn) >=2 ) {
-    *out = ((pIn[0]) << 8) | pIn[1];
-    (*in)+=2;
-    return 2;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end) {
-  uint8_t *pIn = *in;
-
-  if((end - pIn) >=2 ) {
-    *out = ((pIn[0]) << 8) | pIn[1];
-    (*in)+=2;
-    return 2;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end) {
-  uint8_t *pIn = *in;
-
-  if((end - pIn) >=4 ) {
-    *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
-    (*in)+=4;
-    return 4;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n",  __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end) {
-  uint8_t *pIn = *in;
-
-  if((end - pIn) >=4 ) {
-    *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
-    (*in)+=4;
-    return 4;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-/*
-inline void pusharray16(uint8_t **, uint16_t, uint32_t len)
-{
-}
-*/
-
-uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*in)) >= sizeof(uint16_t) * len) {
-    uint32_t idx;
-
-    for(idx = 0; idx < len; ++idx) {
-      if(!pull16(in, &out[idx], end))
-        return 0;
-    }
-
-    return sizeof(uint16_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*in)) >= sizeof(uint16_t) * len) {
-    uint32_t idx;
-
-    for(idx = 0; idx < len; ++idx) {
-      if(!pulls16(in, &out[idx], end))
-        return 0;
-    }
-
-    return sizeof(uint16_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*out)) >= sizeof(uint16_t) * len) {
-    uint32_t idx;
-
-    for(idx = 0; idx < len; ++idx) {
-      if(!push16(in[idx], out, end))
-        return 0;
-    }
-
-    return sizeof(uint16_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*out)) >= sizeof(uint16_t) * len) {
-    uint32_t idx;
-
-    for(idx = 0; idx < len; ++idx) {
-      pushs16(in[idx], out, end);
-    }
-
-    return sizeof(uint16_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-uint32_t pullarray32(uint8_t **in, uint32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*in)) >= sizeof(uint32_t) * len) {
-    uint32_t idx;
-
-    for(idx = 0; idx < len; ++idx) {
-      if(!pull32(in, &out[idx], end))
-        return 0;
-    }
-
-    return sizeof(uint32_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*in)) >= sizeof(uint32_t) * len) {
-    uint32_t idx;
-
-    for(idx = 0; idx < len; ++idx) {
-      if(!pulls32(in, &out[idx], end))
-        return 0;
-    }
-
-    return sizeof(uint32_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*out)) >= sizeof(uint32_t) * len) {
-    uint32_t idx;
-
-    for(idx = 0; idx < len; ++idx) {
-      if(!push32(in[idx], out, end))
-        return 0;
-    }
-
-    return sizeof(uint32_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*out)) >= sizeof(uint32_t) * len) {
-    uint32_t idx;
-
-    for(idx = 0; idx < len; ++idx) {
-      pushs32(in[idx], out, end);
-    }
-
-    return sizeof(uint32_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*in)) >= sizeof(uint8_t) * len) {
-    memcpy(out, (*in), len);
-    (*in)+=len;
-    return sizeof(uint8_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
-  if(len == 0)
-    return 1;
-
-  if(len > max_len) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-    return 0;
-  }
-
-  if((end - (*out)) >= sizeof(uint8_t) * len) {
-    memcpy((*out), in, len);
-    (*out)+=len;
-    return sizeof(uint8_t) * len;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-    return 0;
-  }
-}
-
-uint8_t packarray(void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn) {
-  if(count > max_count) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
-    return 0;
-  }
-
-  uint16_t i = 0;
-
-  for(i = 0; i < count; ++i) {
-    if((fn)(array, ppwritepackedmsg, end) == 0)
-      return 0;
-
-    array += array_element_size;
-  }
-
-  return 1;
-}
-
-uint8_t unpackarray(uint8_t **ppReadPackedMsg, void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn) {
-  if(count > max_count) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
-    return 0;
-  }
-
-  uint16_t i = 0;
-
-  for(i = 0; i < count; ++i) {
-    if((fn)(array, ppReadPackedMsg, end) == 0)
-      return 0;
-
-    array += array_element_size;
-  }
-
-  return 1;
-}
-
-
-uint32_t pack_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  if(ve != 0 && config != 0) {
-    if(config->pack_vendor_extension_tlv) {
-      uint8_t *pStartOfTlv = *ppWritePackedMsg;
-
-      if(pack_tl(ve, ppWritePackedMsg, end) == 0)
-        return 0;
-
-      uint8_t *pStartOfValue = *ppWritePackedMsg;
-
-      if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
-        return 0;
-
-      ve->length = (*ppWritePackedMsg) - pStartOfValue;
-      pack_tl(ve, &pStartOfTlv, end);
-      return 1;
-    }
-  }
-
-  return 1;
-}
-
-uint32_t unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve_tlv) {
-  if(ve_tlv != 0 && config != 0) {
-    if(config->unpack_vendor_extension_tlv) {
-      return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config);
-    }
-  }
-
-  return 1;
-}
-
-uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end,nfapi_p7_codec_config_t *config) {
-  if(ve != 0 && config != 0) {
-    if(config->pack_vendor_extension_tlv) {
-      uint8_t *pStartOfTlv = *ppWritePackedMsg;
-
-      if(pack_tl(ve, ppWritePackedMsg, end) == 0)
-        return 0;
-
-      uint8_t *pStartOfValue = *ppWritePackedMsg;
-
-      if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
-        return 0;
-
-      ve->length = (*ppWritePackedMsg) - pStartOfValue;
-      pack_tl(ve, &pStartOfTlv, end);
-      return 1;
-    }
-  }
-
-  return 1;
-}
-
-int unpack_p7_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve_tlv) {
-  if(ve_tlv != 0 && config != 0) {
-    if(config->unpack_vendor_extension_tlv) {
-      return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config);
-    }
-  }
-
-  return 1;
-}
-
-
-uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return (push16(tl->tag, ppWritePackedMsg, end) &&
-          push16(tl->length, ppWritePackedMsg, end));
-}
-
-uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end) {
-  return (pull16(ppReadPackedMsg, &tl->tag, end) &&
-          pull16(ppReadPackedMsg, &tl->length, end));
-}
-
-int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve) {
-  nfapi_tl_t generic_tl;
-  uint8_t numBadTags = 0;
-  uint16_t idx = 0;
-
-  while ((uint8_t *)(*ppReadPackedMsg) < end) {
-    // unpack the tl and process the values accordingly
-    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-      return 0;
-
-    uint8_t tagMatch = 0;
-    uint8_t *pStartOfValue = *ppReadPackedMsg;
-
-    for(idx = 0; idx < size; ++idx) {
-      if(unpack_fns[idx].tag == generic_tl.tag) { // match the extracted tag value with all the tags in unpack_fn list
-        tagMatch = 1;
-        nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
-        tl->tag = generic_tl.tag;
-        tl->length = generic_tl.length;
-        int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end);
-
-        if(result == 0) {
-          return 0;
-        }
-
-        // check if the length was right;
-        if(tl->length != (*ppReadPackedMsg - pStartOfValue)) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %ld\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
-        }
-      }
-    }
-
-    if(tagMatch == 0) {
-      if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
-          generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) {
-        int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
-
-        if(result == 0) {
-          // got tot the end.
-          return 0;
-        } else if(result < 0) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag);
-
-          if (++numBadTags > MAX_BAD_TAG) {
-            NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
-            return 0;
-          }
-
-          if((end - *ppReadPackedMsg) >= generic_tl.length) {
-            // Advance past the unknown TLV
-            (*ppReadPackedMsg) += generic_tl.length;
-          } else {
-            // go to the end
-            return 0;
-          }
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
-
-        if (++numBadTags > MAX_BAD_TAG) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
-          return 0;
-        }
-
-        if((end - *ppReadPackedMsg) >= generic_tl.length) {
-          // Advance past the unknown TLV
-          (*ppReadPackedMsg) += generic_tl.length;
-        } else {
-          // go to the end
-          return 0;
-        }
-      }
-    }
-  }
-
-  return 1;
-}
-int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve) {
-  nfapi_tl_t generic_tl;
-  uint8_t numBadTags = 0;
-  uint16_t idx = 0;
-
-  while ((uint8_t *)(*ppReadPackedMsg) < end) {
-    // unpack the tl and process the values accordingly
-    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-      return 0;
-
-    uint8_t tagMatch = 0;
-    uint8_t *pStartOfValue = *ppReadPackedMsg;
-
-    for(idx = 0; idx < size; ++idx) {
-      if(unpack_fns[idx].tag == generic_tl.tag) {
-        tagMatch = 1;
-        nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
-        tl->tag = generic_tl.tag;
-        tl->length = generic_tl.length;
-        int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end, config);
-
-        if(result == 0) {
-          return  0;
-        }
-
-        // check if the length was right;
-        if(tl->length != (*ppReadPackedMsg - pStartOfValue)) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %ld\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
-        }
-      }
-    }
-
-    if(tagMatch == 0) {
-      if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
-          generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) {
-        int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
-
-        if(result == 0) {
-          // got to end
-          return 0;
-        } else if(result < 0) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
-
-          if (++numBadTags > MAX_BAD_TAG) {
-            NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
-            return -1;
-          }
-
-          if((end - *ppReadPackedMsg) >= generic_tl.length) {
-            // Advance past the unknown TLV
-            (*ppReadPackedMsg) += generic_tl.length;
-          } else {
-            // got ot the dn
-            return 0;
-          }
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
-
-        if (++numBadTags > MAX_BAD_TAG) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
-          return -1;
-        }
-
-        if((end - *ppReadPackedMsg) >= generic_tl.length) {
-          // Advance past the unknown TLV
-          (*ppReadPackedMsg) += generic_tl.length;
-        } else {
-          // got ot the dn
-          return 0;
-        }
-      }
-    }
-  }
-
-  return 1;
-}
-
-// This intermediate function deals with calculating the length of the value
-// and writing into the tlv header.
-uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn) {
-  nfapi_tl_t *tl = (nfapi_tl_t *)tlv;
-
-  // If the tag is defined
-  if(tl->tag == tag) {
-    uint8_t *pStartOfTlv = *ppWritePackedMsg;
-
-    // write a dumy tlv header
-    if(pack_tl(tl, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Record the start of the value
-    uint8_t *pStartOfValue = *ppWritePackedMsg;
-
-    // pack the tlv value
-    if(fn(tlv, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // calculate the length of the value and rewrite the tl header
-    tl->length = (*ppWritePackedMsg) - pStartOfValue;
-    // rewrite the header with the correct length
-    pack_tl(tl, &pStartOfTlv, end);
-  } else {
-    if(tl->tag != 0) {
-      NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag);
-    } else {
-      //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag);
-    }
-  }
-
-  return 1;
-}
-
-const char *nfapi_error_code_to_str(nfapi_error_code_e value) {
-  switch(value) {
-    case NFAPI_MSG_OK:
-      return "NFAPI_MSG_OK";
-
-    case NFAPI_MSG_INVALID_STATE:
-      return "NFAPI_MSG_INVALID_STATE";
-
-    case NFAPI_MSG_INVALID_CONFIG:
-      return "NFAPI_MSG_INVALID_CONFIG";
-
-    case NFAPI_SFN_OUT_OF_SYNC:
-      return "NFAPI_SFN_OUT_OF_SYNC";
-
-    case NFAPI_MSG_SUBFRAME_ERR:
-      return "NFAPI_MSG_SUBFRAME_ERR";
-
-    case NFAPI_MSG_BCH_MISSING:
-      return "NFAPI_MSG_BCH_MISSING";
-
-    case NFAPI_MSG_INVALID_SFN:
-      return "NFAPI_MSG_INVALID_SFN";
-
-    case NFAPI_MSG_HI_ERR:
-      return "NFAPI_MSG_HI_ERR";
-
-    case NFAPI_MSG_TX_ERR:
-      return "NFAPI_MSG_TX_ERR";
-
-    default:
-      return "UNKNOWN";
-  }
-}
+/*
+ * Copyright (c) 2001-2016, Cisco Systems, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of the Cisco Systems, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sched.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <execinfo.h>
+
+#include <nfapi_interface.h>
+#include <nfapi.h>
+#include <debug.h>
+
+// What to do when an error happens (e.g., a push or pull fails)
+static inline void on_error()
+{
+    // show the call stack
+    int fd = STDERR_FILENO;
+    static const char msg[] = "---stack trace---\n";
+    __attribute__((unused)) int r =
+        write(fd, msg, sizeof(msg) - 1);
+    void *buffer[100];
+    int nptrs = backtrace(buffer, sizeof(buffer) / sizeof(buffer[0]));
+    backtrace_symbols_fd(buffer, nptrs, fd);
+
+    //abort();
+}
+
+// Fundamental routines
+
+uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 1) {
+    pOut[0] = in;
+    (*out)+=1;
+    return 1;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 1) {
+    pOut[0] = in;
+    (*out)+=1;
+    return 1;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 2) {
+    pOut[0] = (in & 0xFF00) >> 8;
+    pOut[1] = (in & 0xFF);
+    (*out)+=2;
+    return 2;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 2) {
+    pOut[0] = (in & 0xFF00) >> 8;
+    pOut[1] = (in & 0xFF);
+    (*out)+=2;
+    return 2;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 4) {
+    pOut[0] = (in & 0xFF000000) >> 24;
+    pOut[1] = (in & 0xFF0000) >> 16;
+    pOut[2] = (in & 0xFF00) >> 8;
+    pOut[3] = (in & 0xFF);
+    (*out)+=4;
+    return 4;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 4) {
+    pOut[0] = (in & 0xFF000000) >> 24;
+    pOut[1] = (in & 0xFF0000) >> 16;
+    pOut[2] = (in & 0xFF00) >> 8;
+    pOut[3] = (in & 0xFF);
+    (*out)+=4;
+    return 4;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >= 1 ) {
+    *out = *pIn;
+    (*in)+=1;
+    return 1;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >= 1 ) {
+    *out = *pIn;
+    (*in)+=1;
+    return 1;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >=2 ) {
+    *out = ((pIn[0]) << 8) | pIn[1];
+    (*in)+=2;
+    return 2;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >=2 ) {
+    *out = ((pIn[0]) << 8) | pIn[1];
+    (*in)+=2;
+    return 2;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >=4 ) {
+    *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
+    (*in)+=4;
+    return 4;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n",  __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >=4 ) {
+    *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
+    (*in)+=4;
+    return 4;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+/*
+inline void pusharray16(uint8_t **, uint16_t, uint32_t len)
+{
+}
+*/
+
+uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    on_error();
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint16_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!pull16(in, &out[idx], end))
+        return 0;
+    }
+
+    return sizeof(uint16_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    on_error();
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint16_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!pulls16(in, &out[idx], end))
+        return 0;
+    }
+
+    return sizeof(uint16_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    on_error();
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint16_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!push16(in[idx], out, end))
+        return 0;
+    }
+
+    return sizeof(uint16_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    on_error();
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint16_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if (!pushs16(in[idx], out, end))
+        return 0;
+    }
+
+    return sizeof(uint16_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+uint32_t pullarray32(uint8_t **values_to_pull,
+                     uint32_t out[],
+                     uint32_t max_num_values_to_pull,
+                     uint32_t num_values_to_pull,
+                     uint8_t *out_end) {
+  if (num_values_to_pull == 0)
+
+    return 1;
+
+  if (num_values_to_pull > max_num_values_to_pull) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n",
+                __FUNCTION__, num_values_to_pull, max_num_values_to_pull);
+    on_error();
+    return 0;
+  }
+
+  if ((out_end - (*values_to_pull)) >= sizeof(uint32_t) * num_values_to_pull) {
+    uint32_t idx;
+
+    for (idx = 0; idx < num_values_to_pull; ++idx) {
+      if (!pull32(values_to_pull, &out[idx], out_end))
+        return 0;
+    }
+
+    return sizeof(uint32_t) * num_values_to_pull;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    on_error();
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint32_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!pulls32(in, &out[idx], end))
+        return 0;
+    }
+
+    return sizeof(uint32_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+uint32_t pusharray32(const uint32_t *values_to_push,
+                     uint32_t max_num_values_to_push,
+                     uint32_t num_values_to_push,
+                     uint8_t **out,
+                     uint8_t *out_end) {
+  if (num_values_to_push == 0)
+    return 1;
+
+  if (num_values_to_push > max_num_values_to_push) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n",
+                __FUNCTION__, num_values_to_push, max_num_values_to_push);
+    on_error();
+    return 0;
+  }
+
+  if ((out_end - (*out)) >= sizeof(uint32_t) * num_values_to_push) {
+    uint32_t idx;
+
+    for (idx = 0; idx < num_values_to_push; ++idx) {
+      if (!push32(values_to_push[idx], out, out_end))
+        return 0;
+    }
+
+    return sizeof(uint32_t) * num_values_to_push;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    on_error();
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint32_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if (!pushs32(in[idx], out, end))
+        return 0;
+    }
+
+    return sizeof(uint32_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    on_error();
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint8_t) * len) {
+    memcpy(out, (*in), len);
+    (*in)+=len;
+    return sizeof(uint8_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    on_error();
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint8_t) * len) {
+    memcpy((*out), in, len);
+    (*out)+=len;
+    return sizeof(uint8_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    on_error();
+    return 0;
+  }
+}
+
+uint8_t packarray(void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn) {
+  if(count > max_count) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
+    on_error();
+    return 0;
+  }
+
+  uint16_t i = 0;
+
+  for(i = 0; i < count; ++i) {
+    if((fn)(array, ppwritepackedmsg, end) == 0)
+      return 0;
+
+    array += array_element_size;
+  }
+
+  return 1;
+}
+
+uint8_t unpackarray(uint8_t **ppReadPackedMsg, void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn) {
+  if(count > max_count) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
+    on_error();
+    return 0;
+  }
+
+  uint16_t i = 0;
+
+  for(i = 0; i < count; ++i) {
+    if((fn)(array, ppReadPackedMsg, end) == 0)
+      return 0;
+
+    array += array_element_size;
+  }
+
+  return 1;
+}
+
+
+uint32_t pack_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  if(ve != 0 && config != 0) {
+    if(config->pack_vendor_extension_tlv) {
+      uint8_t *pStartOfTlv = *ppWritePackedMsg;
+
+      if(pack_tl(ve, ppWritePackedMsg, end) == 0)
+        return 0;
+
+      uint8_t *pStartOfValue = *ppWritePackedMsg;
+
+      if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
+        return 0;
+
+      ve->length = (*ppWritePackedMsg) - pStartOfValue;
+      pack_tl(ve, &pStartOfTlv, end);
+      return 1;
+    }
+  }
+
+  return 1;
+}
+
+uint32_t unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve_tlv) {
+  if(ve_tlv != 0 && config != 0) {
+    if(config->unpack_vendor_extension_tlv) {
+      return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config);
+    }
+  }
+
+  return 1;
+}
+
+uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end,nfapi_p7_codec_config_t *config) {
+  if(ve != 0 && config != 0) {
+    if(config->pack_vendor_extension_tlv) {
+      uint8_t *pStartOfTlv = *ppWritePackedMsg;
+
+      if(pack_tl(ve, ppWritePackedMsg, end) == 0)
+        return 0;
+
+      uint8_t *pStartOfValue = *ppWritePackedMsg;
+
+      if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
+        return 0;
+
+      ve->length = (*ppWritePackedMsg) - pStartOfValue;
+      pack_tl(ve, &pStartOfTlv, end);
+      return 1;
+    }
+  }
+
+  return 1;
+}
+
+int unpack_p7_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve_tlv) {
+  if(ve_tlv != 0 && config != 0) {
+    if(config->unpack_vendor_extension_tlv) {
+      return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config);
+    }
+  }
+
+  return 1;
+}
+
+
+uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return (push16(tl->tag, ppWritePackedMsg, end) &&
+          push16(tl->length, ppWritePackedMsg, end));
+}
+
+uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end) {
+  return (pull16(ppReadPackedMsg, &tl->tag, end) &&
+          pull16(ppReadPackedMsg, &tl->length, end));
+}
+
+int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve) {
+  nfapi_tl_t generic_tl;
+  uint8_t numBadTags = 0;
+  uint16_t idx = 0;
+
+  while ((uint8_t *)(*ppReadPackedMsg) < end) {
+    // unpack the tl and process the values accordingly
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    uint8_t tagMatch = 0;
+    uint8_t *pStartOfValue = *ppReadPackedMsg;
+
+    for(idx = 0; idx < size; ++idx) {
+      if(unpack_fns[idx].tag == generic_tl.tag) { // match the extracted tag value with all the tags in unpack_fn list
+        tagMatch = 1;
+        nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
+        tl->tag = generic_tl.tag;
+        tl->length = generic_tl.length;
+        int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end);
+
+        if(result == 0) {
+          return 0;
+        }
+
+        // check if the length was right;
+        if(tl->length != (*ppReadPackedMsg - pStartOfValue)) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %ld\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
+          on_error();
+        }
+      }
+    }
+
+    if(tagMatch == 0) {
+      if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
+          generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) {
+        int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
+
+        if(result == 0) {
+          // got tot the end.
+          return 0;
+        } else if(result < 0) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag);
+          on_error();
+
+          if (++numBadTags > MAX_BAD_TAG) {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
+            on_error();
+            return 0;
+          }
+
+          if((end - *ppReadPackedMsg) >= generic_tl.length) {
+            // Advance past the unknown TLV
+            (*ppReadPackedMsg) += generic_tl.length;
+          } else {
+            // go to the end
+            return 0;
+          }
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
+        on_error();
+
+        if (++numBadTags > MAX_BAD_TAG) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
+          on_error();
+          return 0;
+        }
+
+        if((end - *ppReadPackedMsg) >= generic_tl.length) {
+          // Advance past the unknown TLV
+          (*ppReadPackedMsg) += generic_tl.length;
+        } else {
+          // go to the end
+          return 0;
+        }
+      }
+    }
+  }
+
+  return 1;
+}
+int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve) {
+  nfapi_tl_t generic_tl;
+  uint8_t numBadTags = 0;
+  uint16_t idx = 0;
+
+  while ((uint8_t *)(*ppReadPackedMsg) < end) {
+    // unpack the tl and process the values accordingly
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    uint8_t tagMatch = 0;
+    uint8_t *pStartOfValue = *ppReadPackedMsg;
+
+    for(idx = 0; idx < size; ++idx) {
+      if(unpack_fns[idx].tag == generic_tl.tag) {
+        tagMatch = 1;
+        nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
+        tl->tag = generic_tl.tag;
+        tl->length = generic_tl.length;
+        int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end, config);
+
+        if(result == 0) {
+          return  0;
+        }
+
+        // check if the length was right;
+        if(tl->length != (*ppReadPackedMsg - pStartOfValue)) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %ld\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
+          on_error();
+        }
+      }
+    }
+
+    if(tagMatch == 0) {
+      if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
+          generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) {
+        int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
+
+        if(result == 0) {
+          // got to end
+          return 0;
+        } else if(result < 0) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
+          on_error();
+
+          if (++numBadTags > MAX_BAD_TAG) {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
+            on_error();
+            return -1;
+          }
+
+          if((end - *ppReadPackedMsg) >= generic_tl.length) {
+            // Advance past the unknown TLV
+            (*ppReadPackedMsg) += generic_tl.length;
+          } else {
+            // got ot the dn
+            return 0;
+          }
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
+        on_error();
+
+        if (++numBadTags > MAX_BAD_TAG) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
+          on_error();
+          return -1;
+        }
+
+        if((end - *ppReadPackedMsg) >= generic_tl.length) {
+          // Advance past the unknown TLV
+          (*ppReadPackedMsg) += generic_tl.length;
+        } else {
+          // got ot the dn
+          return 0;
+        }
+      }
+    }
+  }
+
+  return 1;
+}
+
+// This intermediate function deals with calculating the length of the value
+// and writing into the tlv header.
+uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn) {
+  nfapi_tl_t *tl = (nfapi_tl_t *)tlv;
+
+  // If the tag is defined
+  if(tl->tag == tag) {
+    uint8_t *pStartOfTlv = *ppWritePackedMsg;
+
+    // write a dumy tlv header
+    if(pack_tl(tl, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Record the start of the value
+    uint8_t *pStartOfValue = *ppWritePackedMsg;
+
+    // pack the tlv value
+    if(fn(tlv, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // calculate the length of the value and rewrite the tl header
+    tl->length = (*ppWritePackedMsg) - pStartOfValue;
+    // rewrite the header with the correct length
+    pack_tl(tl, &pStartOfTlv, end);
+  } else {
+    if(tl->tag != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag);
+    } else {
+      //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag);
+    }
+  }
+
+  return 1;
+}
+
+const char *nfapi_error_code_to_str(nfapi_error_code_e value) {
+  switch(value) {
+    case NFAPI_MSG_OK:
+      return "NFAPI_MSG_OK";
+
+    case NFAPI_MSG_INVALID_STATE:
+      return "NFAPI_MSG_INVALID_STATE";
+
+    case NFAPI_MSG_INVALID_CONFIG:
+      return "NFAPI_MSG_INVALID_CONFIG";
+
+    case NFAPI_SFN_OUT_OF_SYNC:
+      return "NFAPI_SFN_OUT_OF_SYNC";
+
+    case NFAPI_MSG_SUBFRAME_ERR:
+      return "NFAPI_MSG_SUBFRAME_ERR";
+
+    case NFAPI_MSG_BCH_MISSING:
+      return "NFAPI_MSG_BCH_MISSING";
+
+    case NFAPI_MSG_INVALID_SFN:
+      return "NFAPI_MSG_INVALID_SFN";
+
+    case NFAPI_MSG_HI_ERR:
+      return "NFAPI_MSG_HI_ERR";
+
+    case NFAPI_MSG_TX_ERR:
+      return "NFAPI_MSG_TX_ERR";
+
+    default:
+      return "UNKNOWN";
+  }
+}
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index bc529d3e4338c085184b46ff528689b5e623ec5f..98f89f599c83955496c1d8503e32d739f3d4aba3 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -1046,7 +1046,7 @@ static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t
           push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
           push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
           push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
-          push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
+          push16(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
           push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
           push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
           push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
@@ -1581,13 +1581,19 @@ static uint8_t pack_ul_config_request_body_value(void *tlv, uint8_t **ppWritePac
 static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
   nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
 
-  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
+  if (!push16(pNfapiMsg->SFN, ppWritePackedMsg, end))
+    return 0;
+  if (!push16(pNfapiMsg->Slot, ppWritePackedMsg, end))
+    return 0;
+  if (!push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end))
+    return 0;
+  if (!push8(pNfapiMsg->n_group, ppWritePackedMsg, end))
+    return 0;
+  if (!push8(pNfapiMsg->rach_present, ppWritePackedMsg, end))
+    return 0;
+  if (!push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end))
+    return 0;
+  if (!push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end))
     return 0;
 
   for(int i=0; i<pNfapiMsg->n_pdus; i++) {
@@ -1891,15 +1897,23 @@ static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg
 
     switch(value->TLVs[i].tag) {
       case 0: {
-        if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
+        if (!pusharray32(value->TLVs[i].value.direct, sizeof(value->TLVs[i].value.direct) / sizeof(uint32_t),
+                        value->TLVs[i].length / sizeof(uint32_t), ppWritePackedMsg, end)) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s():%d. value->TLVs[i].length %d \n",
+                      __FUNCTION__, __LINE__, value->TLVs[i].length);
           return 0;
+        }
 
         break;
       }
 
       case 1: {
-        if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length, value->TLVs[i].length, ppWritePackedMsg, end))
+        if (!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length / sizeof(uint32_t),
+                         value->TLVs[i].length / sizeof(uint32_t), ppWritePackedMsg, end)) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s():%d. value->TLVs[i].length %d \n",
+                      __FUNCTION__, __LINE__, value->TLVs[i].length);
           return 0;
+        }
 
         break;
       }
@@ -3006,10 +3020,8 @@ return 1;
 
 //RX DATA INDICATION
 
-static uint8_t pack_nr_rx_data_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+static uint8_t pack_nr_rx_data_indication_body(nfapi_nr_rx_data_pdu_t *value, uint8_t **ppWritePackedMsg, uint8_t *end)
 {
-	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
-
 	if(!(push32(value->handle, ppWritePackedMsg, end) &&
 	 	 push16(value->rnti, ppWritePackedMsg, end) &&
 		 push8(value->harq_id, ppWritePackedMsg, end) &&
@@ -3039,7 +3051,7 @@ static uint8_t pack_nr_rx_data_indication(void *msg, uint8_t **ppWritePackedMsg,
 
 	for (int i = 0; i < pNfapiMsg->number_of_pdus; i++)
 	{
-		if(!pack_nr_rx_data_indication_body(&(pNfapiMsg->pdu_list[i]), ppWritePackedMsg, end))
+		if(!pack_nr_rx_data_indication_body(&(pNfapiMsg->pdu_list[i]), ppWritePackedMsg, end))	
 		        return 0;
 	}
 
@@ -3087,10 +3099,8 @@ return 1;
 
 //SRS INDICATION
 
-static uint8_t pack_nr_srs_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+static uint8_t pack_nr_srs_indication_body(nfapi_nr_srs_indication_pdu_t *value, uint8_t **ppWritePackedMsg, uint8_t *end)
 {
-	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
-
 	if(!(push32(value->handle, ppWritePackedMsg, end) &&
 	 	 push16(value->rnti, ppWritePackedMsg, end) &&
 		 push16(value->timing_advance, ppWritePackedMsg, end) &&
@@ -3102,8 +3112,7 @@ static uint8_t pack_nr_srs_indication_body(void* tlv, uint8_t **ppWritePackedMsg
 		  return 0;
 	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
 	{
-		if(!(push8(value->reported_symbol_list->rb_list->rb_snr, ppWritePackedMsg, end)
-			))
+		if (!push8(value->reported_symbol_list->rb_list[i].rb_snr, ppWritePackedMsg, end))
 			return 0;
 	}
 	return 1;
@@ -3179,32 +3188,36 @@ return 1;
 static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
 	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
 
-	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
-	 	 push32(value->handle, ppWritePackedMsg, end) &&
-		 push16(value->rnti, ppWritePackedMsg, end) &&
-		 push8(value->pucch_format, ppWritePackedMsg, end) &&
-		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
-		 push16(value->timing_advance, ppWritePackedMsg, end) &&
-		 push16(value->rssi, ppWritePackedMsg, end)
-		 ))
-		  return 0;
+	if (!push8(value->pduBitmap, ppWritePackedMsg, end))
+		return 0;
+	if (!push32(value->handle, ppWritePackedMsg, end))
+		return 0;
+	if (!push16(value->rnti, ppWritePackedMsg, end))
+		return 0;
+	if (!push8(value->pucch_format, ppWritePackedMsg, end))
+		return 0;
+	if (!push8(value->ul_cqi, ppWritePackedMsg, end))
+		return 0;
+	if (!push16(value->timing_advance, ppWritePackedMsg, end))
+		return 0;
+	if (!push16(value->rssi, ppWritePackedMsg, end))
+		return 0;
 	if (value->pduBitmap & 0x01) { //SR
-		if (!(push8(value->sr->sr_indication, ppWritePackedMsg, end) &&
-		 push8(value->sr->sr_confidence_level, ppWritePackedMsg, end)
-		 ))
-		  return 0;
+		if (!push8(value->sr->sr_indication, ppWritePackedMsg, end))
+			return 0;
+		if (!push8(value->sr->sr_confidence_level, ppWritePackedMsg, end))
+			return 0;
 	}
 
 	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
-		if (!(push8(value->harq->num_harq, ppWritePackedMsg, end) &&
-		 push8(value->harq->harq_confidence_level, ppWritePackedMsg, end)
-		 ))
+		if (!push8(value->harq->num_harq, ppWritePackedMsg, end))
+			return 0;
+		if (!push8(value->harq->harq_confidence_level, ppWritePackedMsg, end))
 			return 0;
 		for (int i = 0; i < value->harq->num_harq; i++)
 		{
-			if (!(push8(value->harq->harq_list[i].harq_value, ppWritePackedMsg, end)
-			))
-			        return 0;
+			if (!push8(value->harq->harq_list[i].harq_value, ppWritePackedMsg, end))
+				return 0;
 		}
 	}
 
@@ -3214,57 +3227,79 @@ static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint
 static uint8_t pack_nr_uci_pucch_2_3_4(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
 	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
 
-	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
-	 	 push32(value->handle, ppWritePackedMsg, end) &&
-		 push16(value->rnti, ppWritePackedMsg, end) &&
-		 push8(value->pucch_format, ppWritePackedMsg, end) &&
-		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
-		 push16(value->timing_advance, ppWritePackedMsg, end) &&
-		 push16(value->rssi, ppWritePackedMsg, end)
-		 ))
-		  return 0;
+	if (!push8(value->pduBitmap, ppWritePackedMsg, end))
+		return 0;
+	if (!push32(value->handle, ppWritePackedMsg, end))
+		return 0;
+	if (!push16(value->rnti, ppWritePackedMsg, end))
+		return 0;
+	if (!push8(value->pucch_format, ppWritePackedMsg, end))
+		return 0;
+	if (!push8(value->ul_cqi, ppWritePackedMsg, end))
+		return 0;
+	if (!push16(value->timing_advance, ppWritePackedMsg, end))
+		return 0;
+	if (!push16(value->rssi, ppWritePackedMsg, end))
+		return 0;
 
 	if (value->pduBitmap & 0x01) { //SR
-		if(!(push8(value->sr.sr_bit_len, ppWritePackedMsg, end) &&
-	 	 pusharray8(value->sr.sr_payload, (int)(value->sr.sr_bit_len / 8) + 1, (int)(value->sr.sr_bit_len / 8) + 1, ppWritePackedMsg, end)
-		 ))
-		  return 0;
+		if (!push16(value->sr.sr_bit_len, ppWritePackedMsg, end))
+			return 0;
+		if (!pusharray8(value->sr.sr_payload,
+                               (int)((value->sr.sr_bit_len / 8) + 1),
+                               (int)((value->sr.sr_bit_len / 8) + 1),
+                               ppWritePackedMsg,
+                               end))
+			return 0;
 	}
 
-	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
-		if(!(push8(value->harq.harq_crc, ppWritePackedMsg, end) &&
-			push8(value->harq.harq_bit_len, ppWritePackedMsg, end) &&
-	 	 	pusharray8(value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8) + 1, (int)(value->harq.harq_bit_len / 8) + 1, ppWritePackedMsg, end)
-			))
+	if ((value->pduBitmap >> 1) & 0x01) { //HARQ
+		if (!push8(value->harq.harq_crc, ppWritePackedMsg, end))
+			return 0;
+		if (!push16(value->harq.harq_bit_len, ppWritePackedMsg, end))
+			return 0;
+		if (!pusharray8(value->harq.harq_payload,
+                                (int)((value->harq.harq_bit_len / 8) + 1),
+                                (int)((value->harq.harq_bit_len / 8) + 1),
+                                ppWritePackedMsg,
+                                end))
 			return 0;
 	}
 
-	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
-		if(!(push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end) &&
-			push8(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end) &&
-	 	 	pusharray8(value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, ppWritePackedMsg, end)
-			))
+	if ((value->pduBitmap >> 2) & 0x01) { //CSI-1
+		if (!push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end))
+			return 0;
+		if (!push16(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end))
+			return 0;
+		if (!pusharray8(value->csi_part1.csi_part1_payload,
+                                (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+                                (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+                                ppWritePackedMsg,
+                                end))
 			return 0;
 	}
 
-	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
-		if(!(push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end) &&
-			push8(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end) &&
-	 	 	pusharray8(value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, ppWritePackedMsg, end)
-			))
+	if ((value->pduBitmap >> 3) & 0x01) { //CSI-2
+		if (!push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end))
+			return 0;
+		if (!push16(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end))
+			return 0;
+		if (!pusharray8(value->csi_part2.csi_part2_payload,
+                                (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+                                (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+                                ppWritePackedMsg,
+                                end))
 			return 0;
 	}
 
 	return 1;
 }
 
-static uint8_t pack_nr_uci_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+static uint8_t pack_nr_uci_indication_body(nfapi_nr_uci_t* value, uint8_t **ppWritePackedMsg, uint8_t *end)
 {
-	nfapi_nr_uci_t* value = (nfapi_nr_uci_t*)tlv;
-
-	if(!(push16(value->pdu_type, ppWritePackedMsg, end) &&
-		push16(value->pdu_size, ppWritePackedMsg, end)
-		))
+	if (!push16(value->pdu_type, ppWritePackedMsg, end))
+		return 0;
+	if (!push16(value->pdu_size, ppWritePackedMsg, end))
 		return 0;
 
 	switch (value->pdu_type) {
@@ -3288,13 +3323,14 @@ static uint8_t pack_nr_uci_indication(void *msg, uint8_t **ppWritePackedMsg, uin
 {
 	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
 
-	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end)
-		))
+	if (!push16(pNfapiMsg->sfn , ppWritePackedMsg, end))
+			return 0;
+	if (!push16(pNfapiMsg->slot , ppWritePackedMsg, end))
+			return 0;
+	if (!push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end))
 			return 0;
 
-	for(int i=0; i<pNfapiMsg->num_ucis;i++)
+	for (int i = 0; i < pNfapiMsg->num_ucis; i++)
 	{
 		if (!pack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppWritePackedMsg, end))
 		        return 0;
@@ -4616,14 +4652,19 @@ static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_
 static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
   nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
 
-  if (!(
-        pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
+  if (!pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end))
+    return 0;
+  if (!pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end))
+    return 0;
+  if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end))
+    return 0;
+  if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end))
+    return 0;
+  if (!pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end))
+    return 0;
+  if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end))
+    return 0;
+  if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end))
     return 0;
 
   for(int i=0; i< pNfapiMsg->n_pdus; i++) {
@@ -5506,14 +5547,18 @@ static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t
 
     switch(pNfapiMsg->TLVs[i].tag) {
       case 0: {
-        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
+        if (!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct,
+                        sizeof(pNfapiMsg->TLVs[i].value.direct) / sizeof(uint32_t),
+                        pNfapiMsg->TLVs[i].length / sizeof(uint32_t), end))
           return 0;
 
         break;
       }
 
       case 1: {
-        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length, pNfapiMsg->TLVs[i].length, end))
+        if (!pullarray32(ppReadPackedMsg,pNfapiMsg->TLVs[i].value.ptr,
+                        pNfapiMsg->TLVs[i].length / sizeof(uint32_t),
+                        pNfapiMsg->TLVs[i].length / sizeof(uint32_t), end))
           return 0;
 
         break;
@@ -5667,7 +5712,7 @@ static uint8_t unpack_nr_rx_data_indication_body(nfapi_nr_rx_data_pdu_t* value,
 		return 0;
 
         uint16_t length = value->pdu_length;
-        value->pdu = nfapi_p7_allocate(length, config);
+        value->pdu = nfapi_p7_allocate(sizeof(*value->pdu) * length, config);
 
         if (pullarray8(ppReadPackedMsg, value->pdu, length, length, end) == 0)
         {
@@ -5748,10 +5793,8 @@ return 1;
 
 //SRS INDICATION
 
-static uint8_t unpack_nr_srs_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+static uint8_t unpack_nr_srs_indication_body(nfapi_nr_srs_indication_pdu_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
 {
-	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
-
 	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
 	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
 		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
@@ -5763,17 +5806,14 @@ static uint8_t unpack_nr_srs_indication_body(void* tlv, uint8_t **ppReadPackedMs
 		  return 0;
 	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
 	{
-		if(!(pull8(ppReadPackedMsg, &value->reported_symbol_list->rb_list->rb_snr, end)
-			))
+		if (!pull8(ppReadPackedMsg, &value->reported_symbol_list->rb_list[i].rb_snr, end))
 			return 0;
 	}
 	return 1;
 }
 
-static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_srs_indication_t *pNfapiMsg, nfapi_p7_codec_config_t* config)
 {
-	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
-
 	if (!(pull16(ppReadPackedMsg,&pNfapiMsg->sfn , end) &&
 		pull16(ppReadPackedMsg,&pNfapiMsg->slot , end) &&
 		pull8(ppReadPackedMsg,&pNfapiMsg->number_of_pdus, end)
@@ -5782,7 +5822,7 @@ static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end,
 
 	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)
 	{
-		if(!unpack_nr_srs_indication_body(&pNfapiMsg->pdu_list,ppReadPackedMsg,end))
+		if (!unpack_nr_srs_indication_body(&pNfapiMsg->pdu_list[i], ppReadPackedMsg, end))
 		return 0;
 	}
 
@@ -5903,58 +5943,111 @@ static uint8_t unpack_nr_uci_pucch_0_1(nfapi_nr_uci_pucch_pdu_format_0_1_t *valu
 }
 
 
-static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
+static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value,
+                                         uint8_t **ppReadPackedMsg,
+                                         uint8_t *end,
+                                         nfapi_p7_codec_config_t *config) {
+
+	if (!pull8(ppReadPackedMsg, &value->pduBitmap, end))
+		return 0;
+	if (!pull32(ppReadPackedMsg, &value->handle, end))
+                return 0;
+	if (!pull16(ppReadPackedMsg, &value->rnti, end))
+                return 0;
+	if (!pull8(ppReadPackedMsg, &value->pucch_format, end))
+                return 0;
+	if (!pull8(ppReadPackedMsg, &value->ul_cqi, end))
+                return 0;
+	if (!pull16(ppReadPackedMsg, &value->timing_advance, end))
+                return 0;
+	if (!pull16(ppReadPackedMsg, &value->rssi, end))
+                return 0;
 
-	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
-	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
-		 pull16(ppReadPackedMsg, &value->rnti, end) &&
-		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
-		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
-		 pull16(ppReadPackedMsg, &value->rssi, end)
-		 ))
-		  return 0;
 	if (value->pduBitmap & 0x01) { //SR
-		if(!(pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end)))
+		if (!pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end))
 			return 0;
 
-		value->sr.sr_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->sr.sr_bit_len/8)));
+		value->sr.sr_payload = nfapi_p7_allocate(sizeof(*value->sr.sr_payload) *
+                                                         (int)((value->sr.sr_bit_len / 8) + 1),
+                                                         config);
+		if (value->sr.sr_payload == NULL)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->sr.sr_payload\n", __FUNCTION__);
+			return 0;
+		}
 
-	 	if(!(pullarray8(ppReadPackedMsg, &value->sr.sr_payload[0], (int)(value->sr.sr_bit_len / 8), (int)(value->sr.sr_bit_len / 8), end)))
-		  	return 0;
+		if (!pullarray8(ppReadPackedMsg, value->sr.sr_payload,
+				(int)((value->sr.sr_bit_len / 8) + 1),
+				(int)((value->sr.sr_bit_len / 8) + 1),
+                                end))
+			return 0;
 	}
 
-	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
-		if(!(pull8(ppReadPackedMsg, &value->harq.harq_crc, end)) &&
-			(pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end)))
+	if ((value->pduBitmap >> 1) & 0x01) { //HARQ
+		if (!pull8(ppReadPackedMsg, &value->harq.harq_crc, end))
+			return 0;
+		if (!pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end))
 			return 0;
 
-		value->harq.harq_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->harq.harq_bit_len/8 )));
+		value->harq.harq_payload = nfapi_p7_allocate(sizeof(*value->harq.harq_payload) *
+                                                             (int)((value->harq.harq_bit_len / 8) + 1),
+                                                             config);
+		if (value->harq.harq_payload == NULL)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->harq.harq_payload\n", __FUNCTION__);
+			return 0;
+		}
 
-	 	if(!(pullarray8(ppReadPackedMsg, value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8), (int)(value->harq.harq_bit_len / 8), end)))
+		if (!pullarray8(ppReadPackedMsg, value->harq.harq_payload,
+				(int)((value->harq.harq_bit_len / 8) + 1),
+				(int)((value->harq.harq_bit_len / 8) + 1),
+                                end))
 			return 0;
 	}
 
-	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
-		if(!(pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end)) &&
-			(pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end)))
+	if ((value->pduBitmap >> 2) & 0x01) { //CSI-1
+		if (!pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end))
+			return 0;
+		if (!pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end))
 			return 0;
 
-		value->csi_part1.csi_part1_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part1.csi_part1_bit_len/8)));
+		value->csi_part1.csi_part1_payload = nfapi_p7_allocate(sizeof(*value->csi_part1.csi_part1_payload) *
+                                                                       (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+                                                                       config);
+		if (value->csi_part1.csi_part1_payload == NULL)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->csi_part1.csi_part1_payload\n",
+				    __FUNCTION__);
+			return 0;
+		}
 
-//		if(!(pullarray8(ppReadPackedMsg, value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8), (int)(value->csi_part1.csi_part1_bit_len / 8), end)))
-//			return 0;
+		if (!pullarray8(ppReadPackedMsg, value->csi_part1.csi_part1_payload,
+                                (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+                                (int)((value->csi_part1.csi_part1_bit_len / 8) + 1),
+                                end))
+			return 0;
 	}
 
-	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
-		if(!(pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end)) &&
-			(pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end)))
+	if ((value->pduBitmap >> 3) & 0x01) { //CSI-2
+		if (!pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end))
+			return 0;
+		if (!pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end))
 			return 0;
 
-		value->csi_part2.csi_part2_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part2.csi_part2_bit_len/8 )));
+		value->csi_part2.csi_part2_payload = nfapi_p7_allocate(sizeof(*value->csi_part2.csi_part2_payload) *
+                                                                       (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+                                                                       config);
+		if (value->csi_part2.csi_part2_payload == NULL)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->csi_part2.csi_part2_payload\n",
+			            __FUNCTION__);
+			return 0;
+		}
 
-		if(!(pullarray8(ppReadPackedMsg, value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) , (int)(value->csi_part2.csi_part2_bit_len / 8) , end)))
+		if (!pullarray8(ppReadPackedMsg, value->csi_part2.csi_part2_payload,
+                                (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+                                (int)((value->csi_part2.csi_part2_bit_len / 8) + 1),
+                                end))
 			return 0;
 	}
 
@@ -5966,9 +6059,9 @@ static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t *value,
                                              uint8_t *end,
                                              nfapi_p7_codec_config_t *config)
 {
-	if(!(pull16(ppReadPackedMsg, &value->pdu_type, end) &&
-		pull16(ppReadPackedMsg, &value->pdu_size, end)
-		))
+	if (!pull16(ppReadPackedMsg, &value->pdu_type, end))
+		return 0;
+	if (!pull16(ppReadPackedMsg, &value->pdu_size, end))
 		return 0;
 
 	switch (value->pdu_type) {
@@ -5984,7 +6077,7 @@ static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t *value,
                 }
                 case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
                         nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &value->pucch_pdu_format_2_3_4;
-                        if (!unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end))
+                        if (!unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end, config))
                                 return 0;
                         break;
                 }
@@ -6000,17 +6093,18 @@ static uint8_t unpack_nr_uci_indication(uint8_t **ppReadPackedMsg, uint8_t *end,
 {
 	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
 
-	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end)
-		))
-			return 0;
+	if (!pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end))
+		return 0;
+	if (!pull16(ppReadPackedMsg, &pNfapiMsg->slot , end))
+		return 0;
+	if (!pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end))
+		return 0;
 
 	pNfapiMsg->uci_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->uci_list) * pNfapiMsg->num_ucis, config);
 	for (int i = 0; i < pNfapiMsg->num_ucis; i++)
 	{
-		if(!unpack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppReadPackedMsg, end, config))
-		        return 0;
+		if (!unpack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppReadPackedMsg, end, config))
+			return 0;
 	}
 
         return 1;
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
index 2ac59dd7be91f24ca40d6eb1cb8ac87d1393fb84..e4b4bef848eb452b69a44b6413bad1aa2912e565 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
@@ -1473,7 +1473,7 @@ void vnf_handle_nr_slot_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf
 		}
 		else
 		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling NR SLOT Indication\n", __FUNCTION__);
+			NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s: Handling NR SLOT Indication\n", __FUNCTION__);
                         if(vnf_p7->_public.nr_slot_indication)
 			{
 				(vnf_p7->_public.nr_slot_indication)(&ind);
@@ -2574,32 +2574,28 @@ int vnf_p7_read_dispatch_message(vnf_p7_t* vnf_p7)
 			// resize the buffer if we have a large segment
 			if(header.message_length > vnf_p7->rx_message_buffer_size)
 			{
-				NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length); 
+				NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length);
 				vnf_p7->rx_message_buffer = realloc(vnf_p7->rx_message_buffer, header.message_length);
 				vnf_p7->rx_message_buffer_size = header.message_length;
 			}
 
 			// read the segment
-			recvfrom_result = recvfrom(vnf_p7->socket, vnf_p7->rx_message_buffer, header.message_length, MSG_WAITALL, (struct sockaddr*)&remote_addr, &remote_addr_size);
+			recvfrom_result = recvfrom(vnf_p7->socket, vnf_p7->rx_message_buffer, header.message_length, MSG_WAITALL | MSG_TRUNC, (struct sockaddr*)&remote_addr, &remote_addr_size);
+			NFAPI_TRACE(NFAPI_TRACE_INFO, "recvfrom_result = %d from %s():%d\n", recvfrom_result, __FUNCTION__, __LINE__);
 
 			// todo : how to handle incomplete readfroms, need some sort of buffer/select
 
-			if(recvfrom_result == 0)
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "recvfrom returned 0\n");
-			}
-			else if(recvfrom_result != -1 && recvfrom_result != header.message_length)
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "Received unexpected number of bytes %d %d\n", recvfrom_result, header.message_length);
-				
-				recvfrom_result += recvfrom(vnf_p7->socket, &vnf_p7->rx_message_buffer[recvfrom_result], header.message_length - recvfrom_result, MSG_WAITALL, (struct sockaddr*)&remote_addr, &remote_addr_size);
-	
-			}
-			
-			
-			if(recvfrom_result > 0)
+			if (recvfrom_result > 0)
 			{
+				if (recvfrom_result != header.message_length)
+				{
+					NFAPI_TRACE(NFAPI_TRACE_ERROR, "(%d) Received unexpected number of bytes. %d != %d",
+						    __LINE__, recvfrom_result, header.message_length);
+					break;
+				}
+				NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling vnf_nr_handle_p7_message from %d\n", __LINE__);
 				vnf_handle_p7_message(vnf_p7->rx_message_buffer, recvfrom_result, vnf_p7);
+				return 0;
 			}
 			else
 			{
diff --git a/oaienv b/oaienv
index f8ef707c12fe09a1aa2da5f86a59548fc0134b8e..bb24469703c54628a13d7fbfb2ad29faf09d2fcc 100644
--- a/oaienv
+++ b/oaienv
@@ -1,6 +1,7 @@
 
 export OPENAIR_HOME=$(pwd)
 export OPENAIR_DIR=$(pwd)
+export AWGN_RESULTS_DIR=$OPENAIR_DIR/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results
 export OPENAIR1_DIR=$OPENAIR_HOME/openair1
 export OPENAIR2_DIR=$OPENAIR_HOME/openair2
 export OPENAIR3_DIR=$OPENAIR_HOME/openair3
diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
index 41b2d4fe84c2b3a3b330edc6a262986d501a38a5..841a31fd850713839941888f9c4351b7980d7d9d 100644
--- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c
+++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
@@ -31,6 +31,7 @@
 #include "openair1/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.h"
 #include "openair1/PHY/defs_nr_common.h"
 #include "coding_unitary_defs.h"
+#include "common/utils/LOG/log.h"
 
 #define MAX_BLOCK_LENGTH 8448
 
@@ -79,16 +80,19 @@ char quantize8bit(double D,double x)
 }
 
 typedef struct {
-  double n_iter_mean;
-  double n_iter_std;
-  int n_iter_max;
+  double n_iter_mean[400];
+  double n_iter_std[400];
+  int n_iter_max[400];
+  double snr[400];
+  double ber[400];
+  double bler[400];
 } n_iter_stats_t;
 
 nrLDPC_encoderfunc_t encoder_orig;
 
 short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384};
 
-int test_ldpc(short No_iteration,
+int test_ldpc(short max_iterations,
               int nom_rate,
               int denom_rate,
               double SNR,
@@ -102,8 +106,8 @@ int test_ldpc(short No_iteration,
               unsigned int *crc_misses,
               time_stats_t *time_optim,
               time_stats_t *time_decoder,
-              n_iter_stats_t *dec_iter
-              )
+              n_iter_stats_t *dec_iter,
+              int nsnr)
 {
   //clock initiate
   //time_stats_t time,time_optim,tinput,tprep,tparity,toutput, time_decoder;
@@ -126,7 +130,6 @@ int test_ldpc(short No_iteration,
   //double channel_output[68 * 384];
   double modulated_input[MAX_NUM_DLSCH_SEGMENTS][68 * 384] = { 0 };
   char channel_output_fixed[MAX_NUM_DLSCH_SEGMENTS][68  * 384] = { 0 };
-  unsigned int i,j,trial=0;
   short BG=0,nrows=0;//,ncols;
   int no_punctured_columns,removed_bit;
   int i1,Zc,Kb=0;
@@ -137,12 +140,9 @@ int test_ldpc(short No_iteration,
   int code_rate_vec[8] = {15, 13, 25, 12, 23, 34, 56, 89};
   //double code_rate_actual_vec[8] = {0.2, 0.33333, 0.4, 0.5, 0.66667, 0.73333, 0.81481, 0.88};
 
-  t_nrLDPC_dec_params decParams;
-  t_nrLDPC_procBuf nrLDPC_procBuf;
-  t_nrLDPC_procBuf* p_nrLDPC_procBuf = &nrLDPC_procBuf;
-    
+  t_nrLDPC_dec_params decParams[MAX_NUM_DLSCH_SEGMENTS]={0};
+
   t_nrLDPC_time_stats decoder_profiler = {0};
-  t_nrLDPC_time_stats* p_decoder_profiler =&decoder_profiler ;
 
   int32_t n_iter = 0;
 
@@ -152,7 +152,7 @@ int test_ldpc(short No_iteration,
   *crc_misses=0;
 
   // generate input block
-  for(j=0;j<MAX_NUM_DLSCH_SEGMENTS;j++) {
+  for(int j=0;j<MAX_NUM_DLSCH_SEGMENTS;j++) {
     test_input[j]=(unsigned char *)malloc16(sizeof(unsigned char) * block_length/8);
     memset(test_input[j], 0, sizeof(unsigned char) * block_length / 8);
     channel_input[j] = (unsigned char *)malloc16(sizeof(unsigned char) * 68*384);
@@ -181,11 +181,8 @@ int test_ldpc(short No_iteration,
   reset_meas(&decoder_profiler.llr2bit);
   //reset_meas(&decoder_profiler.total);
 
-  // Allocate LDPC decoder buffers
-  p_nrLDPC_procBuf = nrLDPC_init_mem();
-
-  for (j=0;j<MAX_NUM_DLSCH_SEGMENTS;j++) {
-    for (i=0; i<block_length/8; i++) {
+  for (int j=0;j<MAX_NUM_DLSCH_SEGMENTS;j++) {
+    for (int i=0; i<block_length/8; i++) {
       test_input[j][i]=(unsigned char) rand();
       //test_input[j][i]=j%256;
       //test_input[j][i]=252;
@@ -272,17 +269,17 @@ int test_ldpc(short No_iteration,
   //  printf("puncture:%d\n",no_punctured_columns);
   removed_bit=(nrows-no_punctured_columns-2) * Zc+block_length-(int)(block_length/((float)nom_rate/(float)denom_rate));
   encoder_implemparams_t impp=INIT0_LDPCIMPLEMPARAMS;
- 
+
   impp.gen_code=1;
   if (ntrials==0)
     encoder_orig(test_input,channel_input, Zc, BG, block_length, BG, &impp);
   impp.gen_code=0;
-  for (trial=0; trial < ntrials; trial++)
+  for (int trial=0; trial < ntrials; trial++)
   {
 	segment_bler = 0;
     //// encoder
     start_meas(&time);
-    for(j=0;j<n_segments;j++) {
+    for(int j=0;j<n_segments;j++) {
       encoder_orig(&(test_input[j]), &(channel_input[j]),Zc,Kb,block_length,BG,&impp);
     }
     stop_meas(&time);
@@ -294,7 +291,7 @@ int test_ldpc(short No_iteration,
       }
     stop_meas(time_optim);*/
     impp.n_segments=n_segments;
-    for(j=0;j<(n_segments/8+1);j++) {
+    for(int j=0;j<(n_segments/8+1);j++) {
     	start_meas(time_optim);
     	impp.macro_num=j;
     	nrLDPC_encoder(test_input,channel_input_optim,Zc,Kb,block_length, BG, &impp);
@@ -302,8 +299,8 @@ int test_ldpc(short No_iteration,
     }
     
     if (ntrials==1)    
-      for (j=0;j<n_segments;j++)
-        for (i = 0; i < block_length+(nrows-no_punctured_columns) * Zc - removed_bit; i++)
+      for (int j=0;j<n_segments;j++)
+        for (int i = 0; i < block_length+(nrows-no_punctured_columns) * Zc - removed_bit; i++)
           if (channel_input[j][i]!=channel_input_optim[j][i]) {
             printf("differ in seg %u pos %u (%u,%u)\n", j, i, channel_input[j][i], channel_input_optim[j][i]);
             return (-1);
@@ -319,92 +316,60 @@ int test_ldpc(short No_iteration,
       printf("number of undecoded bits: %d\n", (Kb+nrows-no_punctured_columns-2) * Zc-removed_bit);
     }
 
-    //print_meas_now(&time, "", stdout);
-
-    // for (i=0;i<6400;i++)
-    //printf("channel_input[%d]=%d\n",i,channel_input[i]);
-    //printf("%d ",channel_input[i]);
-
-    //if ((BG==2) && (Zc==128||Zc==256))
     if (1) { // Transmitting one segment 
-      for(j=0;j<n_segments;j++) {
-	for (i = 2*Zc; i < (Kb+nrows-no_punctured_columns) * Zc-removed_bit; i++) {
+      for(int j=0;j<n_segments;j++) {
+        for (int i = 2*Zc; i < (Kb+nrows-no_punctured_columns) * Zc-removed_bit; i++) {
 #ifdef DEBUG_CODER
-        if ((i&0xf)==0)
-          printf("\ne %u..%u:    ",i,i+15);
+          if ((i&0xf)==0)
+            printf("\ne %u..%u:    ",i,i+15);
 #endif
 
-        if (channel_input_optim[j][i-2*Zc]==0)
-          modulated_input[j][i]=1.0;///sqrt(2);  //QPSK
-        else
-          modulated_input[j][i]=-1.0;///sqrt(2);
-
-        ///channel_output[i] = modulated_input[i] + gaussdouble(0.0,1.0) * 1/sqrt(2*SNR);
-        //channel_output_fixed[i] = (char) ((channel_output[i]*128)<0?(channel_output[i]*128-0.5):(channel_output[i]*128+0.5)); //fixed point 9-7
-        //printf("llr[%d]=%d\n",i,channel_output_fixed[i]);
-
-        //channel_output_fixed[i] = (char)quantize(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0),qbits);
-        channel_output_fixed[j][i] = (char)quantize(sigma/4.0/4.0,modulated_input[j][i] + sigma*gaussdouble(0.0,1.0),qbits);
-        //channel_output_fixed[i] = (char)quantize8bit(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0));
-        //printf("llr[%d]=%d\n",i,channel_output_fixed[i]);
-        //printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]);
+          if (channel_input_optim[j][i-2*Zc]==0)
+            modulated_input[j][i]=1.0;///sqrt(2);  //QPSK
+          else
+            modulated_input[j][i]=-1.0;///sqrt(2);
 
+          ///channel_output[i] = modulated_input[i] + gaussdouble(0.0,1.0) * 1/sqrt(2*SNR);
+          //channel_output_fixed[i] = (char) ((channel_output[i]*128)<0?(channel_output[i]*128-0.5):(channel_output[i]*128+0.5)); //fixed point 9-7
+          //printf("llr[%d]=%d\n",i,channel_output_fixed[i]);
 
-        //channel_output_fixed[i] = (char)quantize(1,channel_output_fixed[i],qbits);
+          //channel_output_fixed[i] = (char)quantize(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0),qbits);
+          channel_output_fixed[j][i] = (char)quantize(sigma/4.0/4.0,modulated_input[j][i] + sigma*gaussdouble(0.0,1.0),qbits);
+          //channel_output_fixed[i] = (char)quantize8bit(sigma/4.0,(2.0*modulated_input[i]) - 1.0 + sigma*gaussdouble(0.0,1.0));
+          //printf("llr[%d]=%d\n",i,channel_output_fixed[i]);
+          //printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]);
 
-        //Uncoded BER
-        unsigned char channel_output_uncoded = channel_output_fixed[j][i]<0 ? 1 /* QPSK demod */ : 0;
 
-        if (channel_output_uncoded != channel_input_optim[j][i-2*Zc])
-	  *errors_bit_uncoded = (*errors_bit_uncoded) + 1;
+          //Uncoded BER
+          unsigned char channel_output_uncoded = channel_output_fixed[j][i]<0 ? 1 /* QPSK demod */ : 0;
 
-	}
-      } // End segments
+          if (channel_output_uncoded != channel_input_optim[j][i-2*Zc])
+      *errors_bit_uncoded = (*errors_bit_uncoded) + 1;
 
-      //for (i=(Kb+nrows) * Zc-5;i<(Kb+nrows) * Zc;i++)
-      //{
-      //  printf("channel_input[%d]=%d\n",i,channel_input[i]);
-      //printf("%lf %d\n",channel_output[i], channel_output_fixed[i]);
-      //printf("v[%d]=%lf\n",i,modulated_input[i]);}
+        }
+     
 #ifdef DEBUG_CODER
-      printf("\n");
-      exit(-1);
+        printf("\n");
+        exit(-1);
 #endif
 
-      decParams.BG=BG;
-      decParams.Z=Zc;
-      decParams.R=code_rate_vec[R_ind];//13;
-      decParams.numMaxIter=No_iteration;
-      decParams.outMode = nrLDPC_outMode_BIT;
-      decParams.block_length=block_length;
-      //decParams.outMode =nrLDPC_outMode_LLRINT8;
-	  nrLDPC_initcall(&decParams, (int8_t*)channel_output_fixed[j], (int8_t*)estimated_output[j]);
-	  for(j=0;j<n_segments;j++) {
-    	  start_meas(time_decoder);
-          n_iter = nrLDPC_decoder(&decParams, (int8_t*)channel_output_fixed[j], (int8_t*)estimated_output[j], p_nrLDPC_procBuf, p_decoder_profiler);
-	      stop_meas(time_decoder);
+        decParams[j].BG=BG;
+        decParams[j].Z=Zc;
+        decParams[j].R=code_rate_vec[R_ind];//13;
+        decParams[j].numMaxIter=max_iterations;
+        decParams[j].outMode = nrLDPC_outMode_BIT;
+        decParams[j].block_length=block_length;
+        nrLDPC_initcall(&decParams[j], (int8_t*)channel_output_fixed[j], (int8_t*)estimated_output[j]);
       }
-
-      //for (i=(Kb+nrows) * Zc-5;i<(Kb+nrows) * Zc;i++)
-      //  printf("esimated_output[%d]=%d\n",i,esimated_output[i]);
-
-      //count errors
-      for(j=0;j<n_segments;j++) {
-      for (i=0; i<block_length>>3; i++)
-      {
-          //printf("block_length>>3: %d \n",block_length>>3);
-         /// printf("i: %d \n",i);
-          ///printf("estimated_output[%d]: %d \n",i,estimated_output[i]);
-          ///printf("test_input[0][%d]: %d \n",i,test_input[0][i]);
-        if (estimated_output[j][i] != test_input[j][i])
-        {
-      //////printf("error pos %d (%d, %d)\n\n",i,estimated_output[i],test_input[0][i]);
-          segment_bler = segment_bler + 1;
-          break;
+      for(int j=0;j<n_segments;j++) {
+        start_meas(time_decoder);
+        n_iter = nrLDPC_decoder(&decParams[j], (int8_t*)channel_output_fixed[j], (int8_t*)estimated_output[j], &decoder_profiler);
+        stop_meas(time_decoder);
+        //count errors
+        if ( memcmp(estimated_output[j], test_input[j], block_length/8 ) != 0 ) {
+          segment_bler++;
         }
-      }
-
-      for (i=0; i<block_length; i++)
+        for (int i=0; i<block_length; i++)
         {
           unsigned char estoutputbit = (estimated_output[j][i/8]&(1<<(i&7)))>>(i&7);
           unsigned char inputbit = (test_input[j][i/8]&(1<<(i&7)))>>(i&7); // Further correct for multiple segments
@@ -412,40 +377,33 @@ int test_ldpc(short No_iteration,
             *errors_bit = (*errors_bit) + 1;
         }
 
-      //if (*errors == 1000)
-    	  //break;
-
-      n_iter_mean =  n_iter_mean + n_iter;
-      n_iter_std = n_iter_std + pow(n_iter-1,2);
+        n_iter_mean += n_iter;
+        n_iter_std +=  pow(n_iter-1,2);
 
-      if ( n_iter > n_iter_max )
-        n_iter_max = n_iter;
+        if ( n_iter > n_iter_max )
+          n_iter_max = n_iter;
 
-    } // end segments
+      } // end segments
 
       if (segment_bler != 0)
-		*errors = (*errors) + 1;
+        *errors = (*errors) + 1;
 
     }
-    /*else if (trial==0)
-      printf("decoder is not supported\n");*/
   }
 
 
-  dec_iter->n_iter_mean = n_iter_mean/(double)ntrials/(double)n_segments - 1;
-  dec_iter->n_iter_std = sqrt(n_iter_std/(double)ntrials/(double)n_segments - pow(n_iter_mean/(double)ntrials/(double)n_segments - 1,2));
-  dec_iter->n_iter_max = n_iter_max -1;
+  dec_iter->n_iter_mean[nsnr] = n_iter_mean/(double)ntrials/(double)n_segments - 1;
+  dec_iter->n_iter_std[nsnr] = sqrt(n_iter_std/(double)ntrials/(double)n_segments - pow(n_iter_mean/(double)ntrials/(double)n_segments - 1,2));
+  dec_iter->n_iter_max[nsnr] = n_iter_max -1;
 
   *errors_bit_uncoded = *errors_bit_uncoded / (double)((Kb+nrows-no_punctured_columns-2) * Zc-removed_bit);
 
-  for(j=0;j<MAX_NUM_DLSCH_SEGMENTS;j++) {
+  for(int j=0;j<MAX_NUM_DLSCH_SEGMENTS;j++) {
     free(test_input[j]);
     free(channel_input[j]);
     free(channel_input_optim[j]);
   }
 
-  nrLDPC_free_mem(p_nrLDPC_procBuf);
-
   print_meas(&time,"ldpc_encoder",NULL,NULL);
   print_meas(time_optim,"ldpc_encoder_optim",NULL,NULL);
   print_meas(&tinput,"ldpc_encoder_optim(input)",NULL,NULL);
@@ -476,7 +434,7 @@ int main(int argc, char *argv[])
   double errors_bit_uncoded;
   short block_length=8448; // decoder supports length: 1201 -> 1280, 2401 -> 2560
   char *ldpc_version=NULL; /* version of the ldpc decoder library to use (XXX suffix to use when loading libldpc_XXX.so */
-  short No_iteration=5;
+  short max_iterations=5;
   int n_segments=1;
   //double rate=0.333;
   
@@ -486,7 +444,7 @@ int main(int argc, char *argv[])
   unsigned char qbits=8;
   unsigned int decoded_errors[10000]; // initiate the size of matrix equivalent to size of SNR
   int c,i=0, i1 = 0;
-  int loglvl=OAILOG_WARNING;
+
   int n_trials = 1;
   double SNR_step = 0.1;
 
@@ -494,14 +452,11 @@ int main(int argc, char *argv[])
   int test_uncoded= 0;
 
   time_stats_t time_optim[10], time_decoder[10];
-  n_iter_stats_t dec_iter[3];
+  n_iter_stats_t dec_iter;
 
   short BG=0,Zc,Kb=0;
-  if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
-    exit_fun(" Error, configuration module init failed\n");
-  } // must be done before specific options parsing to prevent errasing them
-  
-  while ((c = getopt (argc, argv, "q:r:s:S:l:L:G:n:d:i:t:u:hv:")) != -1)
+
+  while ((c = getopt (argc, argv, "q:r:s:S:l:G:n:d:i:t:u:hv:")) != -1)
     switch (c)
     {
       case 'q':
@@ -519,10 +474,6 @@ int main(int argc, char *argv[])
       case 'l':
         block_length = atoi(optarg);
         break;
-
-      case 'L':
-        loglvl = atoi(optarg);
-        break;
 		
       case 'G':
         ldpc_version="_cuda";
@@ -545,7 +496,7 @@ int main(int argc, char *argv[])
         break;
 
       case 'i':
-        No_iteration = atoi(optarg);
+        max_iterations = atoi(optarg);
         break;
 
       case 'u':
@@ -560,11 +511,10 @@ int main(int argc, char *argv[])
               printf("BG1 (blocklength > 3840): 1/3, 2/3, 22/25 (8/9) \n");
               printf("BG2 (blocklength <= 3840): 1/5, 1/3, 2/3 \n\n");
               printf("-h This message\n");
-              printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n");              
               printf("-q Quantization bits, Default: 8\n");
               printf("-r Nominator rate, (1, 2, 22), Default: 1\n");
               printf("-d Denominator rate, (3, 5, 25), Default: 1\n");
-              printf("-l Block length (l > 3840 -> BG1, rest BG2 ), Default: 8448\n");              
+              printf("-l Block length (l > 3840 -> BG1, rest BG2 ), Default: 8448\n");
 			  printf("-G give 1 to run cuda for LDPC, Default: 0\n");
               printf("-n Number of simulation trials, Default: 1\n");
               //printf("-M MCS2 for TB 2\n");
@@ -583,8 +533,6 @@ int main(int argc, char *argv[])
   printf("n_trials %d: \n", n_trials);
   printf("SNR0 %f: \n", SNR0);
 
-  logInit();
-  set_glog(loglvl);
 
   if (ldpc_version != NULL)
     load_nrLDPClib(ldpc_version);
@@ -632,7 +580,7 @@ int main(int argc, char *argv[])
   }
 
   char fname[200];
-  sprintf(fname,"ldpctest_BG_%d_Zc_%d_rate_%d-%d_block_length_%d_maxit_%d.txt",BG,Zc,nom_rate,denom_rate,block_length, No_iteration);
+  sprintf(fname,"ldpctest_BG_%d_Zc_%d_rate_%d-%d_block_length_%d_maxit_%d.txt",BG,Zc,nom_rate,denom_rate,block_length, max_iterations);
   FILE *fd=fopen(fname,"w");
   AssertFatal(fd!=NULL,"cannot open %s\n",fname);
 
@@ -647,7 +595,7 @@ int main(int argc, char *argv[])
     else
     	SNR_lin = pow(10,SNR/10.0)*nom_rate/denom_rate;
     printf("Linear SNR: %f\n", SNR_lin);
-    decoded_errors[i]=test_ldpc(No_iteration,
+    decoded_errors[i]=test_ldpc(max_iterations,
                                 nom_rate,
                                 denom_rate,
                                 SNR_lin,   // noise standard deviation
@@ -661,14 +609,18 @@ int main(int argc, char *argv[])
                                 &crc_misses,
                                 time_optim,
                                 time_decoder,
-                                dec_iter);
-
-    printf("SNR %f, BLER %f (%u/%d)\n", SNR, (float)decoded_errors[i]/(float)n_trials, decoded_errors[i], n_trials);
-    printf("SNR %f, BER %f (%u/%d)\n", SNR, (float)errors_bit/(float)n_trials/(float)block_length/(double)n_segments, decoded_errors[i], n_trials);
+                                &dec_iter,
+                                i);
+
+    dec_iter.snr[i] = SNR;
+    dec_iter.ber[i] = (float)errors_bit/(float)n_trials/(float)block_length/(double)n_segments;
+    dec_iter.bler[i] = (float)decoded_errors[i]/(float)n_trials;
+    printf("SNR %f, BLER %f (%u/%d)\n", SNR, dec_iter.bler[i], decoded_errors[i], n_trials);
+    printf("SNR %f, BER %f (%u/%d)\n", SNR, dec_iter.ber[i], decoded_errors[i], n_trials);
     printf("SNR %f, Uncoded BER %f (%u/%d)\n",SNR, errors_bit_uncoded/(float)n_trials/(double)n_segments, decoded_errors[i], n_trials);
-    printf("SNR %f, Mean iterations: %f\n",SNR, dec_iter->n_iter_mean);
-    printf("SNR %f, Std iterations: %f\n",SNR, dec_iter->n_iter_std);
-    printf("SNR %f, Max iterations: %d\n",SNR, dec_iter->n_iter_max);
+    printf("SNR %f, Mean iterations: %f\n",SNR, dec_iter.n_iter_mean[i]);
+    printf("SNR %f, Std iterations: %f\n",SNR, dec_iter.n_iter_std[i]);
+    printf("SNR %f, Max iterations: %d\n",SNR, dec_iter.n_iter_max[i]);
     printf("\n");
     printf("Encoding time mean: %15.3f us\n",(double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz());
     printf("Encoding time std: %15.3f us\n",sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz(),2)));
@@ -689,16 +641,20 @@ int main(int argc, char *argv[])
     		(double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(),
     		sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(),2)),
     		(double)time_decoder->max/1000.0/get_cpu_freq_GHz(),
-    		dec_iter->n_iter_mean,
-    		dec_iter->n_iter_std,
-    		dec_iter->n_iter_max
+    		dec_iter.n_iter_mean[i],
+    		dec_iter.n_iter_std[i],
+    		dec_iter.n_iter_max[i]
     		);
 
-    if (decoded_errors[i] == 0) break;
-
     i=i+1;
+    if (decoded_errors[i-1] == 0) break;
+
   }
   fclose(fd);
+  LOG_M("ldpctestStats.m","SNR",&dec_iter.snr[0],i,1,7);
+  LOG_MM("ldpctestStats.m","BLER",&dec_iter.bler[0],i,1,7);
+  LOG_MM("ldpctestStats.m","BER",&dec_iter.ber[0],i,1,7);
+  LOG_MM("ldpctestStats.m","meanIter",&dec_iter.n_iter_mean[0],i,1,7);
 
   loader_reset();
   logTerm();
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
index 878150a9a8c20405142e72548baa2ab07c10530a..91f552f935c02d41543c94826dcbf74dfdea01f4 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
@@ -37,17 +37,12 @@
    \param p_lut Pointer to decoder LUTs
    \param Z Lifting size
 */
-static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, int8_t* bnProcBuf, int8_t* bnProcBufRes, int8_t* llrProcBuf, int8_t* llrRes, uint16_t Z)
 {
     const uint8_t*  lut_numBnInBnGroups = p_lut->numBnInBnGroups;
     const uint32_t* lut_startAddrBnGroups = p_lut->startAddrBnGroups;
     const uint16_t* lut_startAddrBnGroupsLlr = p_lut->startAddrBnGroupsLlr;
 
-    int8_t* bnProcBuf    = p_procBuf->bnProcBuf;
-    int8_t* bnProcBufRes = p_procBuf->bnProcBufRes;
-    int8_t* llrRes       = p_procBuf->llrRes;
-    int8_t* llrProcBuf   = p_procBuf->llrProcBuf;
-
     __m128i* p_bnProcBuf;
     __m256i* p_bnProcBufRes;
     __m128i* p_llrProcBuf;
@@ -1681,7 +1676,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
    \param p_lut Pointer to decoder LUTs
    \param Z Lifting size
 */
-static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, int8_t* bnProcBuf, int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z)
 {
     // BN Processing calculating the values to send back to the CNs for next iteration
     // bnProcBufRes contains the sum of all edges to each BN at the start of each group
@@ -1690,10 +1685,6 @@ static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBu
     const uint32_t* lut_startAddrBnGroups = p_lut->startAddrBnGroups;
     const uint16_t* lut_startAddrBnGroupsLlr = p_lut->startAddrBnGroupsLlr;
 
-    int8_t* bnProcBuf    = p_procBuf->bnProcBuf;
-    int8_t* bnProcBufRes = p_procBuf->bnProcBufRes;
-    int8_t* llrRes       = p_procBuf->llrRes;
-
     __m256i* p_bnProcBuf;
     __m256i* p_bnProcBufRes;
     __m256i* p_llrRes;
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h
index db9d6e4119c8d6f79faabc2e4daa8787bd1e7855..6d82fe5f11f86ebc924e3a163a56cb1adbd7e36f 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h
@@ -37,14 +37,11 @@
    \param p_procBuf Pointer to processing buffers
    \param Z Lifting size
 */
-static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups   = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
 
-    int8_t* cnProcBuf    = p_procBuf->cnProcBuf;
-    int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;
-    
     __m256i* p_cnProcBuf;
     __m256i* p_cnProcBufRes;
 
@@ -372,14 +369,11 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
    \param p_lut Pointer to decoder LUTs
    \param Z Lifting size
 */
-static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups   = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
 
-    int8_t* cnProcBuf    = p_procBuf->cnProcBuf;
-    int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;
-    
     __m256i* p_cnProcBuf;
     __m256i* p_cnProcBufRes;
 
@@ -871,14 +865,11 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
    \param Z Lifting size
    \return 32-bit parity check indicator
 */
-static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups   = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
 
-    int8_t* cnProcBuf    = p_procBuf->cnProcBuf;
-    int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;
-    
     __m256i* p_cnProcBuf;
     __m256i* p_cnProcBufRes;
 
@@ -1506,14 +1497,11 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
    \param Z Lifting size
    \return 32-bit parity check indicator
 */
-static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups   = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
 
-    int8_t* cnProcBuf    = p_procBuf->cnProcBuf;
-    int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;
-    
     __m256i* p_cnProcBuf;
     __m256i* p_cnProcBufRes;
 
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
index 166cd9a5a333b45f5ccdcbfc53ec042b1baead6c..bf0f401e9746d7d48bf571dc2066cb68288d0689 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
@@ -45,22 +45,22 @@
 #include "nrLDPC_tools/nrLDPC_debug.h"
 #endif
 
-static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler);
+static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler);
+int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type);
 void nrLDPC_initcall(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out) {
 }
-int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats* p_profiler)
+int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_time_stats* p_profiler)
 {
     uint32_t numLLR;
     uint32_t numIter = 0;
     t_nrLDPC_lut lut;
     t_nrLDPC_lut* p_lut = &lut;
 
-    //printf("p_procBuf->cnProcBuf = %p\n", p_procBuf->cnProcBuf);
     // Initialize decoder core(s) with correct LUTs
     numLLR = nrLDPC_init(p_decParams, p_lut);
 
     // Launch LDPC decoder core for one segment
-    numIter = nrLDPC_decoder_core(p_llr, p_out, p_procBuf, numLLR, p_lut, p_decParams, p_profiler);
+    numIter = nrLDPC_decoder_core(p_llr, p_out, numLLR, p_lut, p_decParams, p_profiler);
 
     return numIter;
 }
@@ -74,13 +74,20 @@ int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_
    \param p_decParams LDPC decoder parameters
    \param p_profiler LDPC profiler statistics
 */
-static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler)
+static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler)
 {
     uint16_t Z          = p_decParams->Z;
     uint8_t  BG         = p_decParams->BG;
     uint8_t  numMaxIter = p_decParams->numMaxIter;
     e_nrLDPC_outMode outMode = p_decParams->outMode;
 
+    int8_t cnProcBuf[NR_LDPC_SIZE_CN_PROC_BUF]    __attribute__ ((aligned(32))) = {0};
+    int8_t cnProcBufRes[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(32))) = {0};
+    int8_t bnProcBuf[NR_LDPC_SIZE_BN_PROC_BUF]    __attribute__ ((aligned(32))) = {0};
+    int8_t bnProcBufRes[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(32))) = {0};
+    int8_t llrRes[NR_LDPC_MAX_NUM_LLR]            __attribute__ ((aligned(32))) = {0};
+    int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR]        __attribute__ ((aligned(32))) = {0};
+    int8_t llrOut[NR_LDPC_MAX_NUM_LLR]            __attribute__ ((aligned(32))) = {0};
     // Minimum number of iterations is 1
     // 0 iterations means hard-decision on input LLRs
     uint32_t i = 1;
@@ -95,9 +102,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
     else
     {
         // Use LLR processing buffer as temporary output buffer
-        p_llrOut = p_procBuf->llrProcBuf;
-        // Clear llrProcBuf
-        memset(p_llrOut,0, NR_LDPC_MAX_NUM_LLR*sizeof(int8_t));
+        p_llrOut = llrOut;
     }
 
 
@@ -105,14 +110,14 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->llr2llrProcBuf);
 #endif
-    nrLDPC_llr2llrProcBuf(p_lut, p_llr, p_procBuf, Z, BG);
+    nrLDPC_llr2llrProcBuf(p_lut, p_llr, llrProcBuf, Z, BG);
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->llr2llrProcBuf);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
     nrLDPC_debug_initBuffer2File(nrLDPC_buffers_LLR_PROC);
-    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_PROC, p_procBuf);
+    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_PROC, llrProcBuf);
 #endif
 
 #ifdef NR_LDPC_PROFILER_DETAIL
@@ -120,11 +125,11 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #endif
     if (BG == 1)
     {
-        nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, p_procBuf, Z);
+        nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, cnProcBuf, Z);
     }
     else
     {
-        nrLDPC_llr2CnProcBuf_BG2(p_lut, p_llr, p_procBuf, Z);
+        nrLDPC_llr2CnProcBuf_BG2(p_lut, p_llr, cnProcBuf, Z);
     }
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->llr2CnProcBuf);
@@ -132,7 +137,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 
 #ifdef NR_LDPC_DEBUG_MODE
     nrLDPC_debug_initBuffer2File(nrLDPC_buffers_CN_PROC);
-    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, p_procBuf);
+    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, cnProcBuf);
 #endif
 
     // First iteration
@@ -143,11 +148,11 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #endif
     if (BG == 1)
     {
-        nrLDPC_cnProc_BG1(p_lut, p_procBuf, Z);
+        nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z);
     }
     else
     {
-        nrLDPC_cnProc_BG2(p_lut, p_procBuf, Z);
+        nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z);
     }
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->cnProc);
@@ -155,7 +160,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 
 #ifdef NR_LDPC_DEBUG_MODE
     nrLDPC_debug_initBuffer2File(nrLDPC_buffers_CN_PROC_RES);
-    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, p_procBuf);
+    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, cnProcBufRes);
 #endif
 
 #ifdef NR_LDPC_PROFILER_DETAIL
@@ -163,11 +168,11 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #endif
     if (BG == 1)
     {
-        nrLDPC_cn2bnProcBuf_BG1(p_lut, p_procBuf, Z);
+        nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z);
     }
     else
     {
-        nrLDPC_cn2bnProcBuf_BG2(p_lut, p_procBuf, Z);
+        nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z);
     }
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->cn2bnProcBuf);
@@ -175,34 +180,34 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 
 #ifdef NR_LDPC_DEBUG_MODE
     nrLDPC_debug_initBuffer2File(nrLDPC_buffers_BN_PROC);
-    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, p_procBuf);
+    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, bnProcBuf);
 #endif
 
     // BN processing
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->bnProcPc);
 #endif
-    nrLDPC_bnProcPc(p_lut, p_procBuf, Z);
+    nrLDPC_bnProcPc(p_lut, bnProcBuf, bnProcBufRes, llrProcBuf, llrRes, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->bnProcPc);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
     nrLDPC_debug_initBuffer2File(nrLDPC_buffers_LLR_RES);
-    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, p_procBuf);
+    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, llrRes);
 #endif
 
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->bnProc);
 #endif
-    nrLDPC_bnProc(p_lut, p_procBuf, Z);
+    nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->bnProc);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
     nrLDPC_debug_initBuffer2File(nrLDPC_buffers_BN_PROC_RES);
-    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, p_procBuf);
+    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, bnProcBufRes);
 #endif
 
     // BN results to CN processing buffer
@@ -211,18 +216,18 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #endif
     if (BG == 1)
     {
-        nrLDPC_bn2cnProcBuf_BG1(p_lut, p_procBuf, Z);
+        nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z);
     }
     else
     {
-        nrLDPC_bn2cnProcBuf_BG2(p_lut, p_procBuf, Z);
+        nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z);
     }
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->bn2cnProcBuf);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
-    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, p_procBuf);
+    nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, cnProcBuf);
 #endif
 
     // Parity Check not necessary here since it will fail
@@ -242,18 +247,18 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #endif
         if (BG == 1)
         {
-            nrLDPC_cnProc_BG1(p_lut, p_procBuf, Z);
+            nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z);
         }
         else
         {
-            nrLDPC_cnProc_BG2(p_lut, p_procBuf, Z);
+            nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z);
         }
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->cnProc);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, p_procBuf);
+        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, cnProcBufRes);
 #endif
 
         // Send CN results back to BNs
@@ -262,43 +267,43 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #endif
         if (BG == 1)
         {
-            nrLDPC_cn2bnProcBuf_BG1(p_lut, p_procBuf, Z);
+            nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z);
         }
         else
         {
-            nrLDPC_cn2bnProcBuf_BG2(p_lut, p_procBuf, Z);
+            nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z);
         }
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->cn2bnProcBuf);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, p_procBuf);
+        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, bnProcBuf);
 #endif
 
         // BN Processing
 #ifdef NR_LDPC_PROFILER_DETAIL
         start_meas(&p_profiler->bnProcPc);
 #endif
-        nrLDPC_bnProcPc(p_lut, p_procBuf, Z);
+        nrLDPC_bnProcPc(p_lut, bnProcBuf, bnProcBufRes, llrProcBuf, llrRes, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->bnProcPc);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, p_procBuf);
+        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, llrRes);
 #endif
 
 #ifdef NR_LDPC_PROFILER_DETAIL
         start_meas(&p_profiler->bnProc);
 #endif
-        nrLDPC_bnProc(p_lut, p_procBuf, Z);
+        nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z);
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->bnProc);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, p_procBuf);
+        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, bnProcBufRes);
 #endif
 
         // BN results to CN processing buffer
@@ -307,18 +312,18 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #endif
         if (BG == 1)
         {
-            nrLDPC_bn2cnProcBuf_BG1(p_lut, p_procBuf, Z);
+            nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z);
         }
         else
         {
-            nrLDPC_bn2cnProcBuf_BG2(p_lut, p_procBuf, Z);
+            nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z);
         }
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->bn2cnProcBuf);
 #endif
 
 #ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, p_procBuf);
+        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, cnProcBuf);
 #endif
 
         // Parity Check
@@ -328,123 +333,11 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #endif
         if (BG == 1)
         {
-            pcRes = nrLDPC_cnProcPc_BG1(p_lut, p_procBuf, Z);
+            pcRes = nrLDPC_cnProcPc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z);
         }
         else
         {
-            pcRes = nrLDPC_cnProcPc_BG2(p_lut, p_procBuf, Z);
-        }
-#ifdef NR_LDPC_PROFILER_DETAIL
-        stop_meas(&p_profiler->cnProcPc);
-#endif
-#endif
-    }
-
-    // Last iteration
-    if ( (i < numMaxIter) && (pcRes != 0) )
-    {
-        // Increase iteration counter
-        i++;
-
-        // CN processing
-#ifdef NR_LDPC_PROFILER_DETAIL
-        start_meas(&p_profiler->cnProc);
-#endif
-        if (BG == 1)
-        {
-            nrLDPC_cnProc_BG1(p_lut, p_procBuf, Z);
-        }
-        else
-        {
-            nrLDPC_cnProc_BG2(p_lut, p_procBuf, Z);
-        }
-#ifdef NR_LDPC_PROFILER_DETAIL
-        stop_meas(&p_profiler->cnProc);
-#endif
-
-#ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, p_procBuf);
-#endif
-
-        // Send CN results back to BNs
-#ifdef NR_LDPC_PROFILER_DETAIL
-        start_meas(&p_profiler->cn2bnProcBuf);
-#endif
-        if (BG == 1)
-        {
-            nrLDPC_cn2bnProcBuf_BG1(p_lut, p_procBuf, Z);
-        }
-        else
-        {
-            nrLDPC_cn2bnProcBuf_BG2(p_lut, p_procBuf, Z);
-        }
-#ifdef NR_LDPC_PROFILER_DETAIL
-        stop_meas(&p_profiler->cn2bnProcBuf);
-#endif
-
-#ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, p_procBuf);
-#endif
-
-        // BN Processing
-#ifdef NR_LDPC_PROFILER_DETAIL
-        start_meas(&p_profiler->bnProcPc);
-#endif
-        nrLDPC_bnProcPc(p_lut, p_procBuf, Z);
-#ifdef NR_LDPC_PROFILER_DETAIL
-        stop_meas(&p_profiler->bnProcPc);
-#endif
-
-#ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, p_procBuf);
-#endif
-
-        // If parity check not enabled, no need to send the BN proc results
-        // back to CNs
-#ifdef NR_LDPC_ENABLE_PARITY_CHECK
-#ifdef NR_LDPC_PROFILER_DETAIL
-        start_meas(&p_profiler->bnProc);
-#endif
-        nrLDPC_bnProc(p_lut, p_procBuf, Z);
-#ifdef NR_LDPC_PROFILER_DETAIL
-        stop_meas(&p_profiler->bnProc);
-#endif
-
-#ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, p_procBuf);
-#endif
-
-        // BN results to CN processing buffer
-#ifdef NR_LDPC_PROFILER_DETAIL
-        start_meas(&p_profiler->bn2cnProcBuf);
-#endif
-        if (BG == 1)
-        {
-            nrLDPC_bn2cnProcBuf_BG1(p_lut, p_procBuf, Z);
-        }
-        else
-        {
-            nrLDPC_bn2cnProcBuf_BG2(p_lut, p_procBuf, Z);
-        }
-#ifdef NR_LDPC_PROFILER_DETAIL
-        stop_meas(&p_profiler->bn2cnProcBuf);
-#endif
-
-#ifdef NR_LDPC_DEBUG_MODE
-        nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, p_procBuf);
-#endif
-
-        // Parity Check
-#ifdef NR_LDPC_PROFILER_DETAIL
-        start_meas(&p_profiler->cnProcPc);
-#endif
-        if (BG == 1)
-        {
-            pcRes = nrLDPC_cnProcPc_BG1(p_lut, p_procBuf, Z);
-        }
-        else
-        {
-            pcRes = nrLDPC_cnProcPc_BG2(p_lut, p_procBuf, Z);
+            pcRes = nrLDPC_cnProcPc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z);
         }
 #ifdef NR_LDPC_PROFILER_DETAIL
         stop_meas(&p_profiler->cnProcPc);
@@ -466,7 +359,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
 #ifdef NR_LDPC_PROFILER_DETAIL
     start_meas(&p_profiler->llrRes2llrOut);
 #endif
-    nrLDPC_llrRes2llrOut(p_lut, p_llrOut, p_procBuf, Z, BG);
+    nrLDPC_llrRes2llrOut(p_lut, p_llrOut, llrRes, Z, BG);
 #ifdef NR_LDPC_PROFILER_DETAIL
     stop_meas(&p_profiler->llrRes2llrOut);
 #endif
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
deleted file mode 100644
index f08549130ee08db0296b623482cf8411ef71b257..0000000000000000000000000000000000000000
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-/*!\file nrLDPC_init_mem.h
- * \brief Defines the function to initialize the LDPC decoder and sets correct LUTs.
- * \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com>
- * \date 07-12-2018
- * \version 1.0
- * \note
- * \warning
- */
-
-#ifndef __NR_LDPC_INIT_MEM__H__
-#define __NR_LDPC_INIT_MEM__H__
-
-#include <stdlib.h>
-#include "nrLDPC_types.h"
-
-/**
-   \brief Allocates 32 byte aligned memory and initializes to zero
-   \param size Input size in bytes
-   \return Pointer to memory
-*/
-static inline void* malloc32_clear(size_t size)
-{
-    void* ptr = (void*) memalign(32, size+32);
-    memset(ptr, 0, size);
-    return ptr;
-}
-
-/**
-   \brief Allocates and initializes the internal decoder processing buffers
-   \param p_decParams Pointer to decoder parameters
-   \param p_lut Pointer to decoder LUTs
-   \return Number of LLR values
-*/
-static inline t_nrLDPC_procBuf* nrLDPC_init_mem(void)
-{
-    t_nrLDPC_procBuf* p_procBuf = (t_nrLDPC_procBuf*) malloc32_clear(sizeof(t_nrLDPC_procBuf));
-
-    if (p_procBuf)
-    {
-        p_procBuf->cnProcBuf    = (int8_t*) malloc32_clear(NR_LDPC_SIZE_CN_PROC_BUF*sizeof(int8_t));
-        p_procBuf->cnProcBufRes = (int8_t*) malloc32_clear(NR_LDPC_SIZE_CN_PROC_BUF*sizeof(int8_t));
-        p_procBuf->bnProcBuf    = (int8_t*) malloc32_clear(NR_LDPC_SIZE_BN_PROC_BUF*sizeof(int8_t));
-        p_procBuf->bnProcBufRes = (int8_t*) malloc32_clear(NR_LDPC_SIZE_BN_PROC_BUF*sizeof(int8_t));
-        p_procBuf->llrRes       = (int8_t*) malloc32_clear(NR_LDPC_MAX_NUM_LLR     *sizeof(int8_t));
-        p_procBuf->llrProcBuf   = (int8_t*) malloc32_clear(NR_LDPC_MAX_NUM_LLR     *sizeof(int8_t));
-    }
-
-    return(p_procBuf);
-}
-
-static inline void nrLDPC_free_mem(t_nrLDPC_procBuf* p_procBuf)
-{
-    free(p_procBuf->cnProcBuf);
-    free(p_procBuf->cnProcBufRes);
-    free(p_procBuf->bnProcBuf);
-    free(p_procBuf->bnProcBufRes);
-    free(p_procBuf->llrRes);
-    free(p_procBuf->llrProcBuf);
-
-    free(p_procBuf);
-}
-#endif
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
index b76750459d90830e3abd4ba103befb182e24376d..7f514d5cfa6ff2a457f79c2493ea314c3517cf24 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
@@ -97,7 +97,7 @@ static inline void *nrLDPC_circ_memcpy(int8_t *str1, const int8_t *str2, uint16_
    \param Z Lifting size
    \param BG Base graph
 */
-static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrLDPC_procBuf* p_procBuf, uint16_t Z, uint8_t BG)
+static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, int8_t* llrProcBuf, uint16_t Z, uint8_t BG)
 {
     uint32_t i;
     const uint8_t numBn2CnG1 = p_lut->numBnInBnGroups[0];
@@ -109,7 +109,6 @@ static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrL
     const uint8_t*  lut_llr2llrProcBufBnPos = p_lut->llr2llrProcBufBnPos;
 
     uint32_t idxBn;
-    int8_t* llrProcBuf = p_procBuf->llrProcBuf;
 
     // Copy LLRs connected to 1 CN
     if (numBn2CnG1 > 0)
@@ -133,7 +132,7 @@ static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrL
    \param p_procBuf Pointer to the processing buffers
    \param Z Lifting size
 */
-static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, int8_t* cnProcBuf, uint16_t Z)
 {
     const uint16_t (*lut_circShift_CNG3) [lut_numCnInCnGroups_BG1_R13[0]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[0]]) p_lut->circShift[0];
     const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG1_R13[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[1]]) p_lut->circShift[1];
@@ -158,7 +157,6 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, t_
     const uint8_t*  lut_numCnInCnGroups = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
 
-    int8_t* cnProcBuf = p_procBuf->cnProcBuf;
     uint32_t i;
     uint32_t j;
 
@@ -342,7 +340,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, t_
    \param p_procBuf Pointer to the processing buffers
    \param Z Lifting size
 */
-static inline void nrLDPC_llr2CnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_llr2CnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* llr, int8_t* cnProcBuf, uint16_t Z)
 {
     const uint16_t (*lut_circShift_CNG3)  [lut_numCnInCnGroups_BG2_R15[0]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[0]]) p_lut->circShift[0];
     const uint16_t (*lut_circShift_CNG4)  [lut_numCnInCnGroups_BG2_R15[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[1]]) p_lut->circShift[1];
@@ -361,7 +359,6 @@ static inline void nrLDPC_llr2CnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* llr, t_
     const uint8_t*  lut_numCnInCnGroups = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
 
-    int8_t* cnProcBuf = p_procBuf->cnProcBuf;
     uint32_t i;
     uint32_t j;
 
@@ -478,7 +475,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* llr, t_
    \param p_procBuf Pointer to the processing buffers
    \param Z Lifting size
 */
-static inline void nrLDPC_cn2bnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_cn2bnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBufRes, int8_t* bnProcBuf, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
@@ -504,9 +501,6 @@ static inline void nrLDPC_cn2bnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
     const uint8_t (*lut_bnPosBnProcBuf_CNG8)  [lut_numCnInCnGroups[4]] = (const uint8_t(*)[lut_numCnInCnGroups[4]]) p_lut->bnPosBnProcBuf[4];
     const uint8_t (*lut_bnPosBnProcBuf_CNG10) [lut_numCnInCnGroups[5]] = (const uint8_t(*)[lut_numCnInCnGroups[5]]) p_lut->bnPosBnProcBuf[5];
 
-    int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;
-    int8_t* bnProcBuf    = p_procBuf->bnProcBuf;
-
     int8_t* p_cnProcBufRes;
     uint32_t bitOffsetInGroup;
     uint32_t i;
@@ -621,7 +615,7 @@ static inline void nrLDPC_cn2bnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
    \param p_procBuf Pointer to the processing buffers
    \param Z Lifting size
 */
-static inline void nrLDPC_cn2bnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_cn2bnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBufRes, int8_t* bnProcBuf, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
@@ -655,9 +649,6 @@ static inline void nrLDPC_cn2bnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
     const uint8_t (*lut_bnPosBnProcBuf_CNG10)[lut_numCnInCnGroups[7]] = (const uint8_t(*)[lut_numCnInCnGroups[7]]) p_lut->bnPosBnProcBuf[7];
     const uint8_t (*lut_bnPosBnProcBuf_CNG19)[lut_numCnInCnGroups[8]] = (const uint8_t(*)[lut_numCnInCnGroups[8]]) p_lut->bnPosBnProcBuf[8];
 
-    int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;
-    int8_t* bnProcBuf    = p_procBuf->bnProcBuf;
-
     int8_t* p_cnProcBufRes;
     uint32_t bitOffsetInGroup;
     uint32_t i;
@@ -819,7 +810,7 @@ static inline void nrLDPC_cn2bnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
    \param p_procBuf Pointer to the processing buffers
    \param Z Lifting size
 */
-static inline void nrLDPC_bn2cnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_bn2cnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* bnProcBufRes, int8_t* cnProcBuf, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
@@ -845,9 +836,6 @@ static inline void nrLDPC_bn2cnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
     const uint8_t (*lut_bnPosBnProcBuf_CNG8)  [lut_numCnInCnGroups[4]] = (const uint8_t(*)[lut_numCnInCnGroups[4]]) p_lut->bnPosBnProcBuf[4];
     const uint8_t (*lut_bnPosBnProcBuf_CNG10) [lut_numCnInCnGroups[5]] = (const uint8_t(*)[lut_numCnInCnGroups[5]]) p_lut->bnPosBnProcBuf[5];
 
-    int8_t* cnProcBuf    = p_procBuf->cnProcBuf;
-    int8_t* bnProcBufRes = p_procBuf->bnProcBufRes;
-
     int8_t* p_cnProcBuf;
     uint32_t bitOffsetInGroup;
     uint32_t i;
@@ -961,7 +949,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
    \param p_procBuf Pointer to the processing buffers
    \param Z Lifting size
 */
-static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z)
+static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBufRes, int8_t* cnProcBuf, uint16_t Z)
 {
     const uint8_t*  lut_numCnInCnGroups = p_lut->numCnInCnGroups;
     const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups;
@@ -995,9 +983,6 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
     const uint8_t (*lut_bnPosBnProcBuf_CNG10)[lut_numCnInCnGroups[7]] = (const uint8_t(*)[lut_numCnInCnGroups[7]]) p_lut->bnPosBnProcBuf[7];
     const uint8_t (*lut_bnPosBnProcBuf_CNG19)[lut_numCnInCnGroups[8]] = (const uint8_t(*)[lut_numCnInCnGroups[8]]) p_lut->bnPosBnProcBuf[8];
 
-    int8_t* cnProcBuf    = p_procBuf->cnProcBuf;
-    int8_t* bnProcBufRes = p_procBuf->bnProcBufRes;
-
     int8_t* p_cnProcBuf;
     uint32_t bitOffsetInGroup;
     uint32_t i;
@@ -1157,7 +1142,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
    \param Z Lifting size
    \param BG Base graph
 */
-static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z, uint8_t BG)
+static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, int8_t* llrRes, uint16_t Z, uint8_t BG)
 {
     uint32_t i;
     const uint8_t numBn2CnG1 = p_lut->numBnInBnGroups[0];
@@ -1168,7 +1153,6 @@ static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, t_n
     const uint16_t* lut_llr2llrProcBufAddr = p_lut->llr2llrProcBufAddr;
     const uint8_t*  lut_llr2llrProcBufBnPos = p_lut->llr2llrProcBufBnPos;
 
-    int8_t* llrRes = p_procBuf->llrRes;
     int8_t* p_llrOut = &llrOut[0];
     uint32_t idxBn;
 
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h
index e4dcb56edd3ef02dfc86a3f427407b99ebd5c466..41c0a474a4457ad6ea975f3b15c5fa4ed50ceed9 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h
@@ -87,38 +87,38 @@ static inline void nrLDPC_initFile(const char* fileName)
    \brief Writes data of predefined buffers to file
    \param buffer Enum of buffer name to write
 */
-static inline void nrLDPC_debug_writeBuffer2File(e_nrLDPC_buffers buffer, t_nrLDPC_procBuf* p_procBuf)
+static inline void nrLDPC_debug_writeBuffer2File(e_nrLDPC_buffers buffer, int8_t* p_buffer)
 {
     switch (buffer)
     {
     case nrLDPC_buffers_LLR_PROC:
     {
-        nrLDPC_writeFile("llrProcBuf.txt", p_procBuf->llrProcBuf, NR_LDPC_MAX_NUM_LLR);
+        nrLDPC_writeFile("llrProcBuf.txt", p_buffer, NR_LDPC_MAX_NUM_LLR);
         break;
     }
     case nrLDPC_buffers_CN_PROC:
     {
-        nrLDPC_writeFile("cnProcBuf.txt", p_procBuf->cnProcBuf, NR_LDPC_SIZE_CN_PROC_BUF);
+        nrLDPC_writeFile("cnProcBuf.txt", p_buffer, NR_LDPC_SIZE_CN_PROC_BUF);
         break;
     }
     case nrLDPC_buffers_CN_PROC_RES:
     {
-        nrLDPC_writeFile("cnProcBufRes.txt", p_procBuf->cnProcBufRes, NR_LDPC_SIZE_CN_PROC_BUF);
+        nrLDPC_writeFile("cnProcBufRes.txt", p_buffer, NR_LDPC_SIZE_CN_PROC_BUF);
         break;
     }
     case nrLDPC_buffers_BN_PROC:
     {
-        nrLDPC_writeFile("bnProcBuf.txt", p_procBuf->bnProcBuf, NR_LDPC_SIZE_BN_PROC_BUF);
+        nrLDPC_writeFile("bnProcBuf.txt", p_buffer, NR_LDPC_SIZE_BN_PROC_BUF);
         break;
     }
     case nrLDPC_buffers_BN_PROC_RES:
     {
-        nrLDPC_writeFile("bnProcBufRes.txt", p_procBuf->bnProcBufRes, NR_LDPC_SIZE_BN_PROC_BUF);
+        nrLDPC_writeFile("bnProcBufRes.txt", p_buffer, NR_LDPC_SIZE_BN_PROC_BUF);
         break;
     }
     case nrLDPC_buffers_LLR_RES:
     {
-        nrLDPC_writeFile("llrRes.txt", p_procBuf->llrRes, NR_LDPC_MAX_NUM_LLR);
+        nrLDPC_writeFile("llrRes.txt", p_buffer, NR_LDPC_MAX_NUM_LLR);
         break;
     }
     }
diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h
index a6fb44cb0dd40bfd1b0995043ec6893e91317dff..0c9c78c3ac06ec9c5f56614a3291f83e104b7f4e 100644
--- a/openair1/PHY/CODING/nrLDPC_defs.h
+++ b/openair1/PHY/CODING/nrLDPC_defs.h
@@ -71,5 +71,5 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho
    \param p_llrOut Output vector
    \param p_profiler LDPC profiler statistics
 */
-typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params *, int8_t *, int8_t *, t_nrLDPC_procBuf *, t_nrLDPC_time_stats * );
+typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_time_stats* );
 #endif
diff --git a/openair1/PHY/CODING/nrLDPC_extern.h b/openair1/PHY/CODING/nrLDPC_extern.h
index b75b38fc76e77ac3f2955f0b332b71eb33e567ba..b358119408b61bae73af411200f9a5cef9f139a9 100644
--- a/openair1/PHY/CODING/nrLDPC_extern.h
+++ b/openair1/PHY/CODING/nrLDPC_extern.h
@@ -34,5 +34,4 @@ extern nrLDPC_initcallfunc_t nrLDPC_initcall;
 extern nrLDPC_decoderfunc_t nrLDPC_decoder;
 extern nrLDPC_encoderfunc_t nrLDPC_encoder;
 // inline functions:
-#include "openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h"
 #endif
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index 49c1b898cc7372c8a7eb94a0b4dfac9b7b616966..bfbd696d9b005fe4d84795587cb9733c0ba840f8 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -76,8 +76,6 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL)
         free_and_zero(ulsch->harq_processes[i]->c[r]);
         free_and_zero(ulsch->harq_processes[i]->d[r]);
         free_and_zero(ulsch->harq_processes[i]->w[r]);
-        nrLDPC_free_mem(ulsch->harq_processes[i]->p_nrLDPC_procBuf[r]);
-        ulsch->harq_processes[i]->p_nrLDPC_procBuf[r] = NULL;
       }
       free_and_zero(ulsch->harq_processes[i]);
       ulsch->harq_processes[i] = NULL;
@@ -101,22 +99,21 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL)
 
   uint32_t ulsch_bytes = a_segments*1056;  // allocated bytes per segment
   ulsch = (NR_gNB_ULSCH_t *)malloc16_clear(sizeof(NR_gNB_ULSCH_t));
-  
+
   ulsch->max_ldpc_iterations = max_ldpc_iterations;
   ulsch->Mlimit = 4;
-  
+
   for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
-    
+
     ulsch->harq_processes[i] = (NR_UL_gNB_HARQ_t *)malloc16_clear(sizeof(NR_UL_gNB_HARQ_t));
     ulsch->harq_processes[i]->b = (uint8_t*)malloc16_clear(ulsch_bytes);
     for (r=0; r<a_segments; r++) {
-      ulsch->harq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem();
       ulsch->harq_processes[i]->c[r] = (uint8_t*)malloc16_clear(8448*sizeof(uint8_t));
       ulsch->harq_processes[i]->d[r] = (int16_t*)malloc16_clear((68*384)*sizeof(int16_t));
       ulsch->harq_processes[i]->w[r] = (int16_t*)malloc16_clear((3*(6144+64))*sizeof(int16_t));
     }
   }
-  
+
   return(ulsch);
 }
 
@@ -360,7 +357,6 @@ void nr_processULSegment(void* arg) {
   no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,
                                      (int8_t*)&pl[0],
                                      llrProcBuf,
-                                     ulsch_harq->p_nrLDPC_procBuf[r],
                                      p_procTime);
 
   if (check_crc((uint8_t*)llrProcBuf,length_dec,ulsch_harq->F,crc_type)) {
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
index f4f183793f97675d6ec2727403fef56b3489a551..045197adc1c6f0ff05ee608b2decb40bf06ec194 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
@@ -36,7 +36,8 @@
 void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
                         PHY_VARS_NR_UE *ue,
                         module_id_t gNB_id,
-			const int estimateSz, struct complex16 dl_ch_estimates_time[][estimateSz],
+                        const int estimateSz,
+                        struct complex16 dl_ch_estimates_time[][estimateSz],
                         uint8_t frame,
                         uint8_t subframe,
                         unsigned char clear,
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 30836ded01426a2645122656dd43ffa4c1f8564c..55deb686ad84fc9c0b47122d4e9c6c3568c5472d 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -197,9 +197,9 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
 
 
 int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
-			       int estimateSz,
-			       struct complex16 dl_ch_estimates [][estimateSz],
-			       struct complex16 dl_ch_estimates_time [][estimateSz],
+                               int estimateSz,
+                               struct complex16 dl_ch_estimates [][estimateSz],
+                               struct complex16 dl_ch_estimates_time [][ue->frame_parms.ofdm_symbol_size],
                                UE_nr_rxtx_proc_t *proc,
                                uint8_t gNB_id,
                                unsigned char Ns,
@@ -320,7 +320,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
     dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
 
-    memset(dl_ch,0,sizeof(*dl_ch)*(ue->frame_parms.ofdm_symbol_size));
+    memset(dl_ch,0,sizeof(struct complex16)*(ue->frame_parms.ofdm_symbol_size));
 
 #ifdef DEBUG_CH
     printf("pbch ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL);
@@ -387,10 +387,10 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 
       // in 2nd symbol, skip middle  REs (48 with DMRS,  144 for SSS, and another 48 with DMRS) 
       if (dmrss == 1 && pilot_cnt == 12) {
-	pilot_cnt=48;
-	re_offset = (re_offset+144) % ue->frame_parms.ofdm_symbol_size;
-	rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
-	dl_ch += 288;
+        pilot_cnt=48;
+        re_offset = (re_offset+144) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
+        dl_ch += 288;
       }
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -452,10 +452,12 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 	   (int16_t*) &dl_ch_estimates[aarx][ch_offset],
 	   (int16_t*) dl_ch_estimates_time[aarx],
 	   1);
-}
-}
+    }
+  }
+
   if (dmrss == 2)
     UEscopeCopy(ue, pbchDlChEstimateTime, (void*)dl_ch_estimates_time, sizeof(struct complex16), ue->frame_parms.nb_antennas_rx, idftsizeidx);
+
   return(0);
 }
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 8bdd83087a5fb200e290e63be8cad53dbfd26bcf..ebe077d635d50e94e768089a2bdeef79f9e2d810 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -104,11 +104,9 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr, uint16_t N_RB_DL) {
           dlsch->harq_processes[i]->c[r] = NULL;
           free16(dlsch->harq_processes[i]->d[r],5*8448);
           dlsch->harq_processes[i]->d[r] = NULL;
-          nrLDPC_free_mem(dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]);
         }
         free16(dlsch->harq_processes[i]->c,a_segments);
         free16(dlsch->harq_processes[i]->d,a_segments);
-        free16(dlsch->harq_processes[i]->p_nrLDPC_procBuf,a_segments);
 
         free16(dlsch->harq_processes[i],sizeof(NR_DL_UE_HARQ_t));
         dlsch->harq_processes[i] = NULL;
@@ -161,9 +159,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
 
         dlsch->harq_processes[i]->c = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *));
         dlsch->harq_processes[i]->d = (int16_t **)malloc16(a_segments*sizeof(int16_t *));
-        dlsch->harq_processes[i]->p_nrLDPC_procBuf = (t_nrLDPC_procBuf **)malloc16(a_segments*sizeof(t_nrLDPC_procBuf *));
         for (int r=0; r<a_segments; r++) {
-          dlsch->harq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem();
           dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(1056);
           dlsch->harq_processes[i]->d[r] = (int16_t *)malloc16(5*8448*sizeof(int16_t));
           if (dlsch->harq_processes[i]->c[r])
@@ -301,132 +297,128 @@ void nr_processDLSegment(void* arg) {
   t_nrLDPC_time_stats procTime = {0};
   t_nrLDPC_time_stats* p_procTime     = &procTime ;
 
-  t_nrLDPC_procBuf **p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf;
-
-
-    int16_t w[5*8448];
-    memset(w,0,(5*8448)*sizeof(short));
-
-    start_meas(&rdata->ts_deinterleave);
-
-    //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
-    nr_deinterleaving_ldpc(E,
-                           Qm,
-                           w, // [hna] w is e
-                           dlsch_llr+r_offset);
-    //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT);
-    stop_meas(&rdata->ts_deinterleave);
-
-    start_meas(&rdata->ts_rate_unmatch);
-    /* LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
-          harq_pid,r, G,E,harq_process->F,
-          Kr*3,
-          harq_process->TBS,
-          Qm,
-          harq_process->nb_rb,
-          harq_process->Nl,
-          harq_process->rvidx,
-          harq_process->round); */
-    //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN);
-
-    if (nr_rate_matching_ldpc_rx(Ilbrm,
-                                 Tbslbrm,
-                                 p_decoderParms->BG,
-                                 p_decoderParms->Z,
-                                 harq_process->d[r],
-                                 w,
-                                 harq_process->C,
-                                 harq_process->rvidx,
-                                 (harq_process->first_rx==1)?1:0,
-                                 E,
-                                 harq_process->F,
-                                 Kr-harq_process->F-2*(p_decoderParms->Z))==-1) {
-      //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
-      stop_meas(&rdata->ts_rate_unmatch);
-      LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
-      rdata->decodeIterations = dlsch->max_ldpc_iterations + 1;
-      return;
-    }
+  int16_t w[5*8448];
+  memset(w,0,(5*8448)*sizeof(short));
+
+  start_meas(&rdata->ts_deinterleave);
+
+  //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
+  nr_deinterleaving_ldpc(E,
+                         Qm,
+                         w, // [hna] w is e
+                         dlsch_llr+r_offset);
+  //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT);
+  stop_meas(&rdata->ts_deinterleave);
+
+  start_meas(&rdata->ts_rate_unmatch);
+  /* LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
+        harq_pid,r, G,E,harq_process->F,
+        Kr*3,
+        harq_process->TBS,
+        Qm,
+        harq_process->nb_rb,
+        harq_process->Nl,
+        harq_process->rvidx,
+        harq_process->round); */
+  //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN);
+
+  if (nr_rate_matching_ldpc_rx(Ilbrm,
+                               Tbslbrm,
+                               p_decoderParms->BG,
+                               p_decoderParms->Z,
+                               harq_process->d[r],
+                               w,
+                               harq_process->C,
+                               harq_process->rvidx,
+                               (harq_process->first_rx==1)?1:0,
+                               E,
+                               harq_process->F,
+                               Kr-harq_process->F-2*(p_decoderParms->Z))==-1) {
+    //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
     stop_meas(&rdata->ts_rate_unmatch);
+    LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
+    rdata->decodeIterations = dlsch->max_ldpc_iterations + 1;
+    return;
+  }
+  stop_meas(&rdata->ts_rate_unmatch);
 
-    r_offset += E;
-
-    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
-      LOG_D(PHY,"decoder input(segment %u) :",r);
+  r_offset += E;
 
-      for (int i=0; i<E; i++)
-        LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
+    LOG_D(PHY,"decoder input(segment %u) :",r);
 
-      LOG_D(PHY,"\n");
-    }
+    for (int i=0; i<E; i++)
+      LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
 
-    memset(harq_process->c[r],0,Kr_bytes);
+    LOG_D(PHY,"\n");
+  }
 
-    if (harq_process->C == 1) {
-      if (A > NR_MAX_PDSCH_TBS)
-        crc_type = CRC24_A;
-      else
-        crc_type = CRC16;
+  memset(harq_process->c[r],0,Kr_bytes);
 
-      length_dec = harq_process->B;
-    } else {
-      crc_type = CRC24_B;
-      length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
-    }
+  if (harq_process->C == 1) {
+    if (A > NR_MAX_PDSCH_TBS)
+      crc_type = CRC24_A;
+    else
+      crc_type = CRC16;
 
-    {
-      start_meas(&rdata->ts_ldpc_decode);
-      //set first 2*Z_c bits to zeros
-      memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
-      //set Filler bits
-      memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
-      //Move coded bits before filler bits
-      memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
-      //skip filler bits
-      memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
-
-      //Saturate coded bits before decoding into 8 bits values
-      for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1;  i+=2, j++) {
-        pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
-      }
+    length_dec = harq_process->B;
+  } else {
+    crc_type = CRC24_B;
+    length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
+  }
 
-      //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
-      p_decoderParms->block_length=length_dec;
-      nrLDPC_initcall(p_decoderParms, (int8_t*)&pl[0], llrProcBuf);
-      no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,
-                                         (int8_t *)&pl[0],
-                                         llrProcBuf,
-                                         p_nrLDPC_procBuf[r],
-                                         p_procTime);
-      //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
-
-      // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
-      if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
-        LOG_D(PHY,"Segment %u CRC OK\n",r);
-
-        if (r==0) {
-          for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
-        }
+  {
+    start_meas(&rdata->ts_ldpc_decode);
+    //set first 2*Z_c bits to zeros
+    memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
+    //set Filler bits
+    memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
+    //Move coded bits before filler bits
+    memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
+    //skip filler bits
+    memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
+
+    //Saturate coded bits before decoding into 8 bits values
+    for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1;  i+=2, j++) {
+      pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
+    }
 
-        //Temporary hack
-        no_iteration_ldpc = dlsch->max_ldpc_iterations;
-        rdata->decodeIterations = no_iteration_ldpc;
-      } else {
-        LOG_D(PHY,"CRC NOT OK\n");
+    //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
+    p_decoderParms->block_length=length_dec;
+    nrLDPC_initcall(p_decoderParms, (int8_t*)&pl[0], llrProcBuf);
+    no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,
+                                       (int8_t *)&pl[0],
+                                       llrProcBuf,
+                                       p_procTime);
+    //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
+
+    // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
+    if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
+      LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r);
+
+      if (r==0) {
+        for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
       }
 
-      nb_total_decod++;
+      //Temporary hack
+      no_iteration_ldpc = dlsch->max_ldpc_iterations;
+      rdata->decodeIterations = no_iteration_ldpc;
+    } else {
+      LOG_D(PHY,"CRC NOT OK\n\033[0m");
+    }
 
-      if (no_iteration_ldpc > dlsch->max_ldpc_iterations) {
-        nb_error_decod++;
-      }
+    nb_total_decod++;
 
-      for (int m=0; m < Kr>>3; m ++) {
-        harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
-      }
+    if (no_iteration_ldpc > dlsch->max_ldpc_iterations) {
+      nb_error_decod++;
+    }
 
-      stop_meas(&rdata->ts_ldpc_decode);
+    for (int m=0; m < Kr>>3; m ++) {
+      harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
     }
+
+    stop_meas(&rdata->ts_ldpc_decode);
+  }
 }
 
 uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index fa02e8a2a0ab361c60628e412c342a3bf48c5b7c..30f87709c453244ef4b4c6979b96685cbeae80a6 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -146,23 +146,26 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
 
     start_meas(&ue->dlsch_channel_estimation_stats);
   // computing channel estimation for selected best ssb
-    const int estimateSz=7*2*frame_parms->ofdm_symbol_size;
+    const int estimateSz = frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size;
     __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz];
-    __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz];
+    __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size];
+
     for(int i=pbch_initial_symbol; i<pbch_initial_symbol+3;i++)
       nr_pbch_channel_estimation(ue,estimateSz, dl_ch_estimates, dl_ch_estimates_time, 
                                  proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf);
+
     stop_meas(&ue->dlsch_channel_estimation_stats);
     fapiPbch_t result;
     ret = nr_rx_pbch(ue,
                      proc,
-                     estimateSz, dl_ch_estimates,
-		     ue->pbch_vars[0],
+                     estimateSz,
+                     dl_ch_estimates,
+                     ue->pbch_vars[0],
                      frame_parms,
                      0,
                      temp_ptr->i_ssb,
                      SISO,
-		     &result);
+                     &result);
 
     temp_ptr=temp_ptr->next_ssb;
   }
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
index f76119250f5164a8c2859ce0a7bc926fe9fc283a..e479271a5c7ed2e5b80791ee5a3492e29c924d67 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
@@ -196,8 +196,6 @@ typedef struct {
   uint8_t rvidx;
   /// MIMO mode for this DLSCH
   MIMO_nrmode_t mimo_mode;
-  /// LDPC processing buffers
-  t_nrLDPC_procBuf **p_nrLDPC_procBuf;
   /// Number of code segments 
   uint32_t C;
   /// Number of bits in code segments
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 0a7d2b9657c8decc8ac23d9cbcf776f3a5a6fcdf..100101c38e435009ab9ece0d3344a9f324bee0bd 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -280,8 +280,6 @@ typedef struct {
   uint32_t C;
   /// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2)
   int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS];
-  /// LDPC processing buffer
-  t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_ULSCH_SEGMENTS];
   /// LDPC lifting size (38.212 V15.4.0 table 5.3.2-1)
   uint32_t Z;
   /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1)
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index 9af508b0e4180dbdc6625f94bbb291fa595b3708..bac3fa33c994c90dc6b95fe1201af8415a56f191 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -36,10 +36,11 @@
 #include "fapi_nr_ue_l1.h"
 #include "harq_nr.h"
 //#include "PHY/phy_vars_nr_ue.h"
-
+#include "openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h"
 #include "PHY/defs_nr_UE.h"
 #include "PHY/impl_defs_nr.h"
 #include "utils.h"
+#include "openair2/PHY_INTERFACE/queue_t.h"
 
 extern PHY_VARS_NR_UE ***PHY_vars_UE_g;
 
@@ -49,8 +50,64 @@ queue_t nr_rx_ind_queue;
 queue_t nr_crc_ind_queue;
 queue_t nr_uci_ind_queue;
 
-int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response) {
+static void fill_uci_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4,
+                           fapi_nr_ul_config_pucch_pdu *pucch_pdu)
+{
+  memset(pdu_2_3_4, 0, sizeof(*pdu_2_3_4));
+  pdu_2_3_4->handle = 0;
+  pdu_2_3_4->rnti = pucch_pdu->rnti;
+  pdu_2_3_4->pucch_format = 2;
+  pdu_2_3_4->ul_cqi = 255;
+  pdu_2_3_4->timing_advance = 0;
+  pdu_2_3_4->rssi = 0;
+  // TODO: Eventually check 38.212:Sect.631 to know when to use csi_part2, for now only using csi_part1
+  pdu_2_3_4->pduBitmap = 4;
+  pdu_2_3_4->csi_part1.csi_part1_bit_len = pucch_pdu->nr_of_symbols;
+  int csi_part1_byte_len = (int)((pdu_2_3_4->csi_part1.csi_part1_bit_len / 8) + 1);
+  AssertFatal(!pdu_2_3_4->csi_part1.csi_part1_payload, "pdu_2_3_4->csi_part1.csi_part1_payload != NULL\n");
+  pdu_2_3_4->csi_part1.csi_part1_payload = CALLOC(csi_part1_byte_len,
+                                                  sizeof(pdu_2_3_4->csi_part1.csi_part1_payload));
+  for (int k = 0; k < csi_part1_byte_len; k++)
+  {
+    pdu_2_3_4->csi_part1.csi_part1_payload[k] = (pucch_pdu->payload >> (k * 8)) & 0xff;
+  }
+  pdu_2_3_4->csi_part1.csi_part1_crc = 0;
+}
+
+static void free_uci_inds(nfapi_nr_uci_indication_t *uci_ind)
+{
+    for (int k = 0; k < uci_ind->num_ucis; k++)
+    {
+        if (uci_ind->uci_list[k].pdu_type == NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE)
+        {
+            nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[k].pucch_pdu_format_0_1;
+            free(pdu_0_1->sr);
+            pdu_0_1->sr = NULL;
+            if (pdu_0_1->harq)
+            {
+                free(pdu_0_1->harq->harq_list);
+                pdu_0_1->harq->harq_list = NULL;
+            }
+            free(pdu_0_1->harq);
+            pdu_0_1->harq = NULL;
+        }
+        if (uci_ind->uci_list[k].pdu_type == NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE)
+        {
+            nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4 = &uci_ind->uci_list[k].pucch_pdu_format_2_3_4;
+            free(pdu_2_3_4->sr.sr_payload);
+            pdu_2_3_4->sr.sr_payload = NULL;
+            free(pdu_2_3_4->harq.harq_payload);
+            pdu_2_3_4->harq.harq_payload = NULL;
+        }
+    }
+    free(uci_ind->uci_list);
+    uci_ind->uci_list = NULL;
+    free(uci_ind);
+    uci_ind = NULL;
+}
 
+int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response) {
+  NR_UE_MAC_INST_t *mac = get_mac_inst(0);
   if(scheduled_response != NULL)
   {
     if (scheduled_response->ul_config != NULL)
@@ -60,7 +117,7 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response
                   "Too many ul_config pdus %d", ul_config->number_pdus);
       for (int i = 0; i < ul_config->number_pdus; ++i)
       {
-        LOG_I(PHY, "In %s: processing type %d PDU of %d total UL PDUs (ul_config %p) \n",
+        LOG_D(NR_PHY, "In %s: processing type %d PDU of %d total UL PDUs (ul_config %p) \n",
               __FUNCTION__, ul_config->ul_config_list[i].pdu_type, ul_config->number_pdus, ul_config);
 
         uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type;
@@ -95,10 +152,6 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response
                    abstracting L1. */
                 rx_ind->pdu_list[j].timing_advance = 31;
                 rx_ind->pdu_list[j].ul_cqi = 255;
-                char buffer[1024];
-                hexdump(rx_ind->pdu_list[j].pdu, rx_ind->pdu_list[j].pdu_length, buffer, sizeof(buffer));
-                LOG_D(NR_MAC, "Hexdump of pdu %s before queuing rx_ind\n",
-                      buffer);
               }
 
               crc_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION;
@@ -118,6 +171,11 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response
                 crc_ind->crc_list[j].tb_crc_status = 0;
                 crc_ind->crc_list[j].timing_advance = 31;
                 crc_ind->crc_list[j].ul_cqi = 255;
+                AssertFatal(mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot == -1,
+                            "We did not send an active CRC when we should have!\n");
+                mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot = NFAPI_SFNSLOT2HEX(crc_ind->sfn, crc_ind->slot);
+                LOG_D(NR_MAC, "This is sched sfn/sl [%d %d] and crc sfn/sl [%d %d] with mcs_index in ul_cqi -> %d\n",
+                      scheduled_response->frame, scheduled_response->slot, crc_ind->sfn, crc_ind->slot,pusch_config_pdu->mcs_index);
               }
 
               if (!put_queue(&nr_rx_ind_queue, rx_ind))
@@ -150,28 +208,7 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response
             break;
           }
 
-          default:
-            LOG_I(NR_MAC, "Unknown ul_config->pdu_type %d\n", pdu_type);
-          break;
-        }
-      }
-      scheduled_response->ul_config->number_pdus = 0;
-    }
-
-    if (scheduled_response->dl_config != NULL)
-    {
-      fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config;
-      AssertFatal(dl_config->number_pdus < sizeof(dl_config->dl_config_list) / sizeof(dl_config->dl_config_list[0]),
-                  "Too many dl_config pdus %d", dl_config->number_pdus);
-      for (int i = 0; i < dl_config->number_pdus; ++i)
-      {
-        LOG_D(PHY, "In %s: processing %s PDU of %d total DL PDUs (dl_config %p) \n",
-              __FUNCTION__, dl_pdu_type[dl_config->dl_config_list[i].pdu_type - 1], dl_config->number_pdus, dl_config);
-
-        uint8_t pdu_type = dl_config->dl_config_list[i].pdu_type;
-        switch (pdu_type)
-        {
-          case (FAPI_NR_DL_CONFIG_TYPE_DLSCH):
+          case FAPI_NR_UL_CONFIG_TYPE_PUCCH:
           {
             nfapi_nr_uci_indication_t *uci_ind = CALLOC(1, sizeof(*uci_ind));
             uci_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION;
@@ -181,35 +218,70 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response
             uci_ind->uci_list = CALLOC(uci_ind->num_ucis, sizeof(*uci_ind->uci_list));
             for (int j = 0; j < uci_ind->num_ucis; j++)
             {
-              nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[j].pucch_pdu_format_0_1;
-              uci_ind->uci_list[j].pdu_type = NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE;
-              uci_ind->uci_list[j].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_0_1_t);
-              memset(pdu_0_1, 0, sizeof(*pdu_0_1));
-              pdu_0_1->handle = 0;
-              pdu_0_1->rnti = dl_config->dl_config_list[i].dlsch_config_pdu.rnti;
-              pdu_0_1->pucch_format = 1;
-              pdu_0_1->ul_cqi = 255;
-              pdu_0_1->timing_advance = 0;
-              pdu_0_1->rssi = 0;
+              LOG_D(NR_MAC, "ul_config->ul_config_list[%d].pucch_config_pdu.n_bit = %d\n", i, ul_config->ul_config_list[i].pucch_config_pdu.n_bit);
+              if (ul_config->ul_config_list[i].pucch_config_pdu.n_bit > 3 && mac->nr_ue_emul_l1.num_csi_reports > 0)
+              {
+                uci_ind->uci_list[j].pdu_type = NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE;
+                uci_ind->uci_list[j].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_2_3_4_t);
+                nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4 = &uci_ind->uci_list[j].pucch_pdu_format_2_3_4;
+                fill_uci_2_3_4(pdu_2_3_4, &ul_config->ul_config_list[i].pucch_config_pdu);
+              }
+              else
+              {
+                nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[j].pucch_pdu_format_0_1;
+                uci_ind->uci_list[j].pdu_type = NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE;
+                uci_ind->uci_list[j].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_0_1_t);
+                memset(pdu_0_1, 0, sizeof(*pdu_0_1));
+                pdu_0_1->handle = 0;
+                pdu_0_1->rnti = ul_config->ul_config_list[i].pucch_config_pdu.rnti;
+                pdu_0_1->pucch_format = 1;
+                pdu_0_1->ul_cqi = 255;
+                pdu_0_1->timing_advance = 0;
+                pdu_0_1->rssi = 0;
+
+                if (mac->nr_ue_emul_l1.num_harqs > 0) {
+                  int harq_index = 0;
+                  pdu_0_1->pduBitmap = 2; // (value->pduBitmap >> 1) & 0x01) == HARQ and (value->pduBitmap) & 0x01) == SR
+                  pdu_0_1->harq = CALLOC(1, sizeof(*pdu_0_1->harq));
+                  pdu_0_1->harq->num_harq = mac->nr_ue_emul_l1.num_harqs;
+                  pdu_0_1->harq->harq_confidence_level = 0;
+                  pdu_0_1->harq->harq_list = CALLOC(pdu_0_1->harq->num_harq, sizeof(*pdu_0_1->harq->harq_list));
+                  int harq_pid = -1;
+                  for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++)
+                  {
+                    if (mac->nr_ue_emul_l1.harq[k].active &&
+                        mac->nr_ue_emul_l1.harq[k].active_dl_harq_sfn == uci_ind->sfn &&
+                        mac->nr_ue_emul_l1.harq[k].active_dl_harq_slot == uci_ind->slot)
+                    {
+                      mac->nr_ue_emul_l1.harq[k].active = false;
+                      harq_pid = k;
+                      AssertFatal(harq_index < pdu_0_1->harq->num_harq, "Invalid harq_index %d\n", harq_index);
+                      pdu_0_1->harq->harq_list[harq_index].harq_value = !mac->dl_harq_info[k].ack;
+                      harq_index++;
+                    }
+                  }
+                  AssertFatal(harq_pid != -1, "No active harq_pid, sfn_slot = %u.%u", uci_ind->sfn, uci_ind->slot);
+                }
+              }
             }
 
-            LOG_I(NR_PHY, "In %s: Filled queue uci_ind which was filled by dlconfig.\n"
-                       "uci_num %d, SFN/SLOT: [%d, %d]\n",
-                          __FUNCTION__, uci_ind->num_ucis, uci_ind->sfn, uci_ind->slot);
-
-            if (!put_queue(&nr_uci_ind_queue, uci_ind))
-            {
-              LOG_E(NR_MAC, "Put_queue failed for uci_ind\n");
-              free(uci_ind->uci_list);
-              free(uci_ind);
-            }
+            LOG_D(NR_PHY, "Sending UCI with %d PDUs in sfn.slot %d/%d\n",
+                  uci_ind->num_ucis, uci_ind->sfn, uci_ind->slot);
+            NR_UL_IND_t ul_info = {
+                .uci_ind = *uci_ind,
+            };
+            send_nsa_standalone_msg(&ul_info, uci_ind->header.message_id);
+            free_uci_inds(uci_ind);
             break;
           }
+
+          default:
+            LOG_W(NR_MAC, "Unknown ul_config->pdu_type %d\n", pdu_type);
+          break;
         }
       }
-      dl_config->number_pdus = 0;
+      scheduled_response->ul_config->number_pdus = 0;
     }
-
   }
   return 0;
 }
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index c077440c7c9d96852fb4ce85698bf64b188d8a9f..7e7581ecc3dc5c3ba965bee84b5123a067320815 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -1404,9 +1404,11 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
   if (slot_ssb) {
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_IN);
     LOG_D(PHY," ------  PBCH ChannelComp/LLR: frame.slot %d.%d ------  \n", frame_rx%1024, nr_slot_rx);
-    const int estimateSz=7*2*sizeof(int)*fp->ofdm_symbol_size;
+
+    const int estimateSz = fp->symbols_per_slot * fp->ofdm_symbol_size;
     __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[fp->nb_antennas_rx][estimateSz];
-    __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][estimateSz];
+    __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][fp->ofdm_symbol_size];
+
     for (int i=1; i<4; i++) {
 
       nr_slot_fep(ue,
@@ -1414,7 +1416,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
                   (ue->symbol_offset+i)%(fp->symbols_per_slot),
                   nr_slot_rx);
 
-
       start_meas(&ue->dlsch_channel_estimation_stats);
       nr_pbch_channel_estimation(ue, estimateSz, dl_ch_estimates, dl_ch_estimates_time,proc,gNB_id,nr_slot_rx,(ue->symbol_offset+i)%(fp->symbols_per_slot),i-1,(fp->ssb_index)&7,fp->half_frame_bit);
       stop_meas(&ue->dlsch_channel_estimation_stats);
@@ -1432,7 +1433,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
         nr_adjust_synch_ue(fp,
                            ue,
                            gNB_id,
-			   estimateSz, dl_ch_estimates_time,
+                           fp->ofdm_symbol_size,
+                           dl_ch_estimates_time,
                            frame_rx,
                            nr_slot_rx,
                            0,
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs28.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs28.csv
new file mode 100644
index 0000000000000000000000000000000000000000..11771acc8719db9304be2e119793bb764a9adec2
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs28.csv
@@ -0,0 +1,21 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+16.000000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0
+16.100000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0
+16.200000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0
+16.300000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0
+16.400000;27;15840;0.704000;4999;5002;0;0;0;0;0;0;0
+16.500000;27;15840;0.704000;4981;5002;0;0;0;0;0;0;0
+16.600000;27;15840;0.704000;4887;5002;0;0;0;0;0;0;0
+16.700000;27;15840;0.704000;4688;5002;0;0;0;0;0;0;0
+16.800000;27;15840;0.704000;4176;5002;0;0;0;0;0;0;0
+16.900000;27;15840;0.704000;3340;5002;0;0;0;0;0;0;0
+17.000000;27;15840;0.704000;2386;5002;0;0;0;0;0;0;0
+17.100000;27;15840;0.704000;1510;5002;0;0;0;0;0;0;0
+17.200000;27;15840;0.704000;1000;5552;0;0;0;0;0;0;0
+17.300000;27;15840;0.704000;926;10000;0;0;0;0;0;0;0
+17.400000;27;15840;0.704000;516;10000;0;0;0;0;0;0;0
+17.500000;27;15840;0.704000;287;10000;0;0;0;0;0;0;0
+17.600000;27;15840;0.704000;198;10000;0;0;0;0;0;0;0
+17.700000;27;15840;0.704000;135;10000;0;0;0;0;0;0;0
+17.800000;27;15840;0.704000;102;10000;0;0;0;0;0;0;0
+17.900000;27;15840;0.704000;94;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs0_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs0_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..ae7824fe1e87e72f27f905f1e26522af02556860
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs0_awgn_5G.csv
@@ -0,0 +1,62 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-4;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.9;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.8;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.7;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.6;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.5;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.4;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.3;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.2;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3.1;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-3;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.9;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.8;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.7;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.6;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.5;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.4;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.3;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.2;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2.1;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-2;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0
+-1.9;0;1864;0.2344;1499;1500;0;0;0;0;0;0;0
+-1.8;0;1864;0.2344;1499;1500;0;0;0;0;0;0;0
+-1.7;0;1864;0.2344;1498;1500;0;0;0;0;0;0;0
+-1.6;0;1864;0.2344;1498;1500;0;0;0;0;0;0;0
+-1.5;0;1864;0.2344;1497;1500;0;0;0;0;0;0;0
+-1.4;0;1864;0.2344;1445;1500;0;0;0;0;0;0;0
+-1.3;0;1864;0.2344;1394;1500;0;0;0;0;0;0;0
+-1.2;0;1864;0.2344;1346;1500;0;0;0;0;0;0;0
+-1.1;0;1864;0.2344;1299;1500;0;0;0;0;0;0;0
+-1;0;1864;0.2344;1253;1500;0;0;0;0;0;0;0
+-0.9;0;1864;0.2344;980;1500;0;0;0;0;0;0;0
+-0.8;0;1864;0.2344;767;1500;0;0;0;0;0;0;0
+-0.7;0;1864;0.2344;600;1500;0;0;0;0;0;0;0
+-0.6;0;1864;0.2344;469;1500;0;0;0;0;0;0;0
+-0.5;0;1864;0.2344;367;1500;0;0;0;0;0;0;0
+-0.4;0;1864;0.2344;215;1500;0;0;0;0;0;0;0
+-0.3;0;1864;0.2344;126;1500;0;0;0;0;0;0;0
+-0.2;0;1864;0.2344;74;1500;0;0;0;0;0;0;0
+-0.1;0;1864;0.2344;43;1500;0;0;0;0;0;0;0
+0;0;1864;0.2344;26;1500;0;0;0;0;0;0;0
+0.1;0;1864;0.2344;12;1500;0;0;0;0;0;0;0
+0.2;0;1864;0.2344;5;1500;0;0;0;0;0;0;0
+0.3;0;1864;0.2344;2;1500;0;0;0;0;0;0;0
+0.4;0;1864;0.2344;1;1500;0;0;0;0;0;0;0
+0.5;0;1864;0.2344;1;1500;0;0;0;0;0;0;0
+0.6;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+0.7;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+0.8;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+0.9;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.1;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.2;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.3;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.4;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.5;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.6;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.7;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.8;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+1.9;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
+2;0;1864;0.2344;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs10_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs10_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..8d1ff3ebb68575f37ece9529246fd548540b3d99
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs10_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+3;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.1;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.2;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.3;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.4;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.5;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.6;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.7;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.8;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+3.9;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.1;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.2;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.3;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.4;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.5;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.6;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.7;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.8;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+4.9;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+5;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0
+5.1;10;10504;1.3281;1454;1500;0;0;0;0;0;0;0
+5.2;10;10504;1.3281;1410;1500;0;0;0;0;0;0;0
+5.3;10;10504;1.3281;1367;1500;0;0;0;0;0;0;0
+5.4;10;10504;1.3281;1325;1500;0;0;0;0;0;0;0
+5.5;10;10504;1.3281;1285;1500;0;0;0;0;0;0;0
+5.6;10;10504;1.3281;1026;1500;0;0;0;0;0;0;0
+5.7;10;10504;1.3281;819;1500;0;0;0;0;0;0;0
+5.8;10;10504;1.3281;654;1500;0;0;0;0;0;0;0
+5.9;10;10504;1.3281;522;1500;0;0;0;0;0;0;0
+6;10;10504;1.3281;417;1500;0;0;0;0;0;0;0
+6.1;10;10504;1.3281;309;1500;0;0;0;0;0;0;0
+6.2;10;10504;1.3281;229;1500;0;0;0;0;0;0;0
+6.3;10;10504;1.3281;169;1500;0;0;0;0;0;0;0
+6.4;10;10504;1.3281;125;1500;0;0;0;0;0;0;0
+6.5;10;10504;1.3281;93;1500;0;0;0;0;0;0;0
+6.6;10;10504;1.3281;64;1500;0;0;0;0;0;0;0
+6.7;10;10504;1.3281;44;1500;0;0;0;0;0;0;0
+6.8;10;10504;1.3281;31;1500;0;0;0;0;0;0;0
+6.9;10;10504;1.3281;21;1500;0;0;0;0;0;0;0
+7;10;10504;1.3281;15;1500;0;0;0;0;0;0;0
+7.1;10;10504;1.3281;7;1500;0;0;0;0;0;0;0
+7.2;10;10504;1.3281;3;1500;0;0;0;0;0;0;0
+7.3;10;10504;1.3281;1;1500;0;0;0;0;0;0;0
+7.4;10;10504;1.3281;1;1500;0;0;0;0;0;0;0
+7.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+7.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+7.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+7.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+7.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.1;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.2;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.3;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.4;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+8.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.1;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.2;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.3;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.4;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+9.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.1;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.2;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.3;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.4;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+10.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.1;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.2;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.3;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.4;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+11.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
+12;10;10504;1.3281;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs11_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs11_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..e581ab2ff169116050eabc4fbcaa5d0f5e695f6b
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs11_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+3;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.1;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.2;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.3;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.4;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.5;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.6;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.7;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.8;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+3.9;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.1;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.2;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.3;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.4;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.5;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.6;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.7;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.8;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+4.9;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+5;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+5.1;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+5.2;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+5.3;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+5.4;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+5.5;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0
+5.6;11;11784;1.4766;1494;1500;0;0;0;0;0;0;0
+5.7;11;11784;1.4766;1489;1500;0;0;0;0;0;0;0
+5.8;11;11784;1.4766;1483;1500;0;0;0;0;0;0;0
+5.9;11;11784;1.4766;1477;1500;0;0;0;0;0;0;0
+6;11;11784;1.4766;1472;1500;0;0;0;0;0;0;0
+6.1;11;11784;1.4766;1367;1500;0;0;0;0;0;0;0
+6.2;11;11784;1.4766;1269;1500;0;0;0;0;0;0;0
+6.3;11;11784;1.4766;1179;1500;0;0;0;0;0;0;0
+6.4;11;11784;1.4766;1095;1500;0;0;0;0;0;0;0
+6.5;11;11784;1.4766;1016;1500;0;0;0;0;0;0;0
+6.6;11;11784;1.4766;762;1500;0;0;0;0;0;0;0
+6.7;11;11784;1.4766;571;1500;0;0;0;0;0;0;0
+6.8;11;11784;1.4766;428;1500;0;0;0;0;0;0;0
+6.9;11;11784;1.4766;320;1500;0;0;0;0;0;0;0
+7;11;11784;1.4766;240;1500;0;0;0;0;0;0;0
+7.1;11;11784;1.4766;169;1500;0;0;0;0;0;0;0
+7.2;11;11784;1.4766;119;1500;0;0;0;0;0;0;0
+7.3;11;11784;1.4766;83;1500;0;0;0;0;0;0;0
+7.4;11;11784;1.4766;59;1500;0;0;0;0;0;0;0
+7.5;11;11784;1.4766;41;1500;0;0;0;0;0;0;0
+7.6;11;11784;1.4766;24;1500;0;0;0;0;0;0;0
+7.7;11;11784;1.4766;14;1500;0;0;0;0;0;0;0
+7.8;11;11784;1.4766;8;1500;0;0;0;0;0;0;0
+7.9;11;11784;1.4766;5;1500;0;0;0;0;0;0;0
+8;11;11784;1.4766;3;1500;0;0;0;0;0;0;0
+8.1;11;11784;1.4766;1;1500;0;0;0;0;0;0;0
+8.2;11;11784;1.4766;1;1500;0;0;0;0;0;0;0
+8.3;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+8.4;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+8.5;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+8.6;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+8.7;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+8.8;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+8.9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.1;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.2;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.3;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.4;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.5;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.6;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.7;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.8;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+9.9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.1;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.2;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.3;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.4;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.5;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.6;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.7;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.8;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+10.9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.1;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.2;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.3;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.4;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.5;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.6;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.7;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.8;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+11.9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
+12;11;11784;1.4766;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs12_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs12_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..08825dec27894823859364fb91e9b1f9cc563f22
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs12_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.1;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.2;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.6;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.7;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.8;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+3.9;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.1;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.2;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.6;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.7;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.8;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+4.9;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.1;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.2;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.6;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.7;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.8;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+5.9;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+6;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+6.1;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+6.2;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+6.3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+6.4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+6.5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0
+6.6;12;13576;1.6953;1498;1500;0;0;0;0;0;0;0
+6.7;12;13576;1.6953;1495;1500;0;0;0;0;0;0;0
+6.8;12;13576;1.6953;1493;1500;0;0;0;0;0;0;0
+6.9;12;13576;1.6953;1491;1500;0;0;0;0;0;0;0
+7;12;13576;1.6953;1488;1500;0;0;0;0;0;0;0
+7.1;12;13576;1.6953;1357;1500;0;0;0;0;0;0;0
+7.2;12;13576;1.6953;1238;1500;0;0;0;0;0;0;0
+7.3;12;13576;1.6953;1129;1500;0;0;0;0;0;0;0
+7.4;12;13576;1.6953;1029;1500;0;0;0;0;0;0;0
+7.5;12;13576;1.6953;939;1500;0;0;0;0;0;0;0
+7.6;12;13576;1.6953;632;1500;0;0;0;0;0;0;0
+7.7;12;13576;1.6953;425;1500;0;0;0;0;0;0;0
+7.8;12;13576;1.6953;286;1500;0;0;0;0;0;0;0
+7.9;12;13576;1.6953;193;1500;0;0;0;0;0;0;0
+8;12;13576;1.6953;130;1500;0;0;0;0;0;0;0
+8.1;12;13576;1.6953;91;1500;0;0;0;0;0;0;0
+8.2;12;13576;1.6953;64;1500;0;0;0;0;0;0;0
+8.3;12;13576;1.6953;45;1500;0;0;0;0;0;0;0
+8.4;12;13576;1.6953;32;1500;0;0;0;0;0;0;0
+8.5;12;13576;1.6953;23;1500;0;0;0;0;0;0;0
+8.6;12;13576;1.6953;12;1500;0;0;0;0;0;0;0
+8.7;12;13576;1.6953;6;1500;0;0;0;0;0;0;0
+8.8;12;13576;1.6953;3;1500;0;0;0;0;0;0;0
+8.9;12;13576;1.6953;2;1500;0;0;0;0;0;0;0
+9;12;13576;1.6953;1;1500;0;0;0;0;0;0;0
+9.1;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+9.2;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+9.3;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+9.4;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+9.5;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+9.6;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+9.7;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+9.8;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+9.9;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.1;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.2;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.3;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.4;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.5;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.6;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.7;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.8;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+10.9;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.1;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.2;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.3;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.4;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.5;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.6;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.7;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.8;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+11.9;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
+12;12;13576;1.6953;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs13_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs13_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..ef85933aafabe53c3cc20a2052f35259ec8923de
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs13_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+7;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0
+7.1;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0
+7.2;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0
+7.3;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0
+7.4;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0
+7.5;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0
+7.6;13;15112;1.9141;1444;1500;0;0;0;0;0;0;0
+7.7;13;15112;1.9141;1391;1500;0;0;0;0;0;0;0
+7.8;13;15112;1.9141;1340;1500;0;0;0;0;0;0;0
+7.9;13;15112;1.9141;1290;1500;0;0;0;0;0;0;0
+8;13;15112;1.9141;1243;1500;0;0;0;0;0;0;0
+8.1;13;15112;1.9141;878;1500;0;0;0;0;0;0;0
+8.2;13;15112;1.9141;620;1500;0;0;0;0;0;0;0
+8.3;13;15112;1.9141;438;1500;0;0;0;0;0;0;0
+8.4;13;15112;1.9141;309;1500;0;0;0;0;0;0;0
+8.5;13;15112;1.9141;219;1500;0;0;0;0;0;0;0
+8.6;13;15112;1.9141;173;1500;0;0;0;0;0;0;0
+8.7;13;15112;1.9141;137;1500;0;0;0;0;0;0;0
+8.8;13;15112;1.9141;109;1500;0;0;0;0;0;0;0
+8.9;13;15112;1.9141;86;1500;0;0;0;0;0;0;0
+9;13;15112;1.9141;68;1500;0;0;0;0;0;0;0
+9.1;13;15112;1.9141;47;1500;0;0;0;0;0;0;0
+9.2;13;15112;1.9141;33;1500;0;0;0;0;0;0;0
+9.3;13;15112;1.9141;23;1500;0;0;0;0;0;0;0
+9.4;13;15112;1.9141;16;1500;0;0;0;0;0;0;0
+9.5;13;15112;1.9141;11;1500;0;0;0;0;0;0;0
+9.6;13;15112;1.9141;5;1500;0;0;0;0;0;0;0
+9.7;13;15112;1.9141;2;1500;0;0;0;0;0;0;0
+9.8;13;15112;1.9141;1;1500;0;0;0;0;0;0;0
+9.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.1;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.2;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.3;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.4;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.5;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.6;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.7;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.8;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+10.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.1;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.2;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.3;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.4;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.5;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.6;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.7;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.8;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+11.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.1;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.2;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.3;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.4;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.5;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.6;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.7;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.8;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+12.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.1;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.2;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.3;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.4;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.5;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.6;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.7;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.8;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+13.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
+14;13;15112;1.9141;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs14_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs14_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..06671050112212775aecb3d894ae92345036e94e
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs14_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+7;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.1;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.2;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.3;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.4;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.5;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.6;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.7;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.8;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+7.9;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+8;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+8.1;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+8.2;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+8.3;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+8.4;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+8.5;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0
+8.6;14;17424;2.1602;1497;1500;0;0;0;0;0;0;0
+8.7;14;17424;2.1602;1493;1500;0;0;0;0;0;0;0
+8.8;14;17424;2.1602;1490;1500;0;0;0;0;0;0;0
+8.9;14;17424;2.1602;1487;1500;0;0;0;0;0;0;0
+9;14;17424;2.1602;1484;1500;0;0;0;0;0;0;0
+9.1;14;17424;2.1602;1291;1500;0;0;0;0;0;0;0
+9.2;14;17424;2.1602;1123;1500;0;0;0;0;0;0;0
+9.3;14;17424;2.1602;977;1500;0;0;0;0;0;0;0
+9.4;14;17424;2.1602;850;1500;0;0;0;0;0;0;0
+9.5;14;17424;2.1602;739;1500;0;0;0;0;0;0;0
+9.6;14;17424;2.1602;508;1500;0;0;0;0;0;0;0
+9.7;14;17424;2.1602;349;1500;0;0;0;0;0;0;0
+9.8;14;17424;2.1602;239;1500;0;0;0;0;0;0;0
+9.9;14;17424;2.1602;164;1500;0;0;0;0;0;0;0
+10;14;17424;2.1602;113;1500;0;0;0;0;0;0;0
+10.1;14;17424;2.1602;85;1500;0;0;0;0;0;0;0
+10.2;14;17424;2.1602;63;1500;0;0;0;0;0;0;0
+10.3;14;17424;2.1602;47;1500;0;0;0;0;0;0;0
+10.4;14;17424;2.1602;35;1500;0;0;0;0;0;0;0
+10.5;14;17424;2.1602;27;1500;0;0;0;0;0;0;0
+10.6;14;17424;2.1602;12;1500;0;0;0;0;0;0;0
+10.7;14;17424;2.1602;6;1500;0;0;0;0;0;0;0
+10.8;14;17424;2.1602;3;1500;0;0;0;0;0;0;0
+10.9;14;17424;2.1602;1;1500;0;0;0;0;0;0;0
+11;14;17424;2.1602;1;1500;0;0;0;0;0;0;0
+11.1;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+11.2;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+11.3;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+11.4;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+11.5;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+11.6;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+11.7;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+11.8;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+11.9;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.1;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.2;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.3;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.4;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.5;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.6;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.7;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.8;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+12.9;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.1;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.2;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.3;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.4;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.5;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.6;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.7;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.8;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+13.9;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
+14;14;17424;2.1602;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs15_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs15_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..460d156d78de9765bfb8f320513b36d7113bc7b0
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs15_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+7;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.1;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.2;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.3;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.4;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.5;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.6;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.7;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.8;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+7.9;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.1;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.2;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.3;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.4;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.5;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.6;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.7;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.8;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+8.9;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+9;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+9.1;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0
+9.2;15;18960;2.4063;1499;1500;0;0;0;0;0;0;0
+9.3;15;18960;2.4063;1499;1500;0;0;0;0;0;0;0
+9.4;15;18960;2.4063;1499;1500;0;0;0;0;0;0;0
+9.5;15;18960;2.4063;1498;1500;0;0;0;0;0;0;0
+9.6;15;18960;2.4063;1377;1500;0;0;0;0;0;0;0
+9.7;15;18960;2.4063;1265;1500;0;0;0;0;0;0;0
+9.8;15;18960;2.4063;1163;1500;0;0;0;0;0;0;0
+9.9;15;18960;2.4063;1069;1500;0;0;0;0;0;0;0
+10;15;18960;2.4063;982;1500;0;0;0;0;0;0;0
+10.1;15;18960;2.4063;664;1500;0;0;0;0;0;0;0
+10.2;15;18960;2.4063;450;1500;0;0;0;0;0;0;0
+10.3;15;18960;2.4063;304;1500;0;0;0;0;0;0;0
+10.4;15;18960;2.4063;206;1500;0;0;0;0;0;0;0
+10.5;15;18960;2.4063;139;1500;0;0;0;0;0;0;0
+10.6;15;18960;2.4063;113;1500;0;0;0;0;0;0;0
+10.7;15;18960;2.4063;92;1500;0;0;0;0;0;0;0
+10.8;15;18960;2.4063;75;1500;0;0;0;0;0;0;0
+10.9;15;18960;2.4063;61;1500;0;0;0;0;0;0;0
+11;15;18960;2.4063;50;1500;0;0;0;0;0;0;0
+11.1;15;18960;2.4063;29;1500;0;0;0;0;0;0;0
+11.2;15;18960;2.4063;17;1500;0;0;0;0;0;0;0
+11.3;15;18960;2.4063;10;1500;0;0;0;0;0;0;0
+11.4;15;18960;2.4063;6;1500;0;0;0;0;0;0;0
+11.5;15;18960;2.4063;3;1500;0;0;0;0;0;0;0
+11.6;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+11.7;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+11.8;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+11.9;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.1;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.2;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.3;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.4;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.5;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.6;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.7;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.8;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+12.9;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.1;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.2;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.3;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.4;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.5;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.6;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.7;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.8;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+13.9;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
+14;15;18960;2.4063;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs16_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs16_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..4f122de8c104c9cfede7d72fffa0b9402a66a7a3
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs16_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+7;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.1;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.2;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.3;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.4;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.5;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.6;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.7;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.8;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+7.9;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.1;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.2;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.3;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.4;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.5;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.6;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.7;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.8;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+8.9;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.1;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.2;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.3;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.4;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.5;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.6;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.7;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.8;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+9.9;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+10;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0
+10.1;16;20496;2.5703;1424;1500;0;0;0;0;0;0;0
+10.2;16;20496;2.5703;1352;1500;0;0;0;0;0;0;0
+10.3;16;20496;2.5703;1283;1500;0;0;0;0;0;0;0
+10.4;16;20496;2.5703;1218;1500;0;0;0;0;0;0;0
+10.5;16;20496;2.5703;1157;1500;0;0;0;0;0;0;0
+10.6;16;20496;2.5703;775;1500;0;0;0;0;0;0;0
+10.7;16;20496;2.5703;519;1500;0;0;0;0;0;0;0
+10.8;16;20496;2.5703;348;1500;0;0;0;0;0;0;0
+10.9;16;20496;2.5703;233;1500;0;0;0;0;0;0;0
+11;16;20496;2.5703;156;1500;0;0;0;0;0;0;0
+11.1;16;20496;2.5703;132;1500;0;0;0;0;0;0;0
+11.2;16;20496;2.5703;111;1500;0;0;0;0;0;0;0
+11.3;16;20496;2.5703;94;1500;0;0;0;0;0;0;0
+11.4;16;20496;2.5703;79;1500;0;0;0;0;0;0;0
+11.5;16;20496;2.5703;67;1500;0;0;0;0;0;0;0
+11.6;16;20496;2.5703;44;1500;0;0;0;0;0;0;0
+11.7;16;20496;2.5703;29;1500;0;0;0;0;0;0;0
+11.8;16;20496;2.5703;19;1500;0;0;0;0;0;0;0
+11.9;16;20496;2.5703;12;1500;0;0;0;0;0;0;0
+12;16;20496;2.5703;8;1500;0;0;0;0;0;0;0
+12.1;16;20496;2.5703;4;1500;0;0;0;0;0;0;0
+12.2;16;20496;2.5703;2;1500;0;0;0;0;0;0;0
+12.3;16;20496;2.5703;1;1500;0;0;0;0;0;0;0
+12.4;16;20496;2.5703;1;1500;0;0;0;0;0;0;0
+12.5;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+12.6;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+12.7;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+12.8;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+12.9;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.1;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.2;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.3;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.4;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.5;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.6;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.7;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.8;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+13.9;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
+14;16;20496;2.5703;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs17_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs17_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..3254f76eb9e98a98067b61444732deb4de7482b3
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs17_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+10;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0
+10.1;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0
+10.2;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0
+10.3;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0
+10.4;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0
+10.5;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0
+10.6;17;20496;2.5664;1498;1500;0;0;0;0;0;0;0
+10.7;17;20496;2.5664;1496;1500;0;0;0;0;0;0;0
+10.8;17;20496;2.5664;1494;1500;0;0;0;0;0;0;0
+10.9;17;20496;2.5664;1493;1500;0;0;0;0;0;0;0
+11;17;20496;2.5664;1491;1500;0;0;0;0;0;0;0
+11.1;17;20496;2.5664;1336;1500;0;0;0;0;0;0;0
+11.2;17;20496;2.5664;1197;1500;0;0;0;0;0;0;0
+11.3;17;20496;2.5664;1072;1500;0;0;0;0;0;0;0
+11.4;17;20496;2.5664;961;1500;0;0;0;0;0;0;0
+11.5;17;20496;2.5664;861;1500;0;0;0;0;0;0;0
+11.6;17;20496;2.5664;603;1500;0;0;0;0;0;0;0
+11.7;17;20496;2.5664;423;1500;0;0;0;0;0;0;0
+11.8;17;20496;2.5664;296;1500;0;0;0;0;0;0;0
+11.9;17;20496;2.5664;208;1500;0;0;0;0;0;0;0
+12;17;20496;2.5664;146;1500;0;0;0;0;0;0;0
+12.1;17;20496;2.5664;125;1500;0;0;0;0;0;0;0
+12.2;17;20496;2.5664;107;1500;0;0;0;0;0;0;0
+12.3;17;20496;2.5664;92;1500;0;0;0;0;0;0;0
+12.4;17;20496;2.5664;79;1500;0;0;0;0;0;0;0
+12.5;17;20496;2.5664;68;1500;0;0;0;0;0;0;0
+12.6;17;20496;2.5664;50;1500;0;0;0;0;0;0;0
+12.7;17;20496;2.5664;37;1500;0;0;0;0;0;0;0
+12.8;17;20496;2.5664;28;1500;0;0;0;0;0;0;0
+12.9;17;20496;2.5664;20;1500;0;0;0;0;0;0;0
+13;17;20496;2.5664;15;1500;0;0;0;0;0;0;0
+13.1;17;20496;2.5664;9;1500;0;0;0;0;0;0;0
+13.2;17;20496;2.5664;5;1500;0;0;0;0;0;0;0
+13.3;17;20496;2.5664;3;1500;0;0;0;0;0;0;0
+13.4;17;20496;2.5664;2;1500;0;0;0;0;0;0;0
+13.5;17;20496;2.5664;1;1500;0;0;0;0;0;0;0
+13.6;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+13.7;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+13.8;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+13.9;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.1;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.2;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.3;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.4;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.5;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.6;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.7;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.8;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+14.9;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.1;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.2;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.3;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.4;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.5;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.6;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.7;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.8;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+15.9;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.1;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.2;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.3;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.4;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.5;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.6;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.7;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.8;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+16.9;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
+17;17;20496;2.5664;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs18_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs18_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..67ede60066ac44966f2541149d09bb664844ab54
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs18_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+10;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.1;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.2;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.3;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.4;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.5;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.6;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.7;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.8;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+10.9;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+11;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0
+11.1;18;21504;2.7305;1499;1500;0;0;0;0;0;0;0
+11.2;18;21504;2.7305;1499;1500;0;0;0;0;0;0;0
+11.3;18;21504;2.7305;1498;1500;0;0;0;0;0;0;0
+11.4;18;21504;2.7305;1498;1500;0;0;0;0;0;0;0
+11.5;18;21504;2.7305;1497;1500;0;0;0;0;0;0;0
+11.6;18;21504;2.7305;1399;1500;0;0;0;0;0;0;0
+11.7;18;21504;2.7305;1307;1500;0;0;0;0;0;0;0
+11.8;18;21504;2.7305;1221;1500;0;0;0;0;0;0;0
+11.9;18;21504;2.7305;1141;1500;0;0;0;0;0;0;0
+12;18;21504;2.7305;1066;1500;0;0;0;0;0;0;0
+12.1;18;21504;2.7305;788;1500;0;0;0;0;0;0;0
+12.2;18;21504;2.7305;582;1500;0;0;0;0;0;0;0
+12.3;18;21504;2.7305;431;1500;0;0;0;0;0;0;0
+12.4;18;21504;2.7305;318;1500;0;0;0;0;0;0;0
+12.5;18;21504;2.7305;235;1500;0;0;0;0;0;0;0
+12.6;18;21504;2.7305;185;1500;0;0;0;0;0;0;0
+12.7;18;21504;2.7305;146;1500;0;0;0;0;0;0;0
+12.8;18;21504;2.7305;115;1500;0;0;0;0;0;0;0
+12.9;18;21504;2.7305;90;1500;0;0;0;0;0;0;0
+13;18;21504;2.7305;71;1500;0;0;0;0;0;0;0
+13.1;18;21504;2.7305;50;1500;0;0;0;0;0;0;0
+13.2;18;21504;2.7305;35;1500;0;0;0;0;0;0;0
+13.3;18;21504;2.7305;25;1500;0;0;0;0;0;0;0
+13.4;18;21504;2.7305;18;1500;0;0;0;0;0;0;0
+13.5;18;21504;2.7305;12;1500;0;0;0;0;0;0;0
+13.6;18;21504;2.7305;7;1500;0;0;0;0;0;0;0
+13.7;18;21504;2.7305;3;1500;0;0;0;0;0;0;0
+13.8;18;21504;2.7305;2;1500;0;0;0;0;0;0;0
+13.9;18;21504;2.7305;1;1500;0;0;0;0;0;0;0
+14;18;21504;2.7305;1;1500;0;0;0;0;0;0;0
+14.1;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+14.2;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+14.3;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+14.4;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+14.5;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+14.6;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+14.7;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+14.8;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+14.9;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.1;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.2;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.3;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.4;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.5;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.6;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.7;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.8;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+15.9;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.1;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.2;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.3;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.4;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.5;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.6;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.7;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.8;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+16.9;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
+17;18;21504;2.7305;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs19_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs19_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..3d18bd7987e8994bad6993cf6e27053dbbdcd4b3
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs19_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+10;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.1;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.2;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.3;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.4;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.5;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.6;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.7;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.8;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+10.9;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.1;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.2;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.3;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.4;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.5;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.6;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.7;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.8;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+11.9;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+12;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0
+12.1;19;24072;3.0293;1499;1500;0;0;0;0;0;0;0
+12.2;19;24072;3.0293;1499;1500;0;0;0;0;0;0;0
+12.3;19;24072;3.0293;1498;1500;0;0;0;0;0;0;0
+12.4;19;24072;3.0293;1497;1500;0;0;0;0;0;0;0
+12.5;19;24072;3.0293;1497;1500;0;0;0;0;0;0;0
+12.6;19;24072;3.0293;1389;1500;0;0;0;0;0;0;0
+12.7;19;24072;3.0293;1290;1500;0;0;0;0;0;0;0
+12.8;19;24072;3.0293;1197;1500;0;0;0;0;0;0;0
+12.9;19;24072;3.0293;1111;1500;0;0;0;0;0;0;0
+13;19;24072;3.0293;1032;1500;0;0;0;0;0;0;0
+13.1;19;24072;3.0293;746;1500;0;0;0;0;0;0;0
+13.2;19;24072;3.0293;539;1500;0;0;0;0;0;0;0
+13.3;19;24072;3.0293;390;1500;0;0;0;0;0;0;0
+13.4;19;24072;3.0293;282;1500;0;0;0;0;0;0;0
+13.5;19;24072;3.0293;204;1500;0;0;0;0;0;0;0
+13.6;19;24072;3.0293;166;1500;0;0;0;0;0;0;0
+13.7;19;24072;3.0293;135;1500;0;0;0;0;0;0;0
+13.8;19;24072;3.0293;110;1500;0;0;0;0;0;0;0
+13.9;19;24072;3.0293;89;1500;0;0;0;0;0;0;0
+14;19;24072;3.0293;73;1500;0;0;0;0;0;0;0
+14.1;19;24072;3.0293;54;1500;0;0;0;0;0;0;0
+14.2;19;24072;3.0293;41;1500;0;0;0;0;0;0;0
+14.3;19;24072;3.0293;30;1500;0;0;0;0;0;0;0
+14.4;19;24072;3.0293;23;1500;0;0;0;0;0;0;0
+14.5;19;24072;3.0293;17;1500;0;0;0;0;0;0;0
+14.6;19;24072;3.0293;9;1500;0;0;0;0;0;0;0
+14.7;19;24072;3.0293;5;1500;0;0;0;0;0;0;0
+14.8;19;24072;3.0293;3;1500;0;0;0;0;0;0;0
+14.9;19;24072;3.0293;2;1500;0;0;0;0;0;0;0
+15;19;24072;3.0293;1;1500;0;0;0;0;0;0;0
+15.1;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+15.2;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+15.3;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+15.4;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+15.5;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+15.6;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+15.7;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+15.8;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+15.9;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.1;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.2;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.3;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.4;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.5;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.6;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.7;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.8;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+16.9;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
+17;19;24072;3.0293;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs1_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs1_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..ccb17b0d1c242fff7364b3fe391be6fa93b98f9e
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs1_awgn_5G.csv
@@ -0,0 +1,27 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-4;1;2472;0.3066;1500;1500;0;0;0;0;0;0;0
+-3.9;1;2472;0.3066;1497;1500;0;0;0;0;0;0;0
+-3.8;1;2472;0.3066;1494;1500;0;0;0;0;0;0;0
+-3.7;1;2472;0.3066;1490;1500;0;0;0;0;0;0;0
+-3.6;1;2472;0.3066;1487;1500;0;0;0;0;0;0;0
+-3.5;1;2472;0.3066;1484;1500;0;0;0;0;0;0;0
+-3.4;1;2472;0.3066;1386;1500;0;0;0;0;0;0;0
+-3.3;1;2472;0.3066;1295;1500;0;0;0;0;0;0;0
+-3.2;1;2472;0.3066;1209;1500;0;0;0;0;0;0;0
+-3.1;1;2472;0.3066;1130;1500;0;0;0;0;0;0;0
+-3;1;2472;0.3066;1055;1500;0;0;0;0;0;0;0
+-2.9;1;2472;0.3066;863;1500;0;0;0;0;0;0;0
+-2.8;1;2472;0.3066;706;1500;0;0;0;0;0;0;0
+-2.7;1;2472;0.3066;577;1500;0;0;0;0;0;0;0
+-2.6;1;2472;0.3066;472;1500;0;0;0;0;0;0;0
+-2.5;1;2472;0.3066;386;1500;0;0;0;0;0;0;0
+-2.4;1;2472;0.3066;215;1500;0;0;0;0;0;0;0
+-2.3;1;2472;0.3066;120;1500;0;0;0;0;0;0;0
+-2.2;1;2472;0.3066;67;1500;0;0;0;0;0;0;0
+-2.1;1;2472;0.3066;37;1500;0;0;0;0;0;0;0
+-2;1;2472;0.3066;21;1500;0;0;0;0;0;0;0
+-1.9;1;2472;0.3066;9;1500;0;0;0;0;0;0;0
+-1.8;1;2472;0.3066;4;1500;0;0;0;0;0;0;0
+-1.7;1;2472;0.3066;2;1500;0;0;0;0;0;0;0
+-1.6;1;2472;0.3066;1;1500;0;0;0;0;0;0;0
+-1.5;1;2472;0.3066;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs20_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs20_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..69d005539543426c5e8b09c3b6b3a5a77f6a8b51
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs20_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+10;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.1;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.2;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.3;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.4;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.5;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.6;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.7;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.8;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+10.9;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.1;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.2;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.3;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.4;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.5;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.6;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.7;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.8;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+11.9;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.1;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.2;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.3;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.4;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.5;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.6;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.7;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.8;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+12.9;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+13;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0
+13.1;20;26632;3.3223;1499;1500;0;0;0;0;0;0;0
+13.2;20;26632;3.3223;1499;1500;0;0;0;0;0;0;0
+13.3;20;26632;3.3223;1498;1500;0;0;0;0;0;0;0
+13.4;20;26632;3.3223;1498;1500;0;0;0;0;0;0;0
+13.5;20;26632;3.3223;1497;1500;0;0;0;0;0;0;0
+13.6;20;26632;3.3223;1390;1500;0;0;0;0;0;0;0
+13.7;20;26632;3.3223;1291;1500;0;0;0;0;0;0;0
+13.8;20;26632;3.3223;1199;1500;0;0;0;0;0;0;0
+13.9;20;26632;3.3223;1113;1500;0;0;0;0;0;0;0
+14;20;26632;3.3223;1034;1500;0;0;0;0;0;0;0
+14.1;20;26632;3.3223;745;1500;0;0;0;0;0;0;0
+14.2;20;26632;3.3223;537;1500;0;0;0;0;0;0;0
+14.3;20;26632;3.3223;387;1500;0;0;0;0;0;0;0
+14.4;20;26632;3.3223;279;1500;0;0;0;0;0;0;0
+14.5;20;26632;3.3223;201;1500;0;0;0;0;0;0;0
+14.6;20;26632;3.3223;161;1500;0;0;0;0;0;0;0
+14.7;20;26632;3.3223;129;1500;0;0;0;0;0;0;0
+14.8;20;26632;3.3223;104;1500;0;0;0;0;0;0;0
+14.9;20;26632;3.3223;83;1500;0;0;0;0;0;0;0
+15;20;26632;3.3223;67;1500;0;0;0;0;0;0;0
+15.1;20;26632;3.3223;45;1500;0;0;0;0;0;0;0
+15.2;20;26632;3.3223;30;1500;0;0;0;0;0;0;0
+15.3;20;26632;3.3223;20;1500;0;0;0;0;0;0;0
+15.4;20;26632;3.3223;13;1500;0;0;0;0;0;0;0
+15.5;20;26632;3.3223;9;1500;0;0;0;0;0;0;0
+15.6;20;26632;3.3223;4;1500;0;0;0;0;0;0;0
+15.7;20;26632;3.3223;1;1500;0;0;0;0;0;0;0
+15.8;20;26632;3.3223;1;1500;0;0;0;0;0;0;0
+15.9;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.1;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.2;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.3;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.4;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.5;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.6;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.7;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.8;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+16.9;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
+17;20;26632;3.3223;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs21_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs21_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..2a5a691afb199ca80fe96c94d01bbf97682b69e4
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs21_awgn_5G.csv
@@ -0,0 +1,72 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+10;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.1;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.2;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.3;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.4;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.5;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.6;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.7;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.8;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+10.9;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.1;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.2;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.3;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.4;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.5;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.6;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.7;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.8;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+11.9;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.1;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.2;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.3;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.4;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.5;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.6;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.7;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.8;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+12.9;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.1;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.2;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.3;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.4;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.5;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.6;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.7;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.8;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+13.9;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+14;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0
+14.1;21;28680;3.6094;1472;1500;0;0;0;0;0;0;0
+14.2;21;28680;3.6094;1444;1500;0;0;0;0;0;0;0
+14.3;21;28680;3.6094;1417;1500;0;0;0;0;0;0;0
+14.4;21;28680;3.6094;1390;1500;0;0;0;0;0;0;0
+14.5;21;28680;3.6094;1364;1500;0;0;0;0;0;0;0
+14.6;21;28680;3.6094;1040;1500;0;0;0;0;0;0;0
+14.7;21;28680;3.6094;793;1500;0;0;0;0;0;0;0
+14.8;21;28680;3.6094;605;1500;0;0;0;0;0;0;0
+14.9;21;28680;3.6094;461;1500;0;0;0;0;0;0;0
+15;21;28680;3.6094;351;1500;0;0;0;0;0;0;0
+15.1;21;28680;3.6094;265;1500;0;0;0;0;0;0;0
+15.2;21;28680;3.6094;199;1500;0;0;0;0;0;0;0
+15.3;21;28680;3.6094;150;1500;0;0;0;0;0;0;0
+15.4;21;28680;3.6094;113;1500;0;0;0;0;0;0;0
+15.5;21;28680;3.6094;85;1500;0;0;0;0;0;0;0
+15.6;21;28680;3.6094;79;1500;0;0;0;0;0;0;0
+15.7;21;28680;3.6094;73;1500;0;0;0;0;0;0;0
+15.8;21;28680;3.6094;67;1500;0;0;0;0;0;0;0
+15.9;21;28680;3.6094;62;1500;0;0;0;0;0;0;0
+16;21;28680;3.6094;57;1500;0;0;0;0;0;0;0
+16.1;21;28680;3.6094;37;1500;0;0;0;0;0;0;0
+16.2;21;28680;3.6094;23;1500;0;0;0;0;0;0;0
+16.3;21;28680;3.6094;15;1500;0;0;0;0;0;0;0
+16.4;21;28680;3.6094;10;1500;0;0;0;0;0;0;0
+16.5;21;28680;3.6094;6;1500;0;0;0;0;0;0;0
+16.6;21;28680;3.6094;3;1500;0;0;0;0;0;0;0
+16.7;21;28680;3.6094;1;1500;0;0;0;0;0;0;0
+16.8;21;28680;3.6094;1;1500;0;0;0;0;0;0;0
+16.9;21;28680;3.6094;0;1500;0;0;0;0;0;0;0
+17;21;28680;3.6094;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs22_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs22_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..10a424137693f7cd28fac6ac97b2881fd6d3de50
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs22_awgn_5G.csv
@@ -0,0 +1,52 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+14;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.1;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.2;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.3;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.4;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.5;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.6;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.7;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.8;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+14.9;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+15;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0
+15.1;22;31240;3.9023;1421;1500;0;0;0;0;0;0;0
+15.2;22;31240;3.9023;1347;1500;0;0;0;0;0;0;0
+15.3;22;31240;3.9023;1276;1500;0;0;0;0;0;0;0
+15.4;22;31240;3.9023;1209;1500;0;0;0;0;0;0;0
+15.5;22;31240;3.9023;1146;1500;0;0;0;0;0;0;0
+15.6;22;31240;3.9023;807;1500;0;0;0;0;0;0;0
+15.7;22;31240;3.9023;569;1500;0;0;0;0;0;0;0
+15.8;22;31240;3.9023;400;1500;0;0;0;0;0;0;0
+15.9;22;31240;3.9023;282;1500;0;0;0;0;0;0;0
+16;22;31240;3.9023;199;1500;0;0;0;0;0;0;0
+16.1;22;31240;3.9023;165;1500;0;0;0;0;0;0;0
+16.2;22;31240;3.9023;137;1500;0;0;0;0;0;0;0
+16.3;22;31240;3.9023;114;1500;0;0;0;0;0;0;0
+16.4;22;31240;3.9023;94;1500;0;0;0;0;0;0;0
+16.5;22;31240;3.9023;78;1500;0;0;0;0;0;0;0
+16.6;22;31240;3.9023;74;1500;0;0;0;0;0;0;0
+16.7;22;31240;3.9023;69;1500;0;0;0;0;0;0;0
+16.8;22;31240;3.9023;65;1500;0;0;0;0;0;0;0
+16.9;22;31240;3.9023;61;1500;0;0;0;0;0;0;0
+17;22;31240;3.9023;58;1500;0;0;0;0;0;0;0
+17.1;22;31240;3.9023;36;1500;0;0;0;0;0;0;0
+17.2;22;31240;3.9023;23;1500;0;0;0;0;0;0;0
+17.3;22;31240;3.9023;15;1500;0;0;0;0;0;0;0
+17.4;22;31240;3.9023;9;1500;0;0;0;0;0;0;0
+17.5;22;31240;3.9023;6;1500;0;0;0;0;0;0;0
+17.6;22;31240;3.9023;3;1500;0;0;0;0;0;0;0
+17.7;22;31240;3.9023;1;1500;0;0;0;0;0;0;0
+17.8;22;31240;3.9023;1;1500;0;0;0;0;0;0;0
+17.9;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.1;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.2;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.3;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.4;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.5;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.6;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.7;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.8;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+18.9;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
+19;22;31240;3.9023;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs23_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs23_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..07e9e257fffa20abaf6789ea858e3d006a2995de
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs23_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+15;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0
+15.1;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0
+15.2;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0
+15.3;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0
+15.4;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0
+15.5;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0
+15.6;23;33816;4.2129;1499;1500;0;0;0;0;0;0;0
+15.7;23;33816;4.2129;1499;1500;0;0;0;0;0;0;0
+15.8;23;33816;4.2129;1498;1500;0;0;0;0;0;0;0
+15.9;23;33816;4.2129;1498;1500;0;0;0;0;0;0;0
+16;23;33816;4.2129;1497;1500;0;0;0;0;0;0;0
+16.1;23;33816;4.2129;1360;1500;0;0;0;0;0;0;0
+16.2;23;33816;4.2129;1236;1500;0;0;0;0;0;0;0
+16.3;23;33816;4.2129;1123;1500;0;0;0;0;0;0;0
+16.4;23;33816;4.2129;1020;1500;0;0;0;0;0;0;0
+16.5;23;33816;4.2129;927;1500;0;0;0;0;0;0;0
+16.6;23;33816;4.2129;630;1500;0;0;0;0;0;0;0
+16.7;23;33816;4.2129;428;1500;0;0;0;0;0;0;0
+16.8;23;33816;4.2129;291;1500;0;0;0;0;0;0;0
+16.9;23;33816;4.2129;198;1500;0;0;0;0;0;0;0
+17;23;33816;4.2129;135;1500;0;0;0;0;0;0;0
+17.1;23;33816;4.2129;120;1500;0;0;0;0;0;0;0
+17.2;23;33816;4.2129;108;1500;0;0;0;0;0;0;0
+17.3;23;33816;4.2129;96;1500;0;0;0;0;0;0;0
+17.4;23;33816;4.2129;86;1500;0;0;0;0;0;0;0
+17.5;23;33816;4.2129;77;1500;0;0;0;0;0;0;0
+17.6;23;33816;4.2129;70;1500;0;0;0;0;0;0;0
+17.7;23;33816;4.2129;63;1500;0;0;0;0;0;0;0
+17.8;23;33816;4.2129;57;1500;0;0;0;0;0;0;0
+17.9;23;33816;4.2129;52;1500;0;0;0;0;0;0;0
+18;23;33816;4.2129;47;1500;0;0;0;0;0;0;0
+18.1;23;33816;4.2129;28;1500;0;0;0;0;0;0;0
+18.2;23;33816;4.2129;16;1500;0;0;0;0;0;0;0
+18.3;23;33816;4.2129;9;1500;0;0;0;0;0;0;0
+18.4;23;33816;4.2129;6;1500;0;0;0;0;0;0;0
+18.5;23;33816;4.2129;3;1500;0;0;0;0;0;0;0
+18.6;23;33816;4.2129;3;1500;0;0;0;0;0;0;0
+18.7;23;33816;4.2129;3;1500;0;0;0;0;0;0;0
+18.8;23;33816;4.2129;3;1500;0;0;0;0;0;0;0
+18.9;23;33816;4.2129;3;1500;0;0;0;0;0;0;0
+19;23;33816;4.2129;3;1500;0;0;0;0;0;0;0
+19.1;23;33816;4.2129;3;1500;0;0;0;0;0;0;0
+19.2;23;33816;4.2129;4;1500;0;0;0;0;0;0;0
+19.3;23;33816;4.2129;5;1500;0;0;0;0;0;0;0
+19.4;23;33816;4.2129;6;1500;0;0;0;0;0;0;0
+19.5;23;33816;4.2129;8;1500;0;0;0;0;0;0;0
+19.6;23;33816;4.2129;6;1500;0;0;0;0;0;0;0
+19.7;23;33816;4.2129;4;1500;0;0;0;0;0;0;0
+19.8;23;33816;4.2129;3;1500;0;0;0;0;0;0;0
+19.9;23;33816;4.2129;2;1500;0;0;0;0;0;0;0
+20;23;33816;4.2129;2;1500;0;0;0;0;0;0;0
+20.1;23;33816;4.2129;1;1500;0;0;0;0;0;0;0
+20.2;23;33816;4.2129;1;1500;0;0;0;0;0;0;0
+20.3;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+20.4;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+20.5;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+20.6;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+20.7;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+20.8;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+20.9;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.1;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.2;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.3;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.4;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.5;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.6;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.7;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.8;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+21.9;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.1;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.2;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.3;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.4;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.5;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.6;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.7;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.8;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+22.9;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.1;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.2;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.3;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.4;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.5;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.6;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.7;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.8;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+23.9;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
+24;23;33816;4.2129;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs24_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs24_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..6eac0f3f7ddcbce37fee28f8d3c012830a2e1287
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs24_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+15;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.1;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.2;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.3;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.4;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.5;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.6;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.7;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.8;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+15.9;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+16;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+16.1;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+16.2;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+16.3;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+16.4;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+16.5;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0
+16.6;24;35856;4.5234;1474;1500;0;0;0;0;0;0;0
+16.7;24;35856;4.5234;1449;1500;0;0;0;0;0;0;0
+16.8;24;35856;4.5234;1424;1500;0;0;0;0;0;0;0
+16.9;24;35856;4.5234;1400;1500;0;0;0;0;0;0;0
+17;24;35856;4.5234;1376;1500;0;0;0;0;0;0;0
+17.1;24;35856;4.5234;1016;1500;0;0;0;0;0;0;0
+17.2;24;35856;4.5234;751;1500;0;0;0;0;0;0;0
+17.3;24;35856;4.5234;554;1500;0;0;0;0;0;0;0
+17.4;24;35856;4.5234;410;1500;0;0;0;0;0;0;0
+17.5;24;35856;4.5234;303;1500;0;0;0;0;0;0;0
+17.6;24;35856;4.5234;232;1500;0;0;0;0;0;0;0
+17.7;24;35856;4.5234;177;1500;0;0;0;0;0;0;0
+17.8;24;35856;4.5234;136;1500;0;0;0;0;0;0;0
+17.9;24;35856;4.5234;104;1500;0;0;0;0;0;0;0
+18;24;35856;4.5234;80;1500;0;0;0;0;0;0;0
+18.1;24;35856;4.5234;79;1500;0;0;0;0;0;0;0
+18.2;24;35856;4.5234;78;1500;0;0;0;0;0;0;0
+18.3;24;35856;4.5234;77;1500;0;0;0;0;0;0;0
+18.4;24;35856;4.5234;76;1500;0;0;0;0;0;0;0
+18.5;24;35856;4.5234;75;1500;0;0;0;0;0;0;0
+18.6;24;35856;4.5234;59;1500;0;0;0;0;0;0;0
+18.7;24;35856;4.5234;46;1500;0;0;0;0;0;0;0
+18.8;24;35856;4.5234;36;1500;0;0;0;0;0;0;0
+18.9;24;35856;4.5234;28;1500;0;0;0;0;0;0;0
+19;24;35856;4.5234;22;1500;0;0;0;0;0;0;0
+19.1;24;35856;4.5234;21;1500;0;0;0;0;0;0;0
+19.2;24;35856;4.5234;20;1500;0;0;0;0;0;0;0
+19.3;24;35856;4.5234;20;1500;0;0;0;0;0;0;0
+19.4;24;35856;4.5234;19;1500;0;0;0;0;0;0;0
+19.5;24;35856;4.5234;18;1500;0;0;0;0;0;0;0
+19.6;24;35856;4.5234;22;1500;0;0;0;0;0;0;0
+19.7;24;35856;4.5234;26;1500;0;0;0;0;0;0;0
+19.8;24;35856;4.5234;31;1500;0;0;0;0;0;0;0
+19.9;24;35856;4.5234;36;1500;0;0;0;0;0;0;0
+20;24;35856;4.5234;43;1500;0;0;0;0;0;0;0
+20.1;24;35856;4.5234;35;1500;0;0;0;0;0;0;0
+20.2;24;35856;4.5234;29;1500;0;0;0;0;0;0;0
+20.3;24;35856;4.5234;23;1500;0;0;0;0;0;0;0
+20.4;24;35856;4.5234;19;1500;0;0;0;0;0;0;0
+20.5;24;35856;4.5234;15;1500;0;0;0;0;0;0;0
+20.6;24;35856;4.5234;8;1500;0;0;0;0;0;0;0
+20.7;24;35856;4.5234;4;1500;0;0;0;0;0;0;0
+20.8;24;35856;4.5234;2;1500;0;0;0;0;0;0;0
+20.9;24;35856;4.5234;1;1500;0;0;0;0;0;0;0
+21;24;35856;4.5234;1;1500;0;0;0;0;0;0;0
+21.1;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+21.2;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+21.3;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+21.4;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+21.5;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+21.6;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+21.7;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+21.8;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+21.9;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.1;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.2;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.3;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.4;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.5;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.6;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.7;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.8;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+22.9;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.1;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.2;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.3;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.4;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.5;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.6;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.7;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.8;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+23.9;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
+24;24;35856;4.5234;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs25_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs25_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..6f158f5bdc059d0a6351d3ea3e2a566021b60c9a
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs25_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+15;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.1;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.2;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.3;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.4;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.5;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.6;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.7;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.8;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+15.9;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.1;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.2;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.3;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.4;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.5;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.6;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.7;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.8;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+16.9;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+17;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0
+17.1;25;37896;4.8164;1493;1500;0;0;0;0;0;0;0
+17.2;25;37896;4.8164;1486;1500;0;0;0;0;0;0;0
+17.3;25;37896;4.8164;1478;1500;0;0;0;0;0;0;0
+17.4;25;37896;4.8164;1471;1500;0;0;0;0;0;0;0
+17.5;25;37896;4.8164;1464;1500;0;0;0;0;0;0;0
+17.6;25;37896;4.8164;1138;1500;0;0;0;0;0;0;0
+17.7;25;37896;4.8164;885;1500;0;0;0;0;0;0;0
+17.8;25;37896;4.8164;688;1500;0;0;0;0;0;0;0
+17.9;25;37896;4.8164;535;1500;0;0;0;0;0;0;0
+18;25;37896;4.8164;416;1500;0;0;0;0;0;0;0
+18.1;25;37896;4.8164;302;1500;0;0;0;0;0;0;0
+18.2;25;37896;4.8164;219;1500;0;0;0;0;0;0;0
+18.3;25;37896;4.8164;159;1500;0;0;0;0;0;0;0
+18.4;25;37896;4.8164;115;1500;0;0;0;0;0;0;0
+18.5;25;37896;4.8164;84;1500;0;0;0;0;0;0;0
+18.6;25;37896;4.8164;89;1500;0;0;0;0;0;0;0
+18.7;25;37896;4.8164;94;1500;0;0;0;0;0;0;0
+18.8;25;37896;4.8164;100;1500;0;0;0;0;0;0;0
+18.9;25;37896;4.8164;106;1500;0;0;0;0;0;0;0
+19;25;37896;4.8164;113;1500;0;0;0;0;0;0;0
+19.1;25;37896;4.8164;110;1500;0;0;0;0;0;0;0
+19.2;25;37896;4.8164;108;1500;0;0;0;0;0;0;0
+19.3;25;37896;4.8164;105;1500;0;0;0;0;0;0;0
+19.4;25;37896;4.8164;103;1500;0;0;0;0;0;0;0
+19.5;25;37896;4.8164;101;1500;0;0;0;0;0;0;0
+19.6;25;37896;4.8164;89;1500;0;0;0;0;0;0;0
+19.7;25;37896;4.8164;79;1500;0;0;0;0;0;0;0
+19.8;25;37896;4.8164;71;1500;0;0;0;0;0;0;0
+19.9;25;37896;4.8164;63;1500;0;0;0;0;0;0;0
+20;25;37896;4.8164;56;1500;0;0;0;0;0;0;0
+20.1;25;37896;4.8164;58;1500;0;0;0;0;0;0;0
+20.2;25;37896;4.8164;61;1500;0;0;0;0;0;0;0
+20.3;25;37896;4.8164;64;1500;0;0;0;0;0;0;0
+20.4;25;37896;4.8164;67;1500;0;0;0;0;0;0;0
+20.5;25;37896;4.8164;71;1500;0;0;0;0;0;0;0
+20.6;25;37896;4.8164;64;1500;0;0;0;0;0;0;0
+20.7;25;37896;4.8164;58;1500;0;0;0;0;0;0;0
+20.8;25;37896;4.8164;52;1500;0;0;0;0;0;0;0
+20.9;25;37896;4.8164;47;1500;0;0;0;0;0;0;0
+21;25;37896;4.8164;43;1500;0;0;0;0;0;0;0
+21.1;25;37896;4.8164;27;1500;0;0;0;0;0;0;0
+21.2;25;37896;4.8164;17;1500;0;0;0;0;0;0;0
+21.3;25;37896;4.8164;10;1500;0;0;0;0;0;0;0
+21.4;25;37896;4.8164;6;1500;0;0;0;0;0;0;0
+21.5;25;37896;4.8164;4;1500;0;0;0;0;0;0;0
+21.6;25;37896;4.8164;2;1500;0;0;0;0;0;0;0
+21.7;25;37896;4.8164;1;1500;0;0;0;0;0;0;0
+21.8;25;37896;4.8164;1;1500;0;0;0;0;0;0;0
+21.9;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.1;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.2;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.3;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.4;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.5;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.6;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.7;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.8;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+22.9;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.1;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.2;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.3;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.4;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.5;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.6;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.7;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.8;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+23.9;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
+24;25;37896;4.8164;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs26_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs26_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..94d779fb210f3c3ae5a84c3192a226a92a1a7a7b
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs26_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+15;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.1;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.2;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.3;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.4;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.5;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.6;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.7;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.8;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+15.9;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.1;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.2;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.3;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.4;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.5;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.6;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.7;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.8;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+16.9;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.1;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.2;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.3;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.4;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.5;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.6;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.7;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.8;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+17.9;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+18;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0
+18.1;26;40976;5.1152;1496;1500;0;0;0;0;0;0;0
+18.2;26;40976;5.1152;1492;1500;0;0;0;0;0;0;0
+18.3;26;40976;5.1152;1487;1500;0;0;0;0;0;0;0
+18.4;26;40976;5.1152;1483;1500;0;0;0;0;0;0;0
+18.5;26;40976;5.1152;1479;1500;0;0;0;0;0;0;0
+18.6;26;40976;5.1152;1188;1500;0;0;0;0;0;0;0
+18.7;26;40976;5.1152;954;1500;0;0;0;0;0;0;0
+18.8;26;40976;5.1152;766;1500;0;0;0;0;0;0;0
+18.9;26;40976;5.1152;615;1500;0;0;0;0;0;0;0
+19;26;40976;5.1152;494;1500;0;0;0;0;0;0;0
+19.1;26;40976;5.1152;478;1500;0;0;0;0;0;0;0
+19.2;26;40976;5.1152;462;1500;0;0;0;0;0;0;0
+19.3;26;40976;5.1152;447;1500;0;0;0;0;0;0;0
+19.4;26;40976;5.1152;433;1500;0;0;0;0;0;0;0
+19.5;26;40976;5.1152;419;1500;0;0;0;0;0;0;0
+19.6;26;40976;5.1152;491;1500;0;0;0;0;0;0;0
+19.7;26;40976;5.1152;577;1500;0;0;0;0;0;0;0
+19.8;26;40976;5.1152;677;1500;0;0;0;0;0;0;0
+19.9;26;40976;5.1152;795;1500;0;0;0;0;0;0;0
+20;26;40976;5.1152;934;1500;0;0;0;0;0;0;0
+20.1;26;40976;5.1152;799;1500;0;0;0;0;0;0;0
+20.2;26;40976;5.1152;684;1500;0;0;0;0;0;0;0
+20.3;26;40976;5.1152;586;1500;0;0;0;0;0;0;0
+20.4;26;40976;5.1152;502;1500;0;0;0;0;0;0;0
+20.5;26;40976;5.1152;429;1500;0;0;0;0;0;0;0
+20.6;26;40976;5.1152;315;1500;0;0;0;0;0;0;0
+20.7;26;40976;5.1152;231;1500;0;0;0;0;0;0;0
+20.8;26;40976;5.1152;169;1500;0;0;0;0;0;0;0
+20.9;26;40976;5.1152;124;1500;0;0;0;0;0;0;0
+21;26;40976;5.1152;91;1500;0;0;0;0;0;0;0
+21.1;26;40976;5.1152;87;1500;0;0;0;0;0;0;0
+21.2;26;40976;5.1152;84;1500;0;0;0;0;0;0;0
+21.3;26;40976;5.1152;81;1500;0;0;0;0;0;0;0
+21.4;26;40976;5.1152;78;1500;0;0;0;0;0;0;0
+21.5;26;40976;5.1152;75;1500;0;0;0;0;0;0;0
+21.6;26;40976;5.1152;75;1500;0;0;0;0;0;0;0
+21.7;26;40976;5.1152;75;1500;0;0;0;0;0;0;0
+21.8;26;40976;5.1152;75;1500;0;0;0;0;0;0;0
+21.9;26;40976;5.1152;75;1500;0;0;0;0;0;0;0
+22;26;40976;5.1152;75;1500;0;0;0;0;0;0;0
+22.1;26;40976;5.1152;73;1500;0;0;0;0;0;0;0
+22.2;26;40976;5.1152;72;1500;0;0;0;0;0;0;0
+22.3;26;40976;5.1152;70;1500;0;0;0;0;0;0;0
+22.4;26;40976;5.1152;68;1500;0;0;0;0;0;0;0
+22.5;26;40976;5.1152;67;1500;0;0;0;0;0;0;0
+22.6;26;40976;5.1152;53;1500;0;0;0;0;0;0;0
+22.7;26;40976;5.1152;42;1500;0;0;0;0;0;0;0
+22.8;26;40976;5.1152;33;1500;0;0;0;0;0;0;0
+22.9;26;40976;5.1152;26;1500;0;0;0;0;0;0;0
+23;26;40976;5.1152;21;1500;0;0;0;0;0;0;0
+23.1;26;40976;5.1152;11;1500;0;0;0;0;0;0;0
+23.2;26;40976;5.1152;6;1500;0;0;0;0;0;0;0
+23.3;26;40976;5.1152;3;1500;0;0;0;0;0;0;0
+23.4;26;40976;5.1152;2;1500;0;0;0;0;0;0;0
+23.5;26;40976;5.1152;1;1500;0;0;0;0;0;0;0
+23.6;26;40976;5.1152;1;1500;0;0;0;0;0;0;0
+23.7;26;40976;5.1152;0;1500;0;0;0;0;0;0;0
+23.8;26;40976;5.1152;0;1500;0;0;0;0;0;0;0
+23.9;26;40976;5.1152;0;1500;0;0;0;0;0;0;0
+24;26;40976;5.1152;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs27_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs27_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..5f25579439d10df6955bf607def8d73084880045
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs27_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+18;27;42016;5.332;1500;1500;0;0;0;0;0;0;0
+18.1;27;42016;5.332;1500;1500;0;0;0;0;0;0;0
+18.2;27;42016;5.332;1500;1500;0;0;0;0;0;0;0
+18.3;27;42016;5.332;1500;1500;0;0;0;0;0;0;0
+18.4;27;42016;5.332;1500;1500;0;0;0;0;0;0;0
+18.5;27;42016;5.332;1500;1500;0;0;0;0;0;0;0
+18.6;27;42016;5.332;1465;1500;0;0;0;0;0;0;0
+18.7;27;42016;5.332;1430;1500;0;0;0;0;0;0;0
+18.8;27;42016;5.332;1397;1500;0;0;0;0;0;0;0
+18.9;27;42016;5.332;1364;1500;0;0;0;0;0;0;0
+19;27;42016;5.332;1332;1500;0;0;0;0;0;0;0
+19.1;27;42016;5.332;1092;1500;0;0;0;0;0;0;0
+19.2;27;42016;5.332;896;1500;0;0;0;0;0;0;0
+19.3;27;42016;5.332;735;1500;0;0;0;0;0;0;0
+19.4;27;42016;5.332;603;1500;0;0;0;0;0;0;0
+19.5;27;42016;5.332;494;1500;0;0;0;0;0;0;0
+19.6;27;42016;5.332;572;1500;0;0;0;0;0;0;0
+19.7;27;42016;5.332;662;1500;0;0;0;0;0;0;0
+19.8;27;42016;5.332;766;1500;0;0;0;0;0;0;0
+19.9;27;42016;5.332;886;1500;0;0;0;0;0;0;0
+20;27;42016;5.332;1025;1500;0;0;0;0;0;0;0
+20.1;27;42016;5.332;1041;1500;0;0;0;0;0;0;0
+20.2;27;42016;5.332;1058;1500;0;0;0;0;0;0;0
+20.3;27;42016;5.332;1074;1500;0;0;0;0;0;0;0
+20.4;27;42016;5.332;1091;1500;0;0;0;0;0;0;0
+20.5;27;42016;5.332;1109;1500;0;0;0;0;0;0;0
+20.6;27;42016;5.332;811;1500;0;0;0;0;0;0;0
+20.7;27;42016;5.332;594;1500;0;0;0;0;0;0;0
+20.8;27;42016;5.332;434;1500;0;0;0;0;0;0;0
+20.9;27;42016;5.332;318;1500;0;0;0;0;0;0;0
+21;27;42016;5.332;233;1500;0;0;0;0;0;0;0
+21.1;27;42016;5.332;187;1500;0;0;0;0;0;0;0
+21.2;27;42016;5.332;150;1500;0;0;0;0;0;0;0
+21.3;27;42016;5.332;121;1500;0;0;0;0;0;0;0
+21.4;27;42016;5.332;97;1500;0;0;0;0;0;0;0
+21.5;27;42016;5.332;78;1500;0;0;0;0;0;0;0
+21.6;27;42016;5.332;78;1500;0;0;0;0;0;0;0
+21.7;27;42016;5.332;77;1500;0;0;0;0;0;0;0
+21.8;27;42016;5.332;76;1500;0;0;0;0;0;0;0
+21.9;27;42016;5.332;76;1500;0;0;0;0;0;0;0
+22;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.1;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.2;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.3;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.4;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.5;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.6;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.7;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.8;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+22.9;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+23;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+23.1;27;42016;5.332;75;1500;0;0;0;0;0;0;0
+23.2;27;42016;5.332;74;1500;0;0;0;0;0;0;0
+23.3;27;42016;5.332;74;1500;0;0;0;0;0;0;0
+23.4;27;42016;5.332;74;1500;0;0;0;0;0;0;0
+23.5;27;42016;5.332;74;1500;0;0;0;0;0;0;0
+23.6;27;42016;5.332;68;1500;0;0;0;0;0;0;0
+23.7;27;42016;5.332;63;1500;0;0;0;0;0;0;0
+23.8;27;42016;5.332;59;1500;0;0;0;0;0;0;0
+23.9;27;42016;5.332;55;1500;0;0;0;0;0;0;0
+24;27;42016;5.332;51;1500;0;0;0;0;0;0;0
+24.1;27;42016;5.332;38;1500;0;0;0;0;0;0;0
+24.2;27;42016;5.332;29;1500;0;0;0;0;0;0;0
+24.3;27;42016;5.332;21;1500;0;0;0;0;0;0;0
+24.4;27;42016;5.332;16;1500;0;0;0;0;0;0;0
+24.5;27;42016;5.332;12;1500;0;0;0;0;0;0;0
+24.6;27;42016;5.332;7;1500;0;0;0;0;0;0;0
+24.7;27;42016;5.332;4;1500;0;0;0;0;0;0;0
+24.8;27;42016;5.332;3;1500;0;0;0;0;0;0;0
+24.9;27;42016;5.332;2;1500;0;0;0;0;0;0;0
+25;27;42016;5.332;1;1500;0;0;0;0;0;0;0
+25.1;27;42016;5.332;1;1500;0;0;0;0;0;0;0
+25.2;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+25.3;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+25.4;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+25.5;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+25.6;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+25.7;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+25.8;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+25.9;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.1;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.2;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.3;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.4;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.5;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.6;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.7;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.8;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+26.9;27;42016;5.332;0;1500;0;0;0;0;0;0;0
+27;27;42016;5.332;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs28_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs28_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..edf6ef2e2c54c3aef3cab0220bbc896c7fb6b035
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs28_awgn_5G.csv
@@ -0,0 +1,92 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+18;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.1;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.2;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.3;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.4;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.5;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.6;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.7;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.8;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+18.9;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+19;28;44040;5.547;1500;1500;0;0;0;0;0;0;0
+19.1;28;44040;5.547;1499;1500;0;0;0;0;0;0;0
+19.2;28;44040;5.547;1498;1500;0;0;0;0;0;0;0
+19.3;28;44040;5.547;1498;1500;0;0;0;0;0;0;0
+19.4;28;44040;5.547;1497;1500;0;0;0;0;0;0;0
+19.5;28;44040;5.547;1496;1500;0;0;0;0;0;0;0
+19.6;28;44040;5.547;1429;1500;0;0;0;0;0;0;0
+19.7;28;44040;5.547;1366;1500;0;0;0;0;0;0;0
+19.8;28;44040;5.547;1305;1500;0;0;0;0;0;0;0
+19.9;28;44040;5.547;1247;1500;0;0;0;0;0;0;0
+20;28;44040;5.547;1191;1500;0;0;0;0;0;0;0
+20.1;28;44040;5.547;1234;1500;0;0;0;0;0;0;0
+20.2;28;44040;5.547;1279;1500;0;0;0;0;0;0;0
+20.3;28;44040;5.547;1325;1500;0;0;0;0;0;0;0
+20.4;28;44040;5.547;1373;1500;0;0;0;0;0;0;0
+20.5;28;44040;5.547;1423;1500;0;0;0;0;0;0;0
+20.6;28;44040;5.547;1426;1500;0;0;0;0;0;0;0
+20.7;28;44040;5.547;1429;1500;0;0;0;0;0;0;0
+20.8;28;44040;5.547;1432;1500;0;0;0;0;0;0;0
+20.9;28;44040;5.547;1435;1500;0;0;0;0;0;0;0
+21;28;44040;5.547;1438;1500;0;0;0;0;0;0;0
+21.1;28;44040;5.547;1207;1500;0;0;0;0;0;0;0
+21.2;28;44040;5.547;1014;1500;0;0;0;0;0;0;0
+21.3;28;44040;5.547;851;1500;0;0;0;0;0;0;0
+21.4;28;44040;5.547;715;1500;0;0;0;0;0;0;0
+21.5;28;44040;5.547;600;1500;0;0;0;0;0;0;0
+21.6;28;44040;5.547;418;1500;0;0;0;0;0;0;0
+21.7;28;44040;5.547;290;1500;0;0;0;0;0;0;0
+21.8;28;44040;5.547;202;1500;0;0;0;0;0;0;0
+21.9;28;44040;5.547;140;1500;0;0;0;0;0;0;0
+22;28;44040;5.547;98;1500;0;0;0;0;0;0;0
+22.1;28;44040;5.547;93;1500;0;0;0;0;0;0;0
+22.2;28;44040;5.547;88;1500;0;0;0;0;0;0;0
+22.3;28;44040;5.547;83;1500;0;0;0;0;0;0;0
+22.4;28;44040;5.547;79;1500;0;0;0;0;0;0;0
+22.5;28;44040;5.547;75;1500;0;0;0;0;0;0;0
+22.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+22.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+22.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+22.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.1;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.2;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.3;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.4;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.5;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+23.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.1;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.2;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.3;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.4;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.5;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+24.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.1;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.2;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.3;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.4;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.5;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+25.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.1;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.2;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.3;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.4;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.5;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+26.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0
+27;28;44040;5.547;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs2_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs2_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..2fbb6a20b973e1fcb5e934d999e4586b80d09040
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs2_awgn_5G.csv
@@ -0,0 +1,62 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-4;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.9;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.8;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.7;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.6;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.5;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.4;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.3;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.2;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3.1;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-3;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.9;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.8;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.7;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.6;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.5;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.4;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.3;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.2;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2.1;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-2;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-1.9;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-1.8;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-1.7;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-1.6;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-1.5;2;2976;0.377;1500;1500;0;0;0;0;0;0;0
+-1.4;2;2976;0.377;1486;1500;0;0;0;0;0;0;0
+-1.3;2;2976;0.377;1473;1500;0;0;0;0;0;0;0
+-1.2;2;2976;0.377;1459;1500;0;0;0;0;0;0;0
+-1.1;2;2976;0.377;1446;1500;0;0;0;0;0;0;0
+-1;2;2976;0.377;1432;1500;0;0;0;0;0;0;0
+-0.9;2;2976;0.377;1149;1500;0;0;0;0;0;0;0
+-0.8;2;2976;0.377;921;1500;0;0;0;0;0;0;0
+-0.7;2;2976;0.377;738;1500;0;0;0;0;0;0;0
+-0.6;2;2976;0.377;592;1500;0;0;0;0;0;0;0
+-0.5;2;2976;0.377;475;1500;0;0;0;0;0;0;0
+-0.4;2;2976;0.377;292;1500;0;0;0;0;0;0;0
+-0.3;2;2976;0.377;179;1500;0;0;0;0;0;0;0
+-0.2;2;2976;0.377;110;1500;0;0;0;0;0;0;0
+-0.1;2;2976;0.377;68;1500;0;0;0;0;0;0;0
+0;2;2976;0.377;42;1500;0;0;0;0;0;0;0
+0.1;2;2976;0.377;22;1500;0;0;0;0;0;0;0
+0.2;2;2976;0.377;11;1500;0;0;0;0;0;0;0
+0.3;2;2976;0.377;6;1500;0;0;0;0;0;0;0
+0.4;2;2976;0.377;3;1500;0;0;0;0;0;0;0
+0.5;2;2976;0.377;2;1500;0;0;0;0;0;0;0
+0.6;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+0.7;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+0.8;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+0.9;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.1;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.2;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.3;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.4;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.5;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.6;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.7;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.8;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+1.9;2;2976;0.377;0;1500;0;0;0;0;0;0;0
+2;2;2976;0.377;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs3_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs3_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..531c1548b093bdb58554e750106fd4e424ce77c0
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs3_awgn_5G.csv
@@ -0,0 +1,62 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-4;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.9;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.8;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.7;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.6;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.5;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.4;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.3;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.2;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3.1;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-3;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.9;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.8;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.7;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.6;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.5;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.4;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.3;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.2;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2.1;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-2;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.9;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.8;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.7;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.6;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.5;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.4;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.3;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.2;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1.1;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-1;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0
+-0.9;3;3912;0.4902;1499;1500;0;0;0;0;0;0;0
+-0.8;3;3912;0.4902;1498;1500;0;0;0;0;0;0;0
+-0.7;3;3912;0.4902;1496;1500;0;0;0;0;0;0;0
+-0.6;3;3912;0.4902;1495;1500;0;0;0;0;0;0;0
+-0.5;3;3912;0.4902;1494;1500;0;0;0;0;0;0;0
+-0.4;3;3912;0.4902;1322;1500;0;0;0;0;0;0;0
+-0.3;3;3912;0.4902;1169;1500;0;0;0;0;0;0;0
+-0.2;3;3912;0.4902;1034;1500;0;0;0;0;0;0;0
+-0.1;3;3912;0.4902;915;1500;0;0;0;0;0;0;0
+0;3;3912;0.4902;809;1500;0;0;0;0;0;0;0
+0.1;3;3912;0.4902;504;1500;0;0;0;0;0;0;0
+0.2;3;3912;0.4902;314;1500;0;0;0;0;0;0;0
+0.3;3;3912;0.4902;196;1500;0;0;0;0;0;0;0
+0.4;3;3912;0.4902;122;1500;0;0;0;0;0;0;0
+0.5;3;3912;0.4902;76;1500;0;0;0;0;0;0;0
+0.6;3;3912;0.4902;37;1500;0;0;0;0;0;0;0
+0.7;3;3912;0.4902;18;1500;0;0;0;0;0;0;0
+0.8;3;3912;0.4902;9;1500;0;0;0;0;0;0;0
+0.9;3;3912;0.4902;4;1500;0;0;0;0;0;0;0
+1;3;3912;0.4902;2;1500;0;0;0;0;0;0;0
+1.1;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+1.2;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+1.3;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+1.4;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+1.5;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+1.6;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+1.7;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+1.8;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+1.9;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
+2;3;3912;0.4902;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs4_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs4_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..033c81afafc73ffaeed895df9d7129fe83b2cc66
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs4_awgn_5G.csv
@@ -0,0 +1,62 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-1;4;4736;0.6016;1500;1500;0;0;0;0;0;0;0
+-0.9;4;4736;0.6016;1499;1500;0;0;0;0;0;0;0
+-0.8;4;4736;0.6016;1498;1500;0;0;0;0;0;0;0
+-0.7;4;4736;0.6016;1496;1500;0;0;0;0;0;0;0
+-0.6;4;4736;0.6016;1495;1500;0;0;0;0;0;0;0
+-0.5;4;4736;0.6016;1494;1500;0;0;0;0;0;0;0
+-0.4;4;4736;0.6016;1322;1500;0;0;0;0;0;0;0
+-0.3;4;4736;0.6016;1169;1500;0;0;0;0;0;0;0
+-0.2;4;4736;0.6016;1034;1500;0;0;0;0;0;0;0
+-0.1;4;4736;0.6016;915;1500;0;0;0;0;0;0;0
+0;4;4736;0.6016;809;1500;0;0;0;0;0;0;0
+0.1;4;4736;0.6016;504;1500;0;0;0;0;0;0;0
+0.2;4;4736;0.6016;314;1500;0;0;0;0;0;0;0
+0.3;4;4736;0.6016;196;1500;0;0;0;0;0;0;0
+0.4;4;4736;0.6016;122;1500;0;0;0;0;0;0;0
+0.5;4;4736;0.6016;76;1500;0;0;0;0;0;0;0
+0.6;4;4736;0.6016;37;1500;0;0;0;0;0;0;0
+0.7;4;4736;0.6016;18;1500;0;0;0;0;0;0;0
+0.8;4;4736;0.6016;9;1500;0;0;0;0;0;0;0
+0.9;4;4736;0.6016;4;1500;0;0;0;0;0;0;0
+1;4;4736;0.6016;2;1500;0;0;0;0;0;0;0
+1.1;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+1.2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+1.3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+1.4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+1.5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+1.6;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+1.7;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+1.8;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+1.9;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.1;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.6;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.7;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.8;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+2.9;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.1;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.6;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.7;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.8;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+3.9;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.1;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.6;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.7;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.8;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+4.9;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
+5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs5_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs5_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..f7419660164c4911dbe60b904fe321cdf1f85287
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs5_awgn_5G.csv
@@ -0,0 +1,62 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-1;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.9;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.8;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.7;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.6;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.5;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.4;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.3;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.2;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+-0.1;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+0;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0
+0.1;5;5888;0.7402;1499;1500;0;0;0;0;0;0;0
+0.2;5;5888;0.7402;1499;1500;0;0;0;0;0;0;0
+0.3;5;5888;0.7402;1498;1500;0;0;0;0;0;0;0
+0.4;5;5888;0.7402;1498;1500;0;0;0;0;0;0;0
+0.5;5;5888;0.7402;1497;1500;0;0;0;0;0;0;0
+0.6;5;5888;0.7402;1323;1500;0;0;0;0;0;0;0
+0.7;5;5888;0.7402;1170;1500;0;0;0;0;0;0;0
+0.8;5;5888;0.7402;1034;1500;0;0;0;0;0;0;0
+0.9;5;5888;0.7402;914;1500;0;0;0;0;0;0;0
+1;5;5888;0.7402;808;1500;0;0;0;0;0;0;0
+1.1;5;5888;0.7402;513;1500;0;0;0;0;0;0;0
+1.2;5;5888;0.7402;326;1500;0;0;0;0;0;0;0
+1.3;5;5888;0.7402;207;1500;0;0;0;0;0;0;0
+1.4;5;5888;0.7402;131;1500;0;0;0;0;0;0;0
+1.5;5;5888;0.7402;83;1500;0;0;0;0;0;0;0
+1.6;5;5888;0.7402;48;1500;0;0;0;0;0;0;0
+1.7;5;5888;0.7402;28;1500;0;0;0;0;0;0;0
+1.8;5;5888;0.7402;16;1500;0;0;0;0;0;0;0
+1.9;5;5888;0.7402;9;1500;0;0;0;0;0;0;0
+2;5;5888;0.7402;5;1500;0;0;0;0;0;0;0
+2.1;5;5888;0.7402;2;1500;0;0;0;0;0;0;0
+2.2;5;5888;0.7402;1;1500;0;0;0;0;0;0;0
+2.3;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+2.4;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+2.5;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+2.6;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+2.7;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+2.8;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+2.9;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.1;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.2;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.3;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.4;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.5;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.6;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.7;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.8;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+3.9;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.1;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.2;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.3;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.4;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.5;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.6;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.7;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.8;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+4.9;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
+5;5;5888;0.7402;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs6_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs6_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..350c53d695e25ff3c4387cd735d69c869c272911
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs6_awgn_5G.csv
@@ -0,0 +1,62 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-1;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.9;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.8;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.7;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.6;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.5;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.4;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.3;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.2;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+-0.1;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.1;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.2;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.3;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.4;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.5;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.6;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.7;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.8;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+0.9;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+1;6;6912;0.877;1500;1500;0;0;0;0;0;0;0
+1.1;6;6912;0.877;1493;1500;0;0;0;0;0;0;0
+1.2;6;6912;0.877;1487;1500;0;0;0;0;0;0;0
+1.3;6;6912;0.877;1480;1500;0;0;0;0;0;0;0
+1.4;6;6912;0.877;1473;1500;0;0;0;0;0;0;0
+1.5;6;6912;0.877;1467;1500;0;0;0;0;0;0;0
+1.6;6;6912;0.877;1117;1500;0;0;0;0;0;0;0
+1.7;6;6912;0.877;850;1500;0;0;0;0;0;0;0
+1.8;6;6912;0.877;648;1500;0;0;0;0;0;0;0
+1.9;6;6912;0.877;493;1500;0;0;0;0;0;0;0
+2;6;6912;0.877;376;1500;0;0;0;0;0;0;0
+2.1;6;6912;0.877;254;1500;0;0;0;0;0;0;0
+2.2;6;6912;0.877;172;1500;0;0;0;0;0;0;0
+2.3;6;6912;0.877;116;1500;0;0;0;0;0;0;0
+2.4;6;6912;0.877;79;1500;0;0;0;0;0;0;0
+2.5;6;6912;0.877;53;1500;0;0;0;0;0;0;0
+2.6;6;6912;0.877;32;1500;0;0;0;0;0;0;0
+2.7;6;6912;0.877;19;1500;0;0;0;0;0;0;0
+2.8;6;6912;0.877;11;1500;0;0;0;0;0;0;0
+2.9;6;6912;0.877;7;1500;0;0;0;0;0;0;0
+3;6;6912;0.877;4;1500;0;0;0;0;0;0;0
+3.1;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+3.2;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+3.3;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+3.4;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+3.5;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+3.6;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+3.7;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+3.8;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+3.9;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.1;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.2;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.3;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.4;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.5;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.6;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.7;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.8;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+4.9;6;6912;0.877;0;1500;0;0;0;0;0;0;0
+5;6;6912;0.877;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs7_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs7_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..9bd689cf0e4e87bc27d1fd69d8bd444bd1da8d7a
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs7_awgn_5G.csv
@@ -0,0 +1,62 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.9;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.8;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.7;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.6;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.5;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.4;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.3;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.2;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+-0.1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.2;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.3;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.4;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.5;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.6;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.7;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.8;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+0.9;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.2;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.3;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.4;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.5;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.6;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.7;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.8;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+1.9;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+2;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0
+2.1;7;8912;1.0273;1492;1500;0;0;0;0;0;0;0
+2.2;7;8912;1.0273;1484;1500;0;0;0;0;0;0;0
+2.3;7;8912;1.0273;1477;1500;0;0;0;0;0;0;0
+2.4;7;8912;1.0273;1469;1500;0;0;0;0;0;0;0
+2.5;7;8912;1.0273;1462;1500;0;0;0;0;0;0;0
+2.6;7;8912;1.0273;1159;1500;0;0;0;0;0;0;0
+2.7;7;8912;1.0273;919;1500;0;0;0;0;0;0;0
+2.8;7;8912;1.0273;729;1500;0;0;0;0;0;0;0
+2.9;7;8912;1.0273;578;1500;0;0;0;0;0;0;0
+3;7;8912;1.0273;458;1500;0;0;0;0;0;0;0
+3.1;7;8912;1.0273;319;1500;0;0;0;0;0;0;0
+3.2;7;8912;1.0273;222;1500;0;0;0;0;0;0;0
+3.3;7;8912;1.0273;155;1500;0;0;0;0;0;0;0
+3.4;7;8912;1.0273;108;1500;0;0;0;0;0;0;0
+3.5;7;8912;1.0273;75;1500;0;0;0;0;0;0;0
+3.6;7;8912;1.0273;48;1500;0;0;0;0;0;0;0
+3.7;7;8912;1.0273;30;1500;0;0;0;0;0;0;0
+3.8;7;8912;1.0273;19;1500;0;0;0;0;0;0;0
+3.9;7;8912;1.0273;12;1500;0;0;0;0;0;0;0
+4;7;8912;1.0273;8;1500;0;0;0;0;0;0;0
+4.1;7;8912;1.0273;4;1500;0;0;0;0;0;0;0
+4.2;7;8912;1.0273;2;1500;0;0;0;0;0;0;0
+4.3;7;8912;1.0273;1;1500;0;0;0;0;0;0;0
+4.4;7;8912;1.0273;0;1500;0;0;0;0;0;0;0
+4.5;7;8912;1.0273;0;1500;0;0;0;0;0;0;0
+4.6;7;8912;1.0273;0;1500;0;0;0;0;0;0;0
+4.7;7;8912;1.0273;0;1500;0;0;0;0;0;0;0
+4.8;7;8912;1.0273;0;1500;0;0;0;0;0;0;0
+4.9;7;8912;1.0273;0;1500;0;0;0;0;0;0;0
+5;7;8912;1.0273;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs8_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs8_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..470cce69ae6471e94a8b0371471c5a82abf61da2
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs8_awgn_5G.csv
@@ -0,0 +1,62 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.9;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.8;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.7;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.6;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.5;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.4;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+-0.1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.4;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.5;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.6;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.7;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.8;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+0.9;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.4;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.5;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.6;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.7;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.8;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+1.9;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.4;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.5;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.6;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.7;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.8;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+2.9;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0
+3.1;8;9224;1.1758;1464;1500;0;0;0;0;0;0;0
+3.2;8;9224;1.1758;1429;1500;0;0;0;0;0;0;0
+3.3;8;9224;1.1758;1394;1500;0;0;0;0;0;0;0
+3.4;8;9224;1.1758;1361;1500;0;0;0;0;0;0;0
+3.5;8;9224;1.1758;1328;1500;0;0;0;0;0;0;0
+3.6;8;9224;1.1758;973;1500;0;0;0;0;0;0;0
+3.7;8;9224;1.1758;713;1500;0;0;0;0;0;0;0
+3.8;8;9224;1.1758;522;1500;0;0;0;0;0;0;0
+3.9;8;9224;1.1758;382;1500;0;0;0;0;0;0;0
+4;8;9224;1.1758;280;1500;0;0;0;0;0;0;0
+4.1;8;9224;1.1758;190;1500;0;0;0;0;0;0;0
+4.2;8;9224;1.1758;129;1500;0;0;0;0;0;0;0
+4.3;8;9224;1.1758;87;1500;0;0;0;0;0;0;0
+4.4;8;9224;1.1758;59;1500;0;0;0;0;0;0;0
+4.5;8;9224;1.1758;40;1500;0;0;0;0;0;0;0
+4.6;8;9224;1.1758;20;1500;0;0;0;0;0;0;0
+4.7;8;9224;1.1758;10;1500;0;0;0;0;0;0;0
+4.8;8;9224;1.1758;5;1500;0;0;0;0;0;0;0
+4.9;8;9224;1.1758;2;1500;0;0;0;0;0;0;0
+5;8;9224;1.1758;1;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs9_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs9_awgn_5G.csv
new file mode 100644
index 0000000000000000000000000000000000000000..2ba438ea490254885ecb7ae3545af999545a8eaa
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs9_awgn_5G.csv
@@ -0,0 +1,64 @@
+SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err
+-1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.9;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.8;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.7;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+-0.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.7;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.8;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+0.9;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.7;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.8;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+1.9;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.7;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.8;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+2.9;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+3.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+3.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+3.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+3.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+3.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+3.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0
+3.7;9;10504;1.3262;1499;1500;0;0;0;0;0;0;0
+3.8;9;10504;1.3262;1499;1500;0;0;0;0;0;0;0
+3.9;9;10504;1.3262;1499;1500;0;0;0;0;0;0;0
+4;9;10504;1.3262;1498;1500;0;0;0;0;0;0;0
+4.1;9;10504;1.3262;1339;1500;0;0;0;0;0;0;0
+4.2;9;10504;1.3262;1196;1500;0;0;0;0;0;0;0
+4.3;9;10504;1.3262;1068;1500;0;0;0;0;0;0;0
+4.4;9;10504;1.3262;955;1500;0;0;0;0;0;0;0
+4.5;9;10504;1.3262;853;1500;0;0;0;0;0;0;0
+4.6;9;10504;1.3262;552;1500;0;0;0;0;0;0;0
+4.7;9;10504;1.3262;357;1500;0;0;0;0;0;0;0
+4.8;9;10504;1.3262;231;1500;0;0;0;0;0;0;0
+4.9;9;10504;1.3262;149;1500;0;0;0;0;0;0;0
+5;9;10504;1.3262;96;1500;0;0;0;0;0;0;0
+5.1;9;10504;1.3262;0;1500;0;0;0;0;0;0;0
+5.2;9;10504;1.3262;0;1500;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 494c4e8e1dfa051edf8a6c4a72a27d4971491270..8f6a453ee5700339b88e3f116e7231edc7043196 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -239,6 +239,8 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t     module_idP,
   return 0;
 }
 
+nr_bler_struct nr_bler_data[NR_NUM_MCS];
+
 void processSlotTX(void *arg) {}
 
 //nFAPI P7 dummy functions to avoid linking errors 
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index bc4f4a0b60a33b22bc59b911628c9d3646890d68..f255ab53371c909e4aa387ae87798cb02d03b816 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -223,6 +223,8 @@ nrUE_params_t *get_nrUE_params(void) {
   return &nrUE_params;
 }
 
+nr_bler_struct nr_bler_data[NR_NUM_MCS];
+
 void processSlotTX(void *arg) {}
 
 int main(int argc, char **argv){
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 5d842a047781e6f8d02c2b03384c999169e6a5da..05dec6c6be2559fa9a5163a7afe418e2ad548fee 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -221,6 +221,8 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t     module_idP,
   return 0;
 }
 
+nr_bler_struct nr_bler_data[NR_NUM_MCS];
+
 //nFAPI P7 dummy functions
 
 int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);  }
diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h
index c24291de645460de2e063368cfb0566c82e54273..67300da308b92ed05e7f901ae15436794f675826 100644
--- a/openair2/COMMON/platform_types.h
+++ b/openair2/COMMON/platform_types.h
@@ -233,6 +233,7 @@ typedef uint8_t            pdusessionid_t;
 //-----------------------------------------------------------------------------
 // may be ITTI not enabled, but type instance is useful also for OTG,
 typedef intptr_t instance_t;
+
 typedef struct protocol_ctxt_s {
   module_id_t module_id;     /*!< \brief  Virtualized module identifier      */
   eNB_flag_t  enb_flag;      /*!< \brief  Flag to indicate eNB (1) or UE (0) */
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index 6b41970735d140ee46c882eb95ca8e1a1e21decc..ac70dee0928f4d9586495938d6f50d375adf6cf5 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -427,6 +427,7 @@ typedef struct NRRrcConfigurationReq_s {
   bool                    force_256qam_off;
   int                     pusch_TargetSNRx10;
   int                     pucch_TargetSNRx10;
+  bool                    enable_sdap;
 } gNB_RrcConfigurationReq;
 
 typedef struct NRDuDlReq_s {
diff --git a/openair2/F1AP/dummy_enb.c b/openair2/F1AP/dummy_enb.c
index d54f9b8df7b21bb90ec9ea8ca182f785e7e20787..9085fdb57cd772eb39319199540f2a22817a94da 100644
--- a/openair2/F1AP/dummy_enb.c
+++ b/openair2/F1AP/dummy_enb.c
@@ -32,16 +32,18 @@ void apply_macrlc_config(gNB_RRC_INST *rrc,
   abort();
 }
 
-boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p,
-                            const srb_flag_t srb_flag,
-                            const rb_id_t rb_id,
-                            const mui_t mui,
-                            const confirm_t confirm,
-                            const sdu_size_t sdu_buffer_size,
-                            unsigned char *const sdu_buffer,
-                            const pdcp_transmission_mode_t pt_mode,
-                            const uint32_t *sourceL2Id,
-                            const uint32_t *destinationL2Id
-                           ) {
+boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p,
+                        const srb_flag_t srb_flag,
+                        const rb_id_t rb_id,
+                        const mui_t mui,
+                        const confirm_t confirm,
+                        const sdu_size_t sdu_buffer_size,
+                        unsigned char *const sdu_buffer,
+                        const pdcp_transmission_mode_t pt_mode,
+                        const uint32_t *sourceL2Id,
+                        const uint32_t *destinationL2Id,
+                        const uint8_t qfi,
+                        const boolean_t rqi,
+                        const int pdusession_id) {
 abort();
 }
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index d3ae4e3828771553a754d84754598d6e5b19c9a3..305ccdf91371ea6e6a1f5faefc51f3e8dfc1f94f 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -1187,7 +1187,9 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
         LOG_I(RRC, "256 QAM: %s\n", NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off ? "force off" : "may be on");
         NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
         NRRRC_CONFIGURATION_REQ (msg_p).scd = scd;
-	  
+	    NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap = *GNBParamList.paramarray[i][GNB_ENABLE_SDAP_IDX].iptr;
+        LOG_I(GNB_APP, "SDAP layer is %s\n", NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap ? "enabled" : "disabled");
+        
       }//
     }//End for (k=0; k <num_gnbs ; k++)
     memcpy(&rrc->configuration, &NRRRC_CONFIGURATION_REQ(msg_p), sizeof(NRRRC_CONFIGURATION_REQ(msg_p)));
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index e1d3d93d0b2f91d569e127fc122e518e5779d9f8..eb6b2bdccd4a7fa2a6093ab0cf2077e76ea46728 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -125,7 +125,8 @@ typedef enum {
 #define GNB_CONFIG_STRING_MINRXTXTIME                   "min_rxtxtime"
 #define GNB_CONFIG_STRING_ULPRBBLACKLIST                "ul_prbblacklist"
 #define GNB_CONFIG_STRING_FORCE256QAMOFF                "force_256qam_off"
-
+#define GNB_CONFIG_STRING_ENABLE_SDAP                   "enable_sdap"
+#define GNB_CONFIG_HLP_STRING_ENABLE_SDAP               "enable the SDAP layer\n"
 
 #define GNB_CONFIG_HLP_FORCE256QAMOFF                   "suppress activation of 256 QAM despite UE support"
 
@@ -159,7 +160,8 @@ typedef enum {
 {GNB_CONFIG_STRING_NRCELLID,                     NULL,   0,            u64ptr:NULL, defint64val:1,               TYPE_UINT64,    0},  \
 {GNB_CONFIG_STRING_MINRXTXTIME,                  NULL,   0,            iptr:NULL,   defintval:2,                 TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_ULPRBBLACKLIST,               NULL,   0,            strptr:NULL, defstrval:"",                TYPE_STRING,    0},  \
-{GNB_CONFIG_STRING_FORCE256QAMOFF, GNB_CONFIG_HLP_FORCE256QAMOFF, PARAMFLAG_BOOL, iptr:NULL, defintval:0,        TYPE_INT,       0}   \
+{GNB_CONFIG_STRING_FORCE256QAMOFF, GNB_CONFIG_HLP_FORCE256QAMOFF, PARAMFLAG_BOOL, iptr:NULL, defintval:0,        TYPE_INT,       0},  \
+{GNB_CONFIG_STRING_ENABLE_SDAP, GNB_CONFIG_HLP_STRING_ENABLE_SDAP, PARAMFLAG_BOOL, iptr:NULL, defintval:0,       TYPE_INT,       0},  \
 }
 
 #define GNB_GNB_ID_IDX                  0
@@ -188,6 +190,7 @@ typedef enum {
 #define GNB_MINRXTXTIME_IDX             23
 #define GNB_ULPRBBLACKLIST_IDX          24
 #define GNB_FORCE256QAMOFF_IDX          25
+#define GNB_ENABLE_SDAP_IDX             26
 
 #define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
 #define GNBPARAMS_CHECK {                                         \
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index ba3128923fb32e86895f99fd183a7ec179db9619..9dd03ddcf6bdbf708874298260b4c8aae8a55164 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -39,6 +39,7 @@
 #include <stdbool.h>
 
 #include "NR_SubcarrierSpacing.h"
+#include "openair1/SCHED_NR_UE/harq_nr.h"
 
 #define NR_SHORT_BSR_TABLE_SIZE 32
 #define NR_LONG_BSR_TABLE_SIZE 256
@@ -264,14 +265,29 @@ typedef struct {
   uint8_t nbits;
 } dci_field_t;
 
+typedef struct {
+  /* The active harq sfn/slot field was created to save the
+     scheduled SFN/Slot transmission for the ACK/NAK. If we
+     do not save it, then we have to calculate it again as the
+     NRUE MAC layer already does in get_downlink_ack(). */
+  int active_dl_harq_sfn;
+  int active_dl_harq_slot;
+  int active_ul_harq_sfn_slot;
+  bool active;
+} emul_l1_harq_t;
+
 typedef struct {
   bool expected_sib;
-  bool index_has_sib[16];
+  bool index_has_sib[NR_MAX_HARQ_PROCESSES];
   bool expected_rar;
-  bool index_has_rar[16];
+  bool index_has_rar[NR_MAX_HARQ_PROCESSES];
   bool expected_dci;
-  bool index_has_dci[16];
-  int active_harq_sfn_slot;
+  bool index_has_dci[NR_MAX_HARQ_PROCESSES];
+  emul_l1_harq_t harq[NR_MAX_HARQ_PROCESSES];
+  int active_uci_sfn_slot;
+  int num_srs;
+  int num_harqs;
+  int num_csi_reports;
 } nr_emulated_l1_t;
 
 typedef struct {
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index ad86b1385df114294fbe2f131a9a568c75f06a38..fc2c2d2c8b7d6e4c08da99577f8bf748c0039d0a 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -432,7 +432,7 @@ typedef struct {
 
   // Defined for abstracted mode
   nr_downlink_indication_t dl_info;
-  NR_UE_HARQ_STATUS_t dl_harq_info[16];
+  NR_UE_HARQ_STATUS_t dl_harq_info[NR_MAX_HARQ_PROCESSES];
 
   nr_emulated_l1_t nr_ue_emul_l1;
 
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 35ca15aa316a0f0b790a305348dcc158e83ea873..4b7635929c49edc6093bf6a42aa52c98730be4bf 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -1368,10 +1368,18 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
   // FIXME k0 != 0 currently not taken into consideration
   current_harq->dl_frame = frame;
   current_harq->dl_slot = slot;
-  mac->nr_ue_emul_l1.active_harq_sfn_slot = NFAPI_SFNSLOT2HEX(frame, (slot + data_toul_fb));
+  if (get_softmodem_params()->emulate_l1) {
+    int scs = get_softmodem_params()->numerology;
+    int slots_per_frame = nr_slots_per_frame[scs];
+    slot += data_toul_fb;
+    if (slot >= slots_per_frame) {
+      frame = (frame + 1) % 1024;
+      slot %= slots_per_frame;
+    }
+  }
 
   LOG_D(NR_PHY,"Setting harq_status for harq_id %d, dl %d.%d, sched ul %d.%d\n",
-        harq_id, frame, slot, frame, (slot + data_toul_fb));
+        harq_id, current_harq->dl_frame, current_harq->dl_slot, frame, slot);
 }
 
 
@@ -1853,7 +1861,8 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) {
          mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
          mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList &&
          mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL)) {
-      if (uci_size <= 2) {
+      // PUCCH with format0 can be up to 3 bits (2 ack/nacks + 1 sr is 3 max bits)
+      if (uci_size <= 3) {
         pucch_resource_set_id = 0;
         return (pucch_resource_set_id);
         break;
@@ -2054,11 +2063,17 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
         sched_frame = current_harq->dl_frame;
         if (sched_slot>=slots_per_frame){
           sched_slot %= slots_per_frame;
-          sched_frame++;
+          sched_frame = (sched_frame + 1) % 1024;
         }
+        AssertFatal(sched_slot < slots_per_frame, "sched_slot was calculated incorrect %d\n", sched_slot);
         LOG_D(PHY,"HARQ pid %d is active for %d.%d (dl_slot %d, feedback_to_ul %d, is_common %d\n",dl_harq_pid, sched_frame,sched_slot,current_harq->dl_slot,current_harq->feedback_to_ul,current_harq->is_common);
         /* check if current tx slot should transmit downlink acknowlegment */
         if (sched_frame == frame && sched_slot == slot) {
+          if (get_softmodem_params()->emulate_l1) {
+            mac->nr_ue_emul_l1.harq[dl_harq_pid].active = true;
+            mac->nr_ue_emul_l1.harq[dl_harq_pid].active_dl_harq_sfn = frame;
+            mac->nr_ue_emul_l1.harq[dl_harq_pid].active_dl_harq_slot = slot;
+          }
 
           if (current_harq->dai > NR_DL_MAX_DAI) {
             LOG_E(MAC,"PUCCH Downlink DAI has an invalid value : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 347165ba0d98de155ea8c3a060999fecf906f710..d2532cfff81c41e77fb7f11ceb4ea48b4baf934b 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -1080,6 +1080,10 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
         if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
           mac->if_module->scheduled_response(&scheduled_response);
       }
+      else
+      {
+        dl_config->number_pdus = 0;
+      }
     }
   } else if (ul_info) {
 
@@ -2252,26 +2256,27 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in
   int O_CSI = 0;
   int N_UCI = 0;
 
-  PUCCH_sched_t *pucch = calloc(1,sizeof(*pucch));
-  pucch->resource_indicator = -1;
-  pucch->initial_pucch_id = -1;
+  PUCCH_sched_t pucch = {
+    .resource_indicator = -1,
+    .initial_pucch_id = -1
+  };
   uint16_t rnti = mac->crnti;  //FIXME not sure this is valid for all pucch instances
 
   // SR
-  if(trigger_periodic_scheduling_request(mac, pucch, frameP, slotP)) {
+  if (trigger_periodic_scheduling_request(mac, &pucch, frameP, slotP)) {
     O_SR = 1;
     /* sr_payload = 1 means that this is a positive SR, sr_payload = 0 means that it is a negative SR */
-    pucch->sr_payload = nr_ue_get_SR(module_idP,
+    pucch.sr_payload = nr_ue_get_SR(module_idP,
                                      frameP,
                                      slotP);
   }
 
   // CSI
   if (mac->ra.ra_state == RA_SUCCEEDED || get_softmodem_params()->phy_test == 1)
-    O_CSI = nr_get_csi_measurements(mac, frameP, slotP, pucch);
+    O_CSI = nr_get_csi_measurements(mac, frameP, slotP, &pucch);
 
   // ACKNACK
-  O_ACK = get_downlink_ack(mac, frameP, slotP, pucch);
+  O_ACK = get_downlink_ack(mac, frameP, slotP, &pucch);
 
   NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
   NR_PUCCH_Config_t *pucch_Config = NULL;
@@ -2301,35 +2306,39 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in
       pucch_Config->format2 &&
       (pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI == NULL)) {
     O_CSI = 0;
-    pucch->csi_part1_payload = 0;
-    pucch->csi_part2_payload = 0;
+    pucch.csi_part1_payload = 0;
+    pucch.csi_part2_payload = 0;
   }
 
   N_UCI = O_SR + O_ACK + O_CSI;
+  mac->nr_ue_emul_l1.num_srs = O_SR;
+  mac->nr_ue_emul_l1.num_harqs = O_ACK;
+  mac->nr_ue_emul_l1.num_csi_reports = O_CSI;
 
   // do no transmit pucch if only SR scheduled and it is negative
-  if ((O_ACK + O_CSI) == 0 && pucch->sr_payload == 0)
+  if ((O_ACK + O_CSI) == 0 && pucch.sr_payload == 0)
     return;
 
   if (N_UCI > 0) {
     LOG_D(NR_MAC,"%d.%d configure pucch, O_SR %d, O_ACK %d, O_CSI %d\n",frameP,slotP,O_SR,O_ACK,O_CSI);
-    pucch->resource_set_id = find_pucch_resource_set(mac, O_ACK + O_CSI);
-    select_pucch_resource(mac, pucch);
+    pucch.resource_set_id = find_pucch_resource_set(mac, O_ACK + O_CSI);
+    select_pucch_resource(mac, &pucch);
     fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP);
     pthread_mutex_lock(&ul_config->mutex_ul_config);
     AssertFatal(ul_config->number_pdus<FAPI_NR_UL_CONFIG_LIST_NUM, "ul_config->number_pdus %d out of bounds\n",ul_config->number_pdus);
     fapi_nr_ul_config_pucch_pdu *pucch_pdu = &ul_config->ul_config_list[ul_config->number_pdus].pucch_config_pdu;
 
     fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PUCCH);
+    mac->nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2HEX(frameP, slotP);
     pthread_mutex_unlock(&ul_config->mutex_ul_config);
 
     nr_ue_configure_pucch(mac,
                           slotP,
                           rnti,
-                          pucch,
+                          &pucch,
                           pucch_pdu,
                           O_SR, O_ACK, O_CSI);
-    LOG_D(NR_MAC,"Configuring pucch, is_common = %d\n",pucch->is_common);
+    LOG_D(NR_MAC, "Configuring pucch, is_common = %d\n", pucch.is_common);
     nr_scheduled_response_t scheduled_response;
     fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, thread_id);
     if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 50146c34f696582bd8a2881f4ef67a81f79041c8..3aed66aee0b50b57e1292462c37c442c50286391 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -300,6 +300,8 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
                               (RA_sfn_index + slot_index) * N_t_slot * fdm + td_index * fdm + fdm_index;
 
           if((prach_occasion_id < cc->total_prach_occasions) && (td_index == 0)){
+            AssertFatal(UL_tti_req->n_pdus < sizeof(UL_tti_req->pdus_list) / sizeof(UL_tti_req->pdus_list[0]),
+                        "Invalid UL_tti_req->n_pdus %d\n", UL_tti_req->n_pdus);
 
             UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE;
             UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_prach_pdu_t);
@@ -803,6 +805,9 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
                 future_ul_tti_req->Slot,
                 sched_frame,
                 sched_slot);
+    AssertFatal(future_ul_tti_req->n_pdus <
+                sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]),
+                "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus);
     future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE;
     future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
     nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
index a2b27357dd99dbee1883860d753e7a512986bf28..bf2af3b388f19ad92fd13976c99fef86a72e7fd0 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
@@ -85,7 +85,9 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int
 void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) {
 
   nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][slot];
-
+  AssertFatal(future_ul_tti_req->n_pdus <
+              sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]),
+              "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus);
   future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE;
   future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_srs_pdu_t);
   nfapi_nr_srs_pdu_t *srs_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].srs_pdu;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 6ca2e10bfead26527448e9cd7b8d23667f883d95..66ee5ab5a3c2f874dc55235f3fc0adf7ecc1acb3 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -56,6 +56,9 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
               future_ul_tti_req->Slot,
               pucch->frame,
               pucch->ul_slot);
+  AssertFatal(future_ul_tti_req->n_pdus <
+              sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]),
+              "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus);
   future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
   future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
   nfapi_nr_pucch_pdu_t *pucch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pucch_pdu;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 4007748d9e884689418dccf3d263b220015bb7d7..b5f98f955a45d8fc2f579700739eb4fd1585676c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -279,9 +279,18 @@ int nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_L_TRUNCATED_BSR:
         	//38.321 section 6.1.3.1
         	//variable length
+                /* Several checks have been added to this function to
+                   ensure that the casting of the pduP is possible. There seems
+                   to be a partial PDU at the end of this buffer, so here
+                   we gracefully ignore that by returning 0. See:
+                   https://gitlab.eurecom.fr/oai/openairinterface5g/-/issues/534 */
+                if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT))
+                        return 0;
         	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
         	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+                        if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG))
+                                return 0;
         		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
@@ -358,9 +367,13 @@ int nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_MULTI_ENTRY_PHR_1_OCT:
         	//38.321 section 6.1.3.9
         	//  varialbe length
+                if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT))
+                        return 0;
         	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
         	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+                        if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG))
+                                return 0;
         		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
@@ -370,9 +383,13 @@ int nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT:
         	//38.321 section 6.1.3.9
         	//  varialbe length
+                if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT))
+                        return 0;
         	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
         	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+                        if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG))
+                                return 0;
         		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
@@ -386,8 +403,12 @@ int nr_process_mac_pdu(module_id_t module_idP,
 
         case UL_SCH_LCID_SRB1:
         case UL_SCH_LCID_SRB2:
+          if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT))
+                return 0;
           if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
             //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+            if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG))
+                  return 0;
             mac_subheader_len = 3;
             mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
                 | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
@@ -471,8 +492,12 @@ int nr_process_mac_pdu(module_id_t module_idP,
 
         case UL_SCH_LCID_DTCH:
           //  check if LCID is valid at current time.
+          if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT))
+                return 0;
           if (((NR_MAC_SUBHEADER_SHORT *)pduP)->F) {
             // mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+            if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG))
+                  return 0;
             mac_subheader_len = 3;
             mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L1 & 0x7f) << 8)
                           | ((uint16_t)((NR_MAC_SUBHEADER_LONG *)pduP)->L2 & 0xff);
@@ -1778,6 +1803,9 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
                 future_ul_tti_req->Slot,
                 sched_pusch->frame,
                 sched_pusch->slot);
+    AssertFatal(future_ul_tti_req->n_pdus <
+                sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]),
+                "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus);
     future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE;
     future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
     nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu;
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
index 62aa101a500534a1837579157b0825f0ee321cb4..c20871f6c0422c13a0193c1b7f83a1919d9e3172 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c
@@ -51,7 +51,12 @@ static void nr_pdcp_entity_recv_pdu(nr_pdcp_entity_t *entity,
 
   if (entity->type != NR_PDCP_SRB && !(buffer[0] & 0x80)) {
     LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
-    exit(1);
+    /* TODO: This is something of a hack. The most significant bit
+       in buffer[0] should be 1 if the packet is a data packet. We are
+       processing malformed data packets if the most significant bit
+       is 0. Rather than exit(1), this hack allows us to continue for now.
+       We need to investigate why this hack is neccessary. */
+    buffer[0] |= 128;
   }
 
   if (entity->sn_size == 12) {
@@ -368,8 +373,8 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
   ret->set_security = nr_pdcp_entity_set_security;
   ret->set_time     = nr_pdcp_entity_set_time;
 
-  ret->delete = nr_pdcp_entity_delete;
-
+  ret->delete_entity = nr_pdcp_entity_delete;
+  
   ret->deliver_sdu = deliver_sdu;
   ret->deliver_sdu_data = deliver_sdu_data;
 
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
index fbcc2b96cd37d31cb35a02277721b4da6dee85d0..49e9c4142b5da3885d18e9bb2c809e23d3cd7164 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
@@ -39,7 +39,7 @@ typedef struct nr_pdcp_entity_t {
   void (*recv_pdu)(struct nr_pdcp_entity_t *entity, char *buffer, int size);
   void (*recv_sdu)(struct nr_pdcp_entity_t *entity, char *buffer, int size,
                    int sdu_id);
-  void (*delete)(struct nr_pdcp_entity_t *entity);
+  void (*delete_entity)(struct nr_pdcp_entity_t *entity);
 
   /* set_security: pass -1 to integrity_algorithm / ciphering_algorithm
    *               to keep the current algorithm
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index 7d1e2f493184ae675882b8f2aeaa900506b6b37e..74ca77a9c53c34ab8a11153b148a245cd4a520e1 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -36,7 +36,7 @@
 #include "pdcp.h"
 #include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
 #include <openair3/ocp-gtpu/gtp_itf.h>
-#include "openair2/SDAP/nr_sdap/nr_sdap_gnb.h"
+#include "openair2/SDAP/nr_sdap/nr_sdap.h"
 
 #define TODO do { \
     printf("%s:%d:%s: todo\n", __FILE__, __LINE__, __FUNCTION__); \
@@ -438,9 +438,13 @@ static void *enb_tun_read_thread(void *_)
 
     ctxt.rnti = rnti;
 
-    pdcp_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED,
+    uint8_t qfi = 7;
+    boolean_t rqi = 0;
+    int pdusession_id = 10;
+
+    sdap_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED,
                   RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf,
-                  PDCP_TRANSMISSION_MODE_DATA, NULL, NULL);
+                  PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, qfi, rqi, pdusession_id);
   }
 
   return NULL;
@@ -481,9 +485,13 @@ static void *ue_tun_read_thread(void *_)
 
     ctxt.rnti = rnti;
 
-    pdcp_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED,
+    boolean_t dc = SDAP_HDR_UL_DATA_PDU;
+    uint8_t qfi = 7;
+    int pdusession_id = 10;
+
+    sdap_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED,
                   RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf,
-                  PDCP_TRANSMISSION_MODE_DATA, NULL, NULL);
+                  PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, qfi, dc, pdusession_id);
   }
 
   return NULL;
@@ -607,28 +615,20 @@ uint64_t nr_pdcp_module_init(uint64_t _pdcp_optmask, int id)
 static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
                             char *buf, int size)
 {
-  extern int nas_sock_fd[];
-  int len;
   nr_pdcp_ue_t *ue = _ue;
-  MessageDef  *message_p;
-  uint8_t     *gtpu_buffer_p;
   int rb_id;
   int i;
 
   if (IS_SOFTMODEM_NOS1 || UE_NAS_USE_TUN) {
-    LOG_D(PDCP, "IP packet received, to be sent to TUN interface");
-
-    if(entity->has_sdapDLheader){
-      size -= SDAP_HDR_LENGTH;
-      len = write(nas_sock_fd[0], &buf[SDAP_HDR_LENGTH], size);
-    } else {
-      len = write(nas_sock_fd[0], buf, size);
-    }
-
-    if (len != size) {
-      LOG_E(PDCP, "%s:%d:%s: fatal error %d: %s\n", __FILE__, __LINE__, __FUNCTION__, errno, strerror(errno));
-    }
-    
+    LOG_D(PDCP, "IP packet received with size %d, to be sent to SDAP interface, UE rnti: %d\n", size, ue->rnti);
+    sdap_data_ind(entity->rb_id,
+                  entity->is_gnb,
+                  entity->has_sdap,
+                  entity->has_sdapULheader,
+                  entity->pdusession_id,
+                  ue->rnti,
+                  buf,
+                  size);
   }
   else{
     for (i = 0; i < 5; i++) {
@@ -644,31 +644,16 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
 
     rb_found:
     {
-      int offset=0;
-      if (entity->has_sdap == 1 && entity->has_sdapULheader == 1)
-	offset = 1; // this is the offset of the SDAP header in bytes
-
-      message_p = itti_alloc_new_message_sized(TASK_PDCP_ENB, 0,
-					       GTPV1U_GNB_TUNNEL_DATA_REQ,
-					       sizeof(gtpv1u_gnb_tunnel_data_req_t) + size
-					       + GTPU_HEADER_OVERHEAD_MAX - offset);
-      AssertFatal(message_p != NULL, "OUT OF MEMORY");
-
-      gtpv1u_gnb_tunnel_data_req_t *req=&GTPV1U_GNB_TUNNEL_DATA_REQ(message_p);
-      gtpu_buffer_p = (uint8_t*)(req+1);
-      memcpy(gtpu_buffer_p+GTPU_HEADER_OVERHEAD_MAX, buf+offset, size-offset);
-      req->buffer              = gtpu_buffer_p;
-      req->length              = size-offset;
-      req->offset              = GTPU_HEADER_OVERHEAD_MAX;
-      req->rnti                = ue->rnti;
-      req->pdusession_id       = entity->pdusession_id;
-      if (offset==1) {
-        LOG_I(PDCP, "%s() (drb %d) SDAP header %2x\n",__func__, rb_id, buf[0]);
-        sdap_gnb_ul_header_handler(buf[0]); // Handler for the UL gNB SDAP Header
-      }
-      LOG_D(PDCP, "%s() (drb %d) sending message to gtp size %d\n", __func__, rb_id, size-offset);
-      itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p);
-   }
+      LOG_D(PDCP, "%s() (drb %d) sending message to SDAP size %d\n", __func__, rb_id, size);
+      sdap_data_ind(rb_id,
+                    ue->drb[rb_id-1]->is_gnb,
+                    ue->drb[rb_id-1]->has_sdap,
+                    ue->drb[rb_id-1]->has_sdapULheader,
+                    ue->drb[rb_id-1]->pdusession_id,
+                    ue->rnti,
+                    buf,
+                    size);
+    }
   }
 }
 
@@ -967,6 +952,9 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
   int has_sdap = 0;
   int has_sdapULheader=0;
   int has_sdapDLheader=0;
+  boolean_t is_sdap_DefaultDRB = false;
+  NR_QFI_t *mappedQFIs2Add = NULL;
+  uint8_t mappedQFIs2AddCount=0;
   if (s->cnAssociation->present == NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
      pdusession_id = s->cnAssociation->choice.eps_BearerIdentity;
   else {
@@ -975,9 +963,13 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
       exit(-1);
     }
     pdusession_id = s->cnAssociation->choice.sdap_Config->pdu_Session;
-    has_sdap = 1;
     has_sdapULheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderUL == NR_SDAP_Config__sdap_HeaderUL_present ? 1 : 0;
     has_sdapDLheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderDL == NR_SDAP_Config__sdap_HeaderDL_present ? 1 : 0;
+    has_sdap = has_sdapULheader | has_sdapDLheader;
+    is_sdap_DefaultDRB = s->cnAssociation->choice.sdap_Config->defaultDRB == true ? 1 : 0;
+    mappedQFIs2Add = (NR_QFI_t*)s->cnAssociation->choice.sdap_Config->mappedQoS_FlowsToAdd->list.array[0]; 
+    mappedQFIs2AddCount = s->cnAssociation->choice.sdap_Config->mappedQoS_FlowsToAdd->list.count;
+    LOG_D(SDAP, "Captured mappedQoS_FlowsToAdd from RRC: %ld \n", *mappedQFIs2Add);
   }
   /* TODO(?): accept different UL and DL SN sizes? */
   if (sn_size_ul != sn_size_dl) {
@@ -1009,6 +1001,15 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
     nr_pdcp_ue_add_drb_pdcp_entity(ue, drb_id, pdcp_drb);
 
     LOG_D(PDCP, "%s:%d:%s: added drb %d to ue rnti %x\n", __FILE__, __LINE__, __FUNCTION__, drb_id, rnti);
+
+    new_nr_sdap_entity(has_sdap,
+                       rnti,
+                       pdusession_id,
+                       is_sdap_DefaultDRB,
+                       drb_id,
+                       mappedQFIs2Add,
+                       mappedQFIs2AddCount);
+    LOG_D(SDAP, "Added SDAP entity to ue rnti %x with pdusession_id %d\n", rnti, pdusession_id);
   }
   nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
 }
@@ -1140,7 +1141,7 @@ void nr_DRB_preconfiguration(uint16_t crnti)
   NR_DRB_ToAddMod_t *drb_ToAddMod = calloc(1,sizeof(*drb_ToAddMod));
   drb_ToAddMod->cnAssociation = calloc(1,sizeof(*drb_ToAddMod->cnAssociation));
   drb_ToAddMod->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity;
-  drb_ToAddMod->cnAssociation->choice.eps_BearerIdentity= 5;
+  drb_ToAddMod->cnAssociation->choice.eps_BearerIdentity= 10;
   drb_ToAddMod->drb_Identity = 1;
   drb_ToAddMod->reestablishPDCP = NULL;
   drb_ToAddMod->recoverPDCP = NULL;
@@ -1450,3 +1451,10 @@ void nr_pdcp_tick(int frame, int subframe)
     nr_pdcp_wakeup_timer_thread(nr_pdcp_current_time);
   }
 }
+
+/*
+ * For the SDAP API
+ */
+nr_pdcp_ue_manager_t *nr_pdcp_sdap_get_ue_manager(){
+    return nr_pdcp_ue_manager;
+}
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
index 160c5ebb22697c70ee2b16685a97bbdd71834fb5..1f21593c630387bcfbe2620acca8a4e5132d8fad 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
@@ -127,11 +127,11 @@ void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, int rnti)
 
   for (j = 0; j < 2; j++)
     if (ue->srb[j] != NULL)
-      ue->srb[j]->delete(ue->srb[j]);
+      ue->srb[j]->delete_entity(ue->srb[j]);
 
   for (j = 0; j < 5; j++)
     if (ue->drb[j] != NULL)
-      ue->drb[j]->delete(ue->drb[j]);
+      ue->drb[j]->delete_entity(ue->drb[j]);
 
   free(ue);
 
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index f7323010cb05fcdbe3c9cdbac2ee97ba03aa2333..26c60fbb9bba5eaf90e25c0b72193272efab38c3 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -42,6 +42,7 @@
 #include "SCHED_NR_UE/fapi_nr_ue_l1.h"
 #include "executables/softmodem-common.h"
 #include "openair2/RRC/NR_UE/rrc_proto.h"
+#include "openair2/RRC/NR_UE/rrc_vars.h"
 #include "openair2/GNB_APP/L1_nr_paramdef.h"
 #include "openair2/GNB_APP/gnb_paramdef.h"
 #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
@@ -64,7 +65,17 @@ queue_t nr_dl_tti_req_queue;
 queue_t nr_tx_req_queue;
 queue_t nr_ul_dci_req_queue;
 queue_t nr_ul_tti_req_queue;
-queue_t nr_wait_ul_tti_req_queue;
+
+static slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT];
+
+//static int get_mcs_from_sinr(float sinr);
+//static int get_cqi_from_mcs(void);
+static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int sf, int index);
+//static bool did_drop_transport_block(int slot, uint16_t rnti);
+static float get_bler_val(uint8_t mcs, int sinr);
+static bool should_drop_transport_block(int slot, uint16_t rnti);
+static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request);
+static inline bool is_channel_modeling(void);
 
 void nrue_init_standalone_socket(int tx_port, int rx_port)
 {
@@ -98,7 +109,7 @@ void nrue_init_standalone_socket(int tx_port, int rx_port)
     }
     assert(ue_tx_sock_descriptor == -1);
     ue_tx_sock_descriptor = sd;
-    LOG_D(NR_RRC, "Successfully set up tx_socket in %s.\n", __FUNCTION__);
+    LOG_T(NR_RRC, "Successfully set up tx_socket in %s.\n", __FUNCTION__);
   }
 
   {
@@ -124,9 +135,9 @@ void nrue_init_standalone_socket(int tx_port, int rx_port)
     }
     assert(ue_rx_sock_descriptor == -1);
     ue_rx_sock_descriptor = sd;
-    LOG_D(NR_RRC, "Successfully set up rx_socket in %s.\n", __FUNCTION__);
+    LOG_T(NR_RRC, "Successfully set up rx_socket in %s.\n", __FUNCTION__);
   }
-  LOG_I(NR_RRC, "NRUE standalone socket info: tx_port %d  rx_port %d on %s.\n",
+  LOG_D(NR_RRC, "NRUE standalone socket info: tx_port %d  rx_port %d on %s.\n",
         tx_port, rx_port, stub_eth_params.remote_addr);
 }
 
@@ -137,7 +148,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
     case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
     {
         char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE];
-        LOG_D(NR_MAC, "RACH header id :%d", UL_INFO->rach_ind.header.message_id);
+        LOG_T(NR_MAC, "RACH header id :%d\n", UL_INFO->rach_ind.header.message_id);
         int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->rach_ind, buffer, sizeof(buffer), NULL);
         if (encoded_size <= 0)
         {
@@ -145,7 +156,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
                 return;
         }
 
-        LOG_I(NR_MAC, "NR_RACH_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size,
+        LOG_D(NR_MAC, "NR_RACH_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size,
                 UL_INFO->rach_ind.sfn, UL_INFO->rach_ind.slot, UL_INFO->rach_ind.number_of_pdus);
         if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0)
         {
@@ -157,7 +168,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
     case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
     {
         char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE];
-        LOG_D(NR_MAC, "RX header id :%d", UL_INFO->rx_ind.header.message_id);
+        LOG_T(NR_MAC, "RX header id :%d\n", UL_INFO->rx_ind.header.message_id);
         int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->rx_ind, buffer, sizeof(buffer), NULL);
         if (encoded_size <= 0)
         {
@@ -165,7 +176,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
                 return;
         }
 
-        LOG_I(NR_MAC, "NR_RX_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size,
+        LOG_D(NR_MAC, "NR_RX_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size,
                 UL_INFO->rx_ind.sfn, UL_INFO->rx_ind.slot, UL_INFO->rx_ind.number_of_pdus);
         if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0)
         {
@@ -177,7 +188,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
     case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
     {
         char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE];
-        LOG_D(NR_MAC, "CRC header id :%d", UL_INFO->crc_ind.header.message_id);
+        LOG_T(NR_MAC, "CRC header id :%d\n", UL_INFO->crc_ind.header.message_id);
         int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->crc_ind, buffer, sizeof(buffer), NULL);
         if (encoded_size <= 0)
         {
@@ -185,7 +196,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
                 return;
         }
 
-        LOG_I(NR_MAC, "NR_CRC_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size,
+        LOG_D(NR_MAC, "NR_CRC_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size,
                 UL_INFO->crc_ind.sfn, UL_INFO->crc_ind.slot, UL_INFO->crc_ind.number_crcs);
         if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0)
         {
@@ -197,7 +208,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
     case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
     {
         char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE];
-        LOG_I(NR_MAC, "UCI header id :%d", UL_INFO->uci_ind.header.message_id);
+        LOG_D(NR_MAC, "UCI header id :%d\n", UL_INFO->uci_ind.header.message_id);
         int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->uci_ind, buffer, sizeof(buffer), NULL);
         if (encoded_size <= 0)
         {
@@ -205,7 +216,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
                 return;
         }
 
-        LOG_I(NR_MAC, "NR_UCI_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size,
+        LOG_D(NR_MAC, "NR_UCI_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size,
                 UL_INFO->uci_ind.sfn, UL_INFO->uci_ind.slot, UL_INFO->uci_ind.num_ucis);
         if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0)
         {
@@ -221,18 +232,83 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
   }
 }
 
+bool sfn_slot_matcher(void *wanted, void *candidate)
+{
+  nfapi_p7_message_header_t *msg = candidate;
+  int sfn_sf = *(int*)wanted;
+
+  switch (msg->message_id)
+  {
+    case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+    {
+      nfapi_nr_rach_indication_t *ind = candidate;
+      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+    }
+
+    case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+    {
+      nfapi_nr_rx_data_indication_t *ind = candidate;
+      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+    }
+
+    case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+    {
+      nfapi_nr_crc_indication_t *ind = candidate;
+      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+    }
+
+    case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+    {
+      nfapi_nr_uci_indication_t *ind = candidate;
+      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+    }
+
+    case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+    {
+      nfapi_nr_dl_tti_request_t *ind = candidate;
+      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
+    }
+
+    case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+    {
+      nfapi_nr_tx_data_request_t *ind = candidate;
+      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
+    }
+
+    case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+    {
+      nfapi_nr_ul_dci_request_t *ind = candidate;
+      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
+    }
+
+    case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+    {
+      nfapi_nr_ul_tti_request_t *ind = candidate;
+      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
+    }
+
+    default:
+      LOG_E(NR_MAC, "sfn_slot_match bad ID: %d\n", msg->message_id);
+
+  }
+
+  return false;
+}
+
 static void fill_dl_info_with_pdcch(fapi_nr_dci_indication_t *dci, nfapi_nr_dl_dci_pdu_t *rx_dci, int idx)
 {
     int num_bytes = (rx_dci->PayloadSizeBits + 7) / 8;
-    LOG_I(NR_PHY, "[%d, %d] PDCCH DCI (Payload) for rnti %x with PayloadSizeBits %d, num_bytes %d\n",
+    LOG_D(NR_PHY, "[%d, %d] PDCCH DCI (Payload) for rnti %x with PayloadSizeBits %d, num_bytes %d\n",
           dci->SFN, dci->slot, rx_dci->RNTI, rx_dci->PayloadSizeBits, num_bytes);
     for (int k = 0; k < num_bytes; k++)
     {
-        LOG_I(NR_MAC, "PDCCH DCI PDU payload[%d] = %d\n", k, rx_dci->Payload[k]);
+        LOG_D(NR_MAC, "PDCCH DCI PDU payload[%d] = %d\n", k, rx_dci->Payload[k]);
         dci->dci_list[idx].payloadBits[k] = rx_dci->Payload[k];
     }
     dci->dci_list[idx].payloadSize = rx_dci->PayloadSizeBits;
     dci->dci_list[idx].rnti = rx_dci->RNTI;
+    dci->dci_list[idx].n_CCE = rx_dci->CceIndex;
+    dci->dci_list[idx].N_CCE = rx_dci->AggregationLevel;
     dci->number_of_dcis = idx + 1;
 }
 
@@ -242,7 +318,7 @@ static void fill_mib_in_rx_ind(nfapi_nr_dl_tti_request_pdu_t *pdu_list, fapi_nr_
                 "pdu_index (%d) is greater than rx_indication_body size!\n", pdu_idx);
     AssertFatal(pdu_idx == rx_ind->number_pdus,  "Invalid pdu_idx %d!\n", pdu_idx);
 
-    LOG_D(NR_MAC, "Recevied an SSB and are filling rx_ind with the MIB!\n");
+    LOG_T(NR_MAC, "Recevied an SSB and are filling rx_ind with the MIB!\n");
 
     nfapi_nr_dl_tti_ssb_pdu_rel15_t *ssb_pdu = &pdu_list->ssb_pdu.ssb_pdu_rel15;
     rx_ind->rx_indication_body[pdu_idx].ssb_pdu.cell_id = ssb_pdu->PhysCellId;
@@ -311,13 +387,13 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_
         nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i];
         if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE)
         {
-            LOG_I(NR_PHY, "[%d, %d] PDSCH PDU for rnti %x\n",
+            LOG_D(NR_PHY, "[%d, %d] PDSCH PDU for rnti %x\n",
                 dl_tti_request->SFN, dl_tti_request->Slot, pdu_list->pdsch_pdu.pdsch_pdu_rel15.rnti);
         }
 
         if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE)
         {
-            LOG_I(NR_PHY, "[%d, %d] PDCCH DCI PDU (Format for incoming PDSCH PDU)\n",
+            LOG_D(NR_PHY, "[%d, %d] PDCCH DCI PDU (Format for incoming PDSCH PDU)\n",
                 dl_tti_request->SFN, dl_tti_request->Slot);
             uint16_t num_dcis = pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci;
             if (num_dcis > 0)
@@ -342,19 +418,19 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_
                     {
                         mac->nr_ue_emul_l1.expected_sib = true;
                         mac->nr_ue_emul_l1.index_has_sib[j] = true;
-                        LOG_D(NR_MAC, "Setting index_has_sib[%d] = true\n", j);
+                        LOG_T(NR_MAC, "Setting index_has_sib[%d] = true\n", j);
                     }
                     else if (dci_pdu_list->RNTI == mac->ra.ra_rnti)
                     {
                         mac->nr_ue_emul_l1.expected_rar = true;
                         mac->nr_ue_emul_l1.index_has_rar[j] = true;
-                        LOG_D(NR_MAC, "Setting index_has_rar[%d] = true\n", j);
+                        LOG_T(NR_MAC, "Setting index_has_rar[%d] = true\n", j);
                     }
                     else
                     {
                         mac->nr_ue_emul_l1.expected_dci = true;
                         mac->nr_ue_emul_l1.index_has_dci[j] = true;
-                        LOG_D(NR_MAC, "Setting index_has_dci[%d] = true\n", j);
+                        LOG_T(NR_MAC, "Setting index_has_dci[%d] = true\n", j);
                     }
                     pdu_idx++;
                 }
@@ -388,13 +464,14 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_
 
 static void fill_rx_ind(nfapi_nr_pdu_t *pdu_list, fapi_nr_rx_indication_t *rx_ind, int pdu_idx, int pdu_type)
 {
+    NR_UE_MAC_INST_t *mac = get_mac_inst(0);
     AssertFatal(pdu_list->num_TLV < sizeof(pdu_list->TLVs) / sizeof(pdu_list->TLVs[0]), "Num TLVs exceeds TLV array size");
     int length = 0;
     for (int j = 0; j < pdu_list->num_TLV; j++)
     {
         length += pdu_list->TLVs[j].length;
     }
-    LOG_I(NR_PHY, "%s: num_tlv %d and length %d, pdu index %d\n",
+    LOG_D(NR_PHY, "%s: num_tlv %d and length %d, pdu index %d\n",
         __FUNCTION__, pdu_list->num_TLV, length, pdu_idx);
     uint8_t *pdu = malloc(length);
     AssertFatal(pdu != NULL, "%s: Out of memory in malloc", __FUNCTION__);
@@ -409,7 +486,12 @@ static void fill_rx_ind(nfapi_nr_pdu_t *pdu_list, fapi_nr_rx_indication_t *rx_in
         memcpy(pdu, ptr, pdu_list->TLVs[j].length);
         pdu += pdu_list->TLVs[j].length;
     }
-    rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.ack_nack = 1;
+    bool ack_nack = true;
+    if (mac->ra.ra_state >= RA_SUCCEEDED && should_drop_transport_block(rx_ind->slot, mac->crnti))
+    {
+      ack_nack = false;
+    }
+    rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.ack_nack = ack_nack;
     rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.pdu_length = length;
     rx_ind->rx_indication_body[pdu_idx].pdu_type = pdu_type;
 
@@ -455,7 +537,7 @@ static void copy_tx_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi
         }
         else
         {
-            LOG_D(NR_MAC, "mac->nr_ue_emul_l1.index_has_dci[%d] = 0, so this index contained a DCI for a different UE\n", i);
+            LOG_T(NR_MAC, "mac->nr_ue_emul_l1.index_has_dci[%d] = 0, so this index contained a DCI for a different UE\n", i);
         }
 
     }
@@ -476,7 +558,7 @@ static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, n
     {
         nfapi_nr_ul_dci_request_pdus_t *pdu_list = &ul_dci_req->ul_dci_pdu_list[i];
         AssertFatal(pdu_list->PDUType == 0, "ul_dci_req pdu type != PUCCH");
-        LOG_I(NR_PHY, "[%d %d] PUCCH PDU in ul_dci for rnti %x and numDLDCI = %d\n",
+        LOG_D(NR_PHY, "[%d %d] PUCCH PDU in ul_dci for rnti %x and numDLDCI = %d\n",
              ul_dci_req->SFN, ul_dci_req->Slot, pdu_list->pdcch_pdu.pdcch_pdu_rel15.dci_pdu->RNTI,
              pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci);
         uint16_t num_dci = pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci;
@@ -495,7 +577,7 @@ static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, n
                 nfapi_nr_dl_dci_pdu_t *dci_pdu_list = &pdu_list->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[j];
                 if (dci_pdu_list->RNTI != mac->crnti)
                 {
-                  LOG_D(NR_MAC, "dci_pdu_list->RNTI (%x) != mac->crnti (%x)\n", dci_pdu_list->RNTI, mac->crnti);
+                  LOG_T(NR_MAC, "dci_pdu_list->RNTI (%x) != mac->crnti (%x)\n", dci_pdu_list->RNTI, mac->crnti);
                   continue;
                 }
                 fill_dl_info_with_pdcch(dl_info->dci_ind, dci_pdu_list, pdu_idx);
@@ -507,148 +589,59 @@ static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, n
     dl_info->slot = ul_dci_req->Slot;
 }
 
-static nfapi_nr_uci_indication_t *multiplex_uci_ind(NR_UE_MAC_INST_t *mac, int num_active_harqs)
+static bool send_crc_ind_and_rx_ind(int sfn_slot)
 {
-    AssertFatal(num_active_harqs >= 0, "Invalid value for num_active_harqs %d\n", num_active_harqs);
-    if (num_active_harqs == 0)
-    {
-        return NULL;
-    }
-    if (num_active_harqs != nr_uci_ind_queue.num_items)
-    {
-        LOG_I(NR_MAC, "The number of active harqs %d doesn't match the number of UCIs in the queue %lu\n",
-                       num_active_harqs, nr_uci_ind_queue.num_items);
-        return NULL;
-    }
+  bool sent_crc_rx = true;
 
-    nfapi_nr_uci_indication_t *uci_ind = MALLOC(sizeof(*uci_ind));
-    uci_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION;
-    uci_ind->sfn = NFAPI_SFNSLOT2SFN(mac->nr_ue_emul_l1.active_harq_sfn_slot);
-    uci_ind->slot = NFAPI_SFNSLOT2SLOT(mac->nr_ue_emul_l1.active_harq_sfn_slot);
-    uci_ind->num_ucis = num_active_harqs;
-    uci_ind->uci_list = CALLOC(uci_ind->num_ucis, sizeof(*uci_ind->uci_list));
-    for (int i = 0; i < num_active_harqs; i++)
-    {
-        nfapi_nr_uci_indication_t *queued_uci_ind = get_queue(&nr_uci_ind_queue);
-        AssertFatal(queued_uci_ind, "There was not a UCI in the queue!\n");
-        nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[i].pucch_pdu_format_0_1;
-
-        /* In openair1/SCHED_NR_UE/fapi_nr_ue_l1.c nr_ue_schedule_response_stub(), the
-        number of UCIs is hard coded to 1. This is why we always use index 0 of the
-        queued UCI indication to fill the new multiplexed UCI indication */
-        AssertFatal(queued_uci_ind->num_ucis == 1, "The number of UCIs from de-queueud UCI is not 1, its %d\n",
-                    queued_uci_ind->num_ucis);
-        uci_ind->uci_list[i].pdu_type = queued_uci_ind->uci_list[0].pdu_type;
-        uci_ind->uci_list[i].pdu_size = queued_uci_ind->uci_list[0].pdu_size;
-
-        nfapi_nr_uci_pucch_pdu_format_0_1_t *queued_pdu_0_1 = &queued_uci_ind->uci_list[0].pucch_pdu_format_0_1;
-        pdu_0_1->handle = queued_pdu_0_1->handle;
-        pdu_0_1->rnti = queued_pdu_0_1->rnti;
-        pdu_0_1->pucch_format = queued_pdu_0_1->pucch_format;
-        pdu_0_1->ul_cqi = queued_pdu_0_1->ul_cqi;
-        pdu_0_1->timing_advance = queued_pdu_0_1->timing_advance;
-        pdu_0_1->rssi = queued_pdu_0_1->rssi;
-        free(queued_uci_ind->uci_list);
-        queued_uci_ind->uci_list = NULL;
-        free(queued_uci_ind);
-        queued_uci_ind = NULL;
+  nfapi_nr_rx_data_indication_t *rx_ind = unqueue_matching(&nr_rx_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
+  nfapi_nr_crc_indication_t *crc_ind = unqueue_matching(&nr_crc_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
+
+  if (crc_ind && crc_ind->number_crcs > 0)
+  {
+    NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+    for (int i = 0; i < crc_ind->number_crcs; i++) {
+        int harq_pid = crc_ind->crc_list[i].harq_id;
+        LOG_T(NR_MAC, "Resetting harq_pid %d active_ul_harq_sfn_slot\n", harq_pid);
+        mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_sfn_slot = -1;
     }
-    return uci_ind;
+    NR_UL_IND_t UL_INFO = {
+      .crc_ind = *crc_ind,
+    };
+    send_nsa_standalone_msg(&UL_INFO, crc_ind->header.message_id);
+    free(crc_ind->crc_list);
+    free(crc_ind);
+  }
+  if (rx_ind && rx_ind->number_of_pdus > 0)
+  {
+    NR_UL_IND_t UL_INFO = {
+      .rx_ind = *rx_ind,
+    };
+    send_nsa_standalone_msg(&UL_INFO, rx_ind->header.message_id);
+    free(rx_ind->pdu_list);
+    free(rx_ind);
+  }
+  else
+  {
+    sent_crc_rx = false;
+  }
+  return sent_crc_rx;
 }
 
 static void copy_ul_tti_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_nr_ul_tti_request_t *ul_tti_req)
 {
-    NR_UE_MAC_INST_t *mac = get_mac_inst(dl_info->module_id);
     int num_pdus = ul_tti_req->n_pdus;
+    int sfn_slot = NFAPI_SFNSLOT2HEX(ul_tti_req->SFN, ul_tti_req->Slot);
     AssertFatal(num_pdus >= 0, "Invalid ul_tti_request number of PDUS\n");
     AssertFatal(num_pdus <= sizeof(ul_tti_req->pdus_list) / sizeof(ul_tti_req->pdus_list[0]),
                 "Too many pdus %d in ul_tti_req\n", num_pdus);
-
-    bool sent_uci = false;
-    for (int i = 0; i < num_pdus; i++)
-    {
-        nfapi_nr_ul_tti_request_number_of_pdus_t *pdu_list = &ul_tti_req->pdus_list[i];
-        LOG_D(NR_PHY, "This is the pdu type %d and rnti %x and SR flag %d and harq_pdu_len %d in in ul_tti_req\n",
-              pdu_list->pdu_type, ul_tti_req->pdus_list[i].pucch_pdu.rnti, pdu_list->pucch_pdu.sr_flag, pdu_list->pucch_pdu.bit_len_harq);
-        if (pdu_list->pdu_type == NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE && pdu_list->pucch_pdu.rnti == mac->crnti)
-        {
-            AssertFatal(nr_uci_ind_queue.num_items >= 0, "Invalid num_items in UCI_ind queue %lu\n",
-                        nr_uci_ind_queue.num_items);
-            int num_active_harqs = pdu_list->pucch_pdu.bit_len_harq;
-            LOG_I(NR_MAC, "The number of active harqs %d from ul_tti_req\n", num_active_harqs);
-            nfapi_nr_uci_indication_t *uci_ind = multiplex_uci_ind(mac, num_active_harqs);
-
-            if (uci_ind && uci_ind->num_ucis > 0)
-            {
-                LOG_D(NR_MAC, "This is the SFN/SF [%d, %d] and RNTI %x of the UCI ind. ul_tti_req.pdu[%d]->rnti = %x \n",
-                        uci_ind->sfn, uci_ind->slot, uci_ind->uci_list[0].pucch_pdu_format_0_1.rnti, i, ul_tti_req->pdus_list[i].pucch_pdu.rnti);
-                uci_ind->sfn = ul_tti_req->SFN;
-                uci_ind->slot = ul_tti_req->Slot;
-                for (int j = 0; j < uci_ind->num_ucis; j++)
-                {
-                    nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[j].pucch_pdu_format_0_1;
-                    if (pdu_list->pucch_pdu.sr_flag)
-                    {
-                        LOG_D(NR_MAC, "We have the SR flag in pdu i %d\n", i);
-                        pdu_0_1->pduBitmap = 1; // (value->pduBitmap >> 1) & 0x01) == HARQ and (value->pduBitmap) & 0x01) == SR
-                        pdu_0_1->sr = CALLOC(1, sizeof(*pdu_0_1->sr));
-                        pdu_0_1->sr->sr_confidence_level = 0;
-                        pdu_0_1->sr->sr_indication = 1;
-                    }
-                    if (pdu_list->pucch_pdu.bit_len_harq > 0)
-                    {
-                        LOG_D(NR_MAC, "We have the Harq len bits %d\n", pdu_list->pucch_pdu.bit_len_harq);
-                        pdu_0_1->pduBitmap = 2; // (value->pduBitmap >> 1) & 0x01) == HARQ and (value->pduBitmap) & 0x01) == SR
-                        pdu_0_1->harq = CALLOC(1, sizeof(*pdu_0_1->harq));
-                        pdu_0_1->harq->num_harq = 1;
-                        pdu_0_1->harq->harq_confidence_level = 0;
-                        pdu_0_1->harq->harq_list = CALLOC(pdu_0_1->harq->num_harq, sizeof(*pdu_0_1->harq->harq_list));
-                        for (int k = 0; k < pdu_0_1->harq->num_harq; k++)
-                        {
-                            pdu_0_1->harq->harq_list[k].harq_value = 0;
-                        }
-                    }
-                }
-                LOG_I(NR_MAC, "We have dequeued the previously filled uci_ind and updated the snf/slot to %d/%d.\n",
-                      uci_ind->sfn, uci_ind->slot);
-                NR_UL_IND_t UL_INFO = {
-                    .uci_ind = *uci_ind,
-                };
-                send_nsa_standalone_msg(&UL_INFO, uci_ind->header.message_id);
-                sent_uci = true;
-
-                for (int k = 0; k < uci_ind->num_ucis; k++)
-                {
-                    nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[k].pucch_pdu_format_0_1;
-                    if (pdu_list->pucch_pdu.sr_flag)
-                    {
-                        free(pdu_0_1->sr);
-                        pdu_0_1->sr = NULL;
-                    }
-                    if (pdu_list->pucch_pdu.bit_len_harq > 1)
-                    {
-                        free(pdu_0_1->harq->harq_list);
-                        pdu_0_1->harq->harq_list = NULL;
-                        free(pdu_0_1->harq);
-                        pdu_0_1->harq = NULL;
-                    }
-                }
-                free(uci_ind->uci_list);
-                uci_ind->uci_list = NULL;
-                free(uci_ind);
-                uci_ind = NULL;
-            }
-        }
-    }
-    if (!sent_uci)
+    if (!send_crc_ind_and_rx_ind(sfn_slot))
     {
-        LOG_E(NR_MAC, "UCI ind not sent\n");
+        LOG_T(NR_MAC, "CRC_RX ind not sent\n");
         if (!put_queue(&nr_ul_tti_req_queue, ul_tti_req))
         {
             LOG_E(NR_PHY, "put_queue failed for ul_tti_req.\n");
-            free(ul_tti_req);
-            ul_tti_req = NULL;
         }
+        return;
     }
 }
 
@@ -663,13 +656,13 @@ static void fill_dci_from_dl_config(nr_downlink_indication_t*dl_ind, fapi_nr_dl_
               "Too many dl_config pdus %d", dl_config->number_pdus);
   for (int i = 0; i < dl_config->number_pdus; i++)
   {
-    LOG_I(PHY, "In %s: filling DCI with a total of %d total DL PDUs (dl_config %p) \n",
+    LOG_D(PHY, "In %s: filling DCI with a total of %d total DL PDUs (dl_config %p) \n",
           __FUNCTION__, dl_config->number_pdus, dl_config);
     fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15_dci = &dl_config->dl_config_list[i].dci_config_pdu.dci_config_rel15;
     int num_dci_options = rel15_dci->num_dci_options;
     if (num_dci_options <= 0)
     {
-      LOG_I(NR_MAC, "num_dci_opts = %d for pdu[%d] in dl_config_list\n", rel15_dci->num_dci_options, i);
+      LOG_D(NR_MAC, "num_dci_opts = %d for pdu[%d] in dl_config_list\n", rel15_dci->num_dci_options, i);
     }
     AssertFatal(num_dci_options <= sizeof(rel15_dci->dci_length_options) / sizeof(rel15_dci->dci_length_options[0]),
                 "num_dci_options %d > dci_length_options array\n", num_dci_options);
@@ -683,17 +676,15 @@ static void fill_dci_from_dl_config(nr_downlink_indication_t*dl_ind, fapi_nr_dl_
                   "dl_config->number_pdus %d > dci_ind->dci_list array\n", num_dcis);
       for (int k = 0; k < num_dcis; k++)
       {
-        LOG_I(NR_PHY, "Received len %d, length options[%d] %d, format assigned %d, format options[%d] %d\n",
+        LOG_T(NR_PHY, "Received len %d, length options[%d] %d, format assigned %d, format options[%d] %d\n",
                   dl_ind->dci_ind->dci_list[k].payloadSize, j, rel15_dci->dci_length_options[j],
                   dl_ind->dci_ind->dci_list[k].dci_format, j, rel15_dci->dci_format_options[j]);
         if (rel15_dci->dci_length_options[j] == dl_ind->dci_ind->dci_list[k].payloadSize)
         {
             dl_ind->dci_ind->dci_list[k].dci_format = rel15_dci->dci_format_options[j];
+            LOG_D(NR_PHY, "format assigned dl_ind->dci_ind->dci_list[k].dci_format %d\n",
+                  dl_ind->dci_ind->dci_list[k].dci_format);
         }
-        int CCEind = rel15_dci->CCE[j];
-        int L = rel15_dci->L[j];
-        dl_ind->dci_ind->dci_list[k].n_CCE = CCEind;
-        dl_ind->dci_ind->dci_list[k].N_CCE = L;
       }
     }
   }
@@ -714,41 +705,52 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request,
     {
         frame = dl_tti_request->SFN;
         slot = dl_tti_request->Slot;
-        LOG_I(NR_PHY, "[%d, %d] dl_tti_request\n", frame, slot);
+        LOG_D(NR_PHY, "[%d, %d] dl_tti_request\n", frame, slot);
         copy_dl_tti_req_to_dl_info(&mac->dl_info, dl_tti_request);
+        free_and_zero(dl_tti_request);
     }
     /* This checks if the previously recevied DCI matches our current RNTI
        value. The assumption is that if the DCI matches our RNTI, then the
        incoming tx_data_request is also destined for the current UE. If the
        RAR hasn't been processed yet, we do not want to be filtering the
        tx_data_requests. */
-    if (tx_data_request && (mac->nr_ue_emul_l1.expected_sib ||
-                            mac->nr_ue_emul_l1.expected_rar ||
-                            mac->nr_ue_emul_l1.expected_dci))
+    if (tx_data_request)
     {
-        frame = tx_data_request->SFN;
-        slot = tx_data_request->Slot;
-        LOG_I(NR_PHY, "[%d, %d] PDSCH in tx_request\n", frame, slot);
-        copy_tx_data_req_to_dl_info(&mac->dl_info, tx_data_request);
+        if (mac->nr_ue_emul_l1.expected_sib ||
+            mac->nr_ue_emul_l1.expected_rar ||
+            mac->nr_ue_emul_l1.expected_dci)
+        {
+            frame = tx_data_request->SFN;
+            slot = tx_data_request->Slot;
+            LOG_I(NR_PHY, "[%d, %d] PDSCH in tx_request\n", frame, slot);
+            copy_tx_data_req_to_dl_info(&mac->dl_info, tx_data_request);
+        }
+        else
+        {
+            LOG_D(NR_MAC, "Unexpected tx_data_req\n");
+        }
+        free_and_zero(tx_data_request);
     }
     else if (ul_dci_request)
     {
         frame = ul_dci_request->SFN;
         slot = ul_dci_request->Slot;
-        LOG_I(NR_PHY, "[%d, %d] ul_dci_request\n", frame, slot);
+        LOG_D(NR_PHY, "[%d, %d] ul_dci_request\n", frame, slot);
         copy_ul_dci_data_req_to_dl_info(&mac->dl_info, ul_dci_request);
+        free_and_zero(ul_dci_request);
     }
     else if (ul_tti_request)
     {
         frame = ul_tti_request->SFN;
         slot = ul_tti_request->Slot;
-        LOG_I(NR_PHY, "[%d, %d] ul_tti_request\n", frame, slot);
+        LOG_T(NR_PHY, "[%d, %d] ul_tti_request\n", frame, slot);
         copy_ul_tti_data_req_to_dl_info(&mac->dl_info, ul_tti_request);
+        free_and_zero(ul_tti_request);
     }
     else
     {
         if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort();
-        LOG_E(NR_MAC, "Error! All indications were NULL\n");
+        LOG_T(NR_MAC, "All indications were NULL in %s\n", __FUNCTION__);
         return;
     }
 
@@ -756,6 +758,7 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request,
     NR_UL_TIME_ALIGNMENT_t ul_time_alignment;
     memset(&ul_time_alignment, 0, sizeof(ul_time_alignment));
     fill_dci_from_dl_config(&mac->dl_info, &mac->dl_config_request);
+    nr_ue_scheduler(&mac->dl_info, NULL);
     nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment);
 
     if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort();
@@ -776,8 +779,11 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request,
                           mac->scc->tdd_UL_DL_ConfigurationCommon :
                           mac->scc_SIB->tdd_UL_DL_ConfigurationCommon,
                           ul_info.slot_tx,
-                          mac->frame_type))
-            nr_ue_ul_indication(&ul_info);
+                          mac->frame_type) && mac->ra.ra_state != RA_SUCCEEDED)
+        {
+            nr_ue_scheduler(NULL, &ul_info);
+            nr_ue_prach_scheduler(ul_info.module_id, ul_info.frame_tx, ul_info.slot_tx, ul_info.thread_id);
+        }
     }
 }
 
@@ -790,19 +796,19 @@ void save_nr_measurement_info(nfapi_nr_dl_tti_request_t *dl_tti_request)
         LOG_E(NR_PHY, "%s: dl_tti_request number of PDUS <= 0\n", __FUNCTION__);
         abort();
     }
-    LOG_D(NR_PHY, "%s: dl_tti_request number of PDUS: %d\n", __FUNCTION__, num_pdus);
+    LOG_T(NR_PHY, "%s: dl_tti_request number of PDUS: %d\n", __FUNCTION__, num_pdus);
     for (int i = 0; i < num_pdus; i++)
     {
         nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i];
         if (pdu_list->PDUType == NFAPI_NR_DL_TTI_SSB_PDU_TYPE)
         {
-            LOG_D(NR_PHY, "Cell_id: %d, the ssb_block_idx %d, sc_offset: %d and payload %d\n",
+            LOG_T(NR_PHY, "Cell_id: %d, the ssb_block_idx %d, sc_offset: %d and payload %d\n",
                 pdu_list->ssb_pdu.ssb_pdu_rel15.PhysCellId,
                 pdu_list->ssb_pdu.ssb_pdu_rel15.SsbBlockIndex,
                 pdu_list->ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset,
                 pdu_list->ssb_pdu.ssb_pdu_rel15.bchPayload);
             pdu_list->ssb_pdu.ssb_pdu_rel15.ssbRsrp = 60;
-            LOG_D(NR_RRC, "Setting pdulist[%d].ssbRsrp to %d\n", i, pdu_list->ssb_pdu.ssb_pdu_rel15.ssbRsrp);
+            LOG_T(NR_RRC, "Setting pdulist[%d].ssbRsrp to %d\n", i, pdu_list->ssb_pdu.ssb_pdu_rel15.ssbRsrp);
         }
     }
 
@@ -820,7 +826,7 @@ void save_nr_measurement_info(nfapi_nr_dl_tti_request_t *dl_tti_request)
 
 static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_header_t header)
 {
-
+    NR_UE_MAC_INST_t *mac = get_mac_inst(0);
     switch (header.message_id)
     {
         case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
@@ -832,8 +838,12 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
                 LOG_E(NR_PHY, "Message dl_tti_request failed to unpack\n");
                 break;
             }
-            LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST message in sfn/slot %d %d. \n",
+            LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST message in sfn/slot %d %d. \n",
                     dl_tti_request->SFN, dl_tti_request->Slot);
+
+            if (is_channel_modeling())
+                save_pdsch_pdu_for_crnti(dl_tti_request);
+
             if (!put_queue(&nr_dl_tti_req_queue, dl_tti_request))
             {
                 LOG_E(NR_PHY, "put_queue failed for dl_tti_request.\n");
@@ -852,7 +862,7 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
                 LOG_E(NR_PHY, "Message tx_data_request failed to unpack\n");
                 break;
             }
-            LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST message in SFN/slot %d %d. \n",
+            LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST message in SFN/slot %d %d. \n",
                     tx_data_request->SFN, tx_data_request->Slot);
             if (!put_queue(&nr_tx_req_queue, tx_data_request))
             {
@@ -872,7 +882,7 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
                 LOG_E(NR_PHY, "Message ul_dci_request failed to unpack\n");
                 break;
             }
-            LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST message in SFN/slot %d %d. \n",
+            LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST message in SFN/slot %d %d. \n",
                     ul_dci_request->SFN, ul_dci_request->Slot);
             if (!put_queue(&nr_ul_dci_req_queue, ul_dci_request))
             {
@@ -892,30 +902,30 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
                 LOG_E(NR_PHY, "Message ul_tti_request failed to unpack\n");
                 break;
             }
-            LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST message in SFN/slot %d %d.\n",
-                  ul_tti_request->SFN, ul_tti_request->Slot);
-            if (nr_uci_ind_queue.num_items > 0) //TODO: In the future UL_TTIs can be for ULSCH and SRS.
-            {
-                LOG_D(NR_MAC, "We added UL_TTI_REQ to queue for sfn slot %d %d\n",
-                      ul_tti_request->SFN, ul_tti_request->Slot);
-                if (!put_queue(&nr_ul_tti_req_queue, ul_tti_request))
-                {
-                    LOG_E(NR_PHY, "put_queue failed for ul_tti_request.\n");
-                    free(ul_tti_request);
-                    ul_tti_request = NULL;
+            /* We are filtering UL_TTI_REQs below. We only care about UL_TTI_REQs that
+               will trigger sending a ul_harq (CRC/RX pair). This UL_TTI_REQ will have
+               NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE. If we have not yet completed the CBRA/
+               CFRA procedure, we need to queue all UL_TTI_REQs. */
+            for (int i = 0; i < ul_tti_request->n_pdus; i++) {
+                if (ul_tti_request->pdus_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE &&
+                    mac->ra.ra_state >= RA_SUCCEEDED) {
+                    if (!put_queue(&nr_ul_tti_req_queue, ul_tti_request))
+                    {
+                        LOG_D(NR_PHY, "put_queue failed for ul_tti_request, calling put_queue_replace.\n");
+                        nfapi_nr_ul_tti_request_t *evicted_ul_tti_req = put_queue_replace(&nr_ul_tti_req_queue, ul_tti_request);
+                        free(evicted_ul_tti_req);
+                    }
+                    break;
+                }
+                else if (mac->ra.ra_state < RA_SUCCEEDED) {
+                    if (!put_queue(&nr_ul_tti_req_queue, ul_tti_request))
+                    {
+                        LOG_D(NR_PHY, "put_queue failed for ul_tti_request, calling put_queue_replace.\n");
+                        nfapi_nr_ul_tti_request_t *evicted_ul_tti_req = put_queue_replace(&nr_ul_tti_req_queue, ul_tti_request);
+                        free(evicted_ul_tti_req);
+                    }
+                    break;
                 }
-            }
-            /* TODO: This indicates that dl_tti_req was late or never arrived. If there are
-               not any prepared uci indications, the NRUE likely never had time to
-               populate the message is the dl_tti_req came in late and we received a
-               ul_tti_req immediately after the dl_tti_request. This is an attempt to
-               mitigate proxy timing issues. */
-            else if (nr_uci_ind_queue.num_items == 0)
-            {
-                LOG_D(NR_MAC, "We added UL_TTI_REQ to queue for sfn slot %d %d\n",
-                      ul_tti_request->SFN, ul_tti_request->Slot);
-                nfapi_nr_ul_tti_request_t *evicted_ul_tti_req = put_queue_replace(&nr_wait_ul_tti_req_queue, ul_tti_request);
-                free(evicted_ul_tti_req);
             }
             break;
         }
@@ -928,6 +938,46 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea
     return;
 }
 
+static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request)
+{
+  int count_sent = 0;
+  NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+  int number_of_pdu = dl_tti_request->dl_tti_request_body.nPDUs;
+  if (number_of_pdu <= 0)
+  {
+    LOG_E(NR_MAC, "%s: dl_tti_request pdu size <= 0\n", __FUNCTION__);
+    abort();
+  }
+
+  for (int i = 0; i < number_of_pdu; i++)
+  {
+    const nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i];
+
+    if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE)
+    {
+      const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu = &pdu_list->pdsch_pdu.pdsch_pdu_rel15;
+      if (pdsch_pdu->rnti == mac->crnti && mac->ra.ra_state == RA_SUCCEEDED)
+      {
+        read_channel_param(pdsch_pdu, dl_tti_request->Slot, count_sent);
+        count_sent++;
+        LOG_T(NR_MAC, "pdsch_pdu->rnti %x  mac->crnti %x mac->ra.ra_state %d count_sent %d\n",
+                      pdsch_pdu->rnti, mac->crnti, mac->ra.ra_state, count_sent);
+      }
+    }
+  }
+}
+
+static uint16_t get_message_id(const uint8_t *buffer, ssize_t len)
+{
+  if (len < 4)
+    return 0;
+
+  // Unpack 2 bytes message_id from buffer.
+  uint16_t v;
+  memcpy(&v, buffer + 2, sizeof(v));
+  return ntohs(v);
+}
+
 void *nrue_standalone_pnf_task(void *context)
 {
   struct sockaddr_in server_address;
@@ -957,7 +1007,7 @@ void *nrue_standalone_pnf_task(void *context)
       uint16_t *sfn_slot = CALLOC(1, sizeof(*sfn_slot));
       memcpy(sfn_slot, buffer, sizeof(*sfn_slot));
 
-      LOG_I(NR_PHY, "Received from proxy sfn %d slot %d\n",
+      LOG_D(NR_PHY, "Received from proxy sfn %d slot %d\n",
             NFAPI_SFNSLOT2SFN(*sfn_slot), NFAPI_SFNSLOT2SLOT(*sfn_slot));
 
       if (!put_queue(&nr_sfn_slot_queue, sfn_slot))
@@ -971,13 +1021,22 @@ void *nrue_standalone_pnf_task(void *context)
         abort();
       }
     }
-    else if (len == sizeof(nr_phy_channel_params_t))
+    else if (get_message_id((const uint8_t *)buffer, len) == 0x0FFF) // 0x0FFF : channel info identifier.
     {
       nr_phy_channel_params_t *ch_info = CALLOC(1, sizeof(*ch_info));
       memcpy(ch_info, buffer, sizeof(*ch_info));
 
-      LOG_D(NR_PHY, "Received_SINR = %f, sfn:slot %d:%d\n",
-            ch_info->sinr, NFAPI_SFNSLOT2SFN(ch_info->sfn_slot), NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot));
+      if (ch_info->nb_of_sinrs > 1)
+        LOG_W(NR_PHY, "Expecting at most one SINR.\n");
+
+      // TODO: Update sinr field of slot_rnti_mcs to be array.
+      for (int i = 0; i < ch_info->nb_of_sinrs; ++i)
+      {
+        slot_rnti_mcs[NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)].sinr = ch_info->sinr[i];
+
+        LOG_T(NR_PHY, "Received_SINR[%d] = %f, sfn:slot %d:%d\n",
+              i, ch_info->sinr[i], NFAPI_SFNSLOT2SFN(ch_info->sfn_slot), NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot));
+      }
 
       if (!put_queue(&nr_chan_param_queue, ch_info))
       {
@@ -1037,7 +1096,10 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t
 // L2 Abstraction Layer
 // Note: sdu should always be processed because data and timing advance updates are transmitted by the UE
 int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
-
+  /* L1 assigns harq_pid, but in emulated L1 mode we need to assign
+     the harq_pid based on the saved global g_harq_pid. Because we are
+     emulating L1, no antenna measurements are conducted to calculate
+     a harq_pid, therefore we must set it here. */
   if (get_softmodem_params()->emulate_l1)
     dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid = g_harq_pid;
 
@@ -1058,7 +1120,7 @@ void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nac
   if (current_harq->active) {
     current_harq->ack = ack_nack;
     current_harq->ack_received = true;
-    LOG_D(PHY,"Updating harq_status for harq_id %d,ack/nak %d\n",harq_pid,current_harq->ack);
+    LOG_T(PHY,"Updating harq_status for harq_id %d,ack/nak %d\n",harq_pid,current_harq->ack);
   }
   else {
     //shouldn't get here
@@ -1066,7 +1128,6 @@ void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nac
   }
 }
 
-
 int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
 
   NR_UE_L2_STATE_t ret;
@@ -1081,7 +1142,7 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
     ret = nr_ue_scheduler(NULL, ul_info);
   }
   else
-    LOG_D(NR_MAC, "In %s():%d not calling scheduler. sched mode = %d and mac->ra.ra_state = %d\n",
+    LOG_T(NR_MAC, "In %s():%d not calling scheduler. sched mode = %d and mac->ra.ra_state = %d\n",
         __FUNCTION__, __LINE__, ul_info->ue_sched_mode, mac->ra.ra_state);
 
   NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon = mac->scc != NULL ? mac->scc->tdd_UL_DL_ConfigurationCommon : mac->scc_SIB->tdd_UL_DL_ConfigurationCommon;
@@ -1121,9 +1182,9 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
   } else {
     // UL indication after reception of DCI or DL PDU
     if (dl_info && dl_info->dci_ind && dl_info->dci_ind->number_of_dcis) {
-      LOG_D(MAC,"[L2][IF MODULE][DL INDICATION][DCI_IND]\n");
+      LOG_T(MAC,"[L2][IF MODULE][DL INDICATION][DCI_IND]\n");
       for (int i = 0; i < dl_info->dci_ind->number_of_dcis; i++) {
-        LOG_D(MAC,">>>NR_IF_Module i=%d, dl_info->dci_ind->number_of_dcis=%d\n",i,dl_info->dci_ind->number_of_dcis);
+        LOG_T(MAC,">>>NR_IF_Module i=%d, dl_info->dci_ind->number_of_dcis=%d\n",i,dl_info->dci_ind->number_of_dcis);
         nr_scheduled_response_t scheduled_response;
         int8_t ret = handle_dci(dl_info->module_id,
                                 dl_info->cc_id,
@@ -1136,12 +1197,12 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
 
         /* The check below filters out UL_DCIs (format 7) which are being processed as DL_DCIs. */
         if (dci_index->dci_format == 7 && mac->ra.ra_state == RA_SUCCEEDED) {
-          LOG_D(NR_MAC, "We are filtering a UL_DCI to prevent it from being treated like a DL_DCI\n");
+          LOG_T(NR_MAC, "We are filtering a UL_DCI to prevent it from being treated like a DL_DCI\n");
           break;
         }
         dci_pdu_rel15_t *def_dci_pdu_rel15 = &mac->def_dci_pdu_rel15[dci_index->dci_format];
         g_harq_pid = def_dci_pdu_rel15->harq_pid;
-        LOG_D(NR_MAC, "Setting harq_pid = %d and dci_index = %d (based on format)\n", g_harq_pid, dci_index->dci_format);
+        LOG_T(NR_MAC, "Setting harq_pid = %d and dci_index = %d (based on format)\n", g_harq_pid, dci_index->dci_format);
 
         ret_mask |= (ret << FAPI_NR_DCI_IND);
         if (ret >= 0) {
@@ -1160,7 +1221,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
 
       for (int i=0; i<dl_info->rx_ind->number_pdus; ++i) {
 
-        LOG_D(MAC, "In %s sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs \n",
+        LOG_T(MAC, "In %s sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs \n",
           __FUNCTION__,
           dl_info->rx_ind->rx_indication_body[i].pdu_type,
           dl_info->rx_ind->number_pdus);
@@ -1244,7 +1305,7 @@ int nr_ue_dcireq(nr_dcireq_t *dcireq) {
   dl_config->sfn = UE_mac->dl_config_request.sfn;
   dl_config->slot = UE_mac->dl_config_request.slot;
 
-  LOG_D(PHY, "Entering UE DCI configuration frame %d slot %d \n", dcireq->frame, dcireq->slot);
+  LOG_T(PHY, "Entering UE DCI configuration frame %d slot %d \n", dcireq->frame, dcireq->slot);
 
   ue_dci_configuration(UE_mac, dl_config, dcireq->frame, dcireq->slot);
 
@@ -1279,3 +1340,245 @@ void RCconfig_nr_ue_L1(void) {
     }
   }
 }
+
+/*
+static int get_mcs_from_sinr(float sinr)
+{
+  if (sinr < (nr_bler_data[0].bler_table[0][0]))
+  {
+    LOG_D(NR_MAC, "The SINR found is smaller than first MCS table\n");
+    return 0;
+  }
+
+  if (sinr > (nr_bler_data[NR_NUM_MCS-1].bler_table[nr_bler_data[NR_NUM_MCS-1].length - 1][0]))
+  {
+    LOG_D(NR_MAC, "The SINR found is larger than last MCS table\n");
+    return NR_NUM_MCS-1;
+  }
+
+  for (int n = NR_NUM_MCS-1; n >= 0; n--)
+  {
+    CHECK_INDEX(nr_bler_data, n);
+    float largest_sinr = (nr_bler_data[n].bler_table[nr_bler_data[n].length - 1][0]);
+    float smallest_sinr = (nr_bler_data[n].bler_table[0][0]);
+    if (sinr < largest_sinr && sinr > smallest_sinr)
+    {
+      LOG_D(NR_MAC, "The SINR found in MCS %d table\n", n);
+      return n;
+    }
+  }
+  LOG_E(NR_MAC, "Unable to get an MCS value.\n");
+  abort();
+}
+*/
+
+/*
+static int get_cqi_from_mcs(void)
+{
+  static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+                                   9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15};
+  assert(NUM_ELEMENTS(mcs_to_cqi) == NR_NUM_MCS);
+  int slot = 0;
+  while (slot < NUM_NFAPI_SLOT)
+  {
+    if (slot_rnti_mcs[slot].latest)
+    {
+      int num_pdus = slot_rnti_mcs[slot].num_pdus;
+      if (num_pdus <= 0)
+      {
+        LOG_E(NR_MAC, "%s: slot_rnti_mcs[%d].num_pdus = 0\n", __FUNCTION__, slot);
+        abort();
+      }
+
+      CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus);
+      int mcs = get_mcs_from_sinr(slot_rnti_mcs[slot].sinr);
+      CHECK_INDEX(mcs_to_cqi, mcs);
+      int cqi = mcs_to_cqi[mcs];
+      LOG_D(NR_MAC, "SINR: %f -> MCS: %d -> CQI: %d\n", slot_rnti_mcs[slot].sinr, mcs, cqi);
+      return cqi;
+    }
+    slot++;
+  }
+  LOG_E(NR_MAC, "Unable to get CQI value because no MCS found\n");
+  abort();
+}
+*/
+
+static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, int index)
+{
+  if (pdu == NULL)
+  {
+    LOG_E(NR_MAC,"PDU NULL\n");
+    abort();
+  }
+
+  /* This function is executed for every pdsch pdu type in a dl_tti_request. We save
+     the assocaited MCS and RNTI value for each. The 'index' passed in is a count of
+     how many times we have called this function for a particular dl_tti_request. It
+     allows us to save MCS/RNTI data in correct indicies when multiple pdsch pdu's are received.*/
+  for (int i = 0; i < NUM_NFAPI_SLOT; i++)
+  {
+    slot_rnti_mcs[i].latest = false;
+  }
+
+  CHECK_INDEX(slot_rnti_mcs[slot].rnti, index);
+  CHECK_INDEX(slot_rnti_mcs[slot].mcs, index);
+  CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, index);
+  slot_rnti_mcs[slot].rnti[index] = pdu->rnti;
+  slot_rnti_mcs[slot].mcs[index] = pdu->mcsIndex[0];
+  slot_rnti_mcs[slot].rvIndex[index] = pdu->rvIndex[0];
+  slot_rnti_mcs[slot].drop_flag[index] = false;
+  slot_rnti_mcs[slot].num_pdus = index+1; //index starts at 0 so we incrament to get num of pdus
+  slot_rnti_mcs[slot].latest = true;
+  LOG_D(NR_MAC, "Adding MCS %d and RNTI %x for slot_rnti_mcs[%d]\n", slot_rnti_mcs[slot].mcs[index], slot_rnti_mcs[slot].rnti[index], slot);
+
+  return;
+}
+
+/*
+static bool did_drop_transport_block(int slot, uint16_t rnti)
+{
+  int num_pdus = slot_rnti_mcs[slot].num_pdus;
+  if (num_pdus <= 0)
+  {
+    LOG_E(MAC, "Problem, the PDU size is <= 0. We dropped this packet\n");
+    return true;
+  }
+  CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus);
+  CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus);
+  for (int n = 0; n < num_pdus; n++)
+  {
+    if (slot_rnti_mcs[slot].rnti[n] == rnti && slot_rnti_mcs[slot].drop_flag[n])
+    {
+      return true;
+    }
+  }
+  return false;
+}
+*/
+
+static float get_bler_val(uint8_t mcs, int sinr)
+{
+  // 4th col = dropped packets, 5th col = total packets
+  float bler_val = 0.0;
+  CHECK_INDEX(nr_bler_data, mcs);
+  LOG_D(NR_MAC, "sinr %d min %d max %d\n", sinr,
+                (int)(nr_bler_data[mcs].bler_table[0][0] * 10),
+                (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10)
+  );
+
+  if (sinr < (int)(nr_bler_data[mcs].bler_table[0][0] * 10))
+  {
+    LOG_D(NR_MAC, "MCS %d table. SINR is smaller than lowest SINR, bler_val is set based on lowest SINR in table\n", mcs);
+    bler_val = nr_bler_data[mcs].bler_table[0][4] / nr_bler_data[mcs].bler_table[0][5];
+    return bler_val;
+  }
+  if (sinr > (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10))
+  {
+    LOG_D(NR_MAC, "MCS %d table. SINR is greater than largest SINR. bler_val is set based on largest SINR in table\n", mcs);
+    bler_val = nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][4] / nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][5];
+    return bler_val;
+  }
+  // Loop through bler table to find sinr_index
+  for (int i = 0; i < nr_bler_data[mcs].length; i++)
+  {
+    int temp_sinr = (int)(nr_bler_data[mcs].bler_table[i][0] * 10);
+    if (temp_sinr == sinr)
+    {
+      bler_val = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
+      return bler_val;
+    }
+    // Linear interpolation when SINR is between indices
+    if (temp_sinr > sinr)
+    {
+      float bler_val1 = nr_bler_data[mcs].bler_table[i - 1][4] / nr_bler_data[mcs].bler_table[i - 1][5];
+      float bler_val2 = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5];
+      LOG_D(NR_MAC, "sinr %d min %f max %f\n", sinr, bler_val1, bler_val2);
+      return ((bler_val1 + bler_val2) / 2);
+    }
+  }
+  LOG_E(NR_MAC, "NO SINR INDEX FOUND!\n");
+  abort();
+
+}
+
+static inline bool is_channel_modeling(void)
+{
+  /* TODO: For now we enable channel modeling based on the node_number.
+     Replace with a command line option to enable/disable channel modeling.
+     The LTE UE will crash when channel modeling is conducted for NSA
+     mode. It does not crash for LTE mode. We have not implemented channel
+     modeling for NSA mode yet. For now, we ensure only do do channel modeling
+     in LTE/NR mode. */
+  return get_softmodem_params()->node_number == 0 && !get_softmodem_params()->nsa;
+}
+
+static bool should_drop_transport_block(int slot, uint16_t rnti)
+{
+  if (!is_channel_modeling())
+  {
+    return false;
+  }
+
+  /* We want to avoid dropping setup messages because this would be pathological. */
+  NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+  if (mac->ra.ra_state < RA_SUCCEEDED)
+  {
+    LOG_D(NR_MAC, "Not dropping because MAC state: %d", mac->ra.ra_state);
+    return false;
+  }
+
+  /* Get block error rate (bler_val) from table based on every saved
+     MCS and SINR to be used as the cutoff rate for dropping packets.
+     Generate random uniform vairable to compare against bler_val. */
+  int num_pdus = slot_rnti_mcs[slot].num_pdus;
+  assert(slot < 20 && slot >= 0);
+  LOG_D(NR_MAC, "rnti: %x  num_pdus %d state %d slot %u sinr %f\n",
+        rnti, num_pdus, mac->ra.ra_state, slot, slot_rnti_mcs[slot].sinr);
+  assert(num_pdus > 0);
+  CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus);
+  CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus);
+  CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus);
+  int n = 0;
+  uint8_t mcs = 99;
+  for (n = 0; n < num_pdus; n++)
+  {
+    if (slot_rnti_mcs[slot].rnti[n] == rnti)
+    {
+      mcs = slot_rnti_mcs[slot].mcs[n];
+    }
+    if (mcs != 99)
+    {
+      /* Use MCS to get the bler value. Since there can be multiple MCS
+         values for a particular slot, we verify that all PDUs are not
+         flagged for drop before returning. If even one is flagged for drop
+         we return immediately because we drop the entire packet. */
+
+      LOG_D(NR_MAC, "rnti: %x mcs %u slot %u sinr %f\n",
+        slot_rnti_mcs[slot].rnti[n], mcs, slot, slot_rnti_mcs[slot].sinr);
+
+      float bler_val;
+      if (slot_rnti_mcs[slot].rvIndex[n] != 0)
+        bler_val = 0;
+      else
+        bler_val = get_bler_val(mcs, ((int)(slot_rnti_mcs[slot].sinr * 10)));
+      double drop_cutoff = ((double) rand() / (RAND_MAX));
+      assert(drop_cutoff <= 1);
+      LOG_D(NR_MAC, "SINR = %f, Bler_val = %f, MCS = %"PRIu8"\n", slot_rnti_mcs[slot].sinr, bler_val, slot_rnti_mcs[slot].mcs[n]);
+      if (drop_cutoff <= bler_val)
+      {
+        slot_rnti_mcs[slot].drop_flag[n] = true;
+        LOG_T(NR_MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", slot = %d\n", bler_val, slot_rnti_mcs[slot].mcs[n], slot);
+        return slot_rnti_mcs[slot].drop_flag[n];
+      }
+    }
+
+  }
+
+  if (mcs == 99)
+  {
+    LOG_E(NR_MAC, "NO MCS Found for rnti %x. slot_rnti_mcs[%d].mcs[%d] \n", rnti, slot, n);
+    abort();
+  }
+  return false;
+}
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index 2a8a5147694b8d86dd6d0c488f2cf717cb8ef9f3..034c1c6b48b2ec4dac7046c9c4a03c486ac67380 100755
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -41,15 +41,44 @@
 #include "nfapi_nr_interface_scf.h"
 #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
 
+#define NR_NUM_MCS 29
+#define NUM_SINR 100
+#define NUM_BLER_COL 13
+#define NUM_NFAPI_SLOT 20
+#define NR_NUM_LAYER 1
+
 typedef struct NR_UL_TIME_ALIGNMENT NR_UL_TIME_ALIGNMENT_t;
 
 typedef struct nr_phy_channel_params_t
 {
     uint16_t sfn_slot;
-    float sinr;
+    uint16_t message_id;
+    uint16_t nb_of_sinrs;
+    float sinr[NR_NUM_LAYER];
     // Incomplete, need all channel parameters
 } nr_phy_channel_params_t;
 
+typedef struct
+{
+    uint8_t slot;
+    uint16_t rnti[256];
+    uint8_t mcs[256];
+    uint8_t rvIndex[256];
+    float sinr;
+    uint16_t num_pdus;
+    bool drop_flag[256];
+    bool latest;
+
+} slot_rnti_mcs_s;
+
+typedef struct
+{
+    uint16_t length;
+    float bler_table[NUM_SINR][NUM_BLER_COL];
+} nr_bler_struct;
+
+extern nr_bler_struct nr_bler_data[NR_NUM_MCS];
+
 typedef enum {
   ONLY_PUSCH,
   NOT_PUSCH,
@@ -240,6 +269,8 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request,
                            nfapi_nr_ul_dci_request_t *ul_dci_request,
                            nfapi_nr_ul_tti_request_t *ul_tti_request);
 
+bool sfn_slot_matcher(void *wanted, void *candidate);
+
 /**\brief done free of memory allocation by module_id and release to pointer pool.
    \param module_id module id*/
 int nr_ue_if_module_kill(uint32_t module_id);
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.c b/openair2/PHY_INTERFACE/phy_stub_UE.c
index 1598e3d6203c91a80a838a538f55144544d7eaa4..c4650f18f3a93e8c7e1878bbc5e687b6b0da81b2 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.c
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.c
@@ -1259,6 +1259,17 @@ void ue_init_standalone_socket(int tx_port, int rx_port)
   }
 }
 
+static uint16_t get_message_id(const uint8_t *buffer, ssize_t len)
+{
+  if (len < 4)
+    return 0;
+
+  // Unpack 2 bytes message_id from buffer.
+  uint16_t v;
+  memcpy(&v, buffer + 2, sizeof(v));
+  return ntohs(v);
+}
+
 void *ue_standalone_pnf_task(void *context)
 {
   struct sockaddr_in server_address;
@@ -1301,7 +1312,7 @@ void *ue_standalone_pnf_task(void *context)
         abort();
       }
     }
-    else if (len == sizeof(phy_channel_params_t))
+    else if (get_message_id((const uint8_t *)buffer, len) == 0x0FFF) // 0x0FFF : channel info identifier.
     {
       phy_channel_params_t ch_info;
       memcpy(&ch_info, buffer, sizeof(phy_channel_params_t));
@@ -1314,8 +1325,15 @@ void *ue_standalone_pnf_task(void *context)
       uint16_t sf = ch_info.sfn_sf & 15;
       assert(sf < 10);
 
-      sf_rnti_mcs[sf].sinr = ch_info.sinr;
-      LOG_D(MAC, "Received_SINR = %f\n",ch_info.sinr);
+      if (ch_info.nb_of_sinrs > 1)
+        LOG_W(MAC, "Expecting at most one SINR.\n");
+
+      // TODO: Update sinr field of slot_rnti_mcs to be array.
+      for (int i = 0; i < ch_info.nb_of_sinrs; ++i)
+      {
+        sf_rnti_mcs[sf].sinr = ch_info.sinr[i];
+        LOG_D(MAC, "Received_SINR[%d] = %f\n", i, ch_info.sinr[i]);
+      }
     }
     else
     {
diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h
index ebaae6e667b8aa7f8a7a88415871ba73df23f34f..d68d1dffdd91a25371c7193521bd2ae68f8a3298 100644
--- a/openair2/PHY_INTERFACE/phy_stub_UE.h
+++ b/openair2/PHY_INTERFACE/phy_stub_UE.h
@@ -24,6 +24,7 @@
 #define NUM_MCS 28
 #define NUM_SINR 100
 #define NUM_BLER_COL 13
+#define LTE_NUM_LAYER 1
 
 // this mutex is used to set multiple UE's UL value in L2 FAPI simulator.
 extern FILL_UL_INFO_MUTEX_t fill_ul_mutex;
@@ -126,7 +127,9 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
 typedef struct phy_channel_params_t
 {
     uint16_t sfn_sf;
-    float sinr;
+    uint16_t message_id;
+    uint16_t nb_of_sinrs;
+    float sinr[LTE_NUM_LAYER];
     // Incomplete, need all channel parameters
 } phy_channel_params_t;
 
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 4077ce16d23a53e004fd3c3eca96aa0213a726ad..55a7902c550c44dfbbad0f4e39361b46db2408b7 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -821,7 +821,6 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
   uint8_t                        buffer[RRC_BUF_SIZE];
   uint16_t                       size;
   int                            qos_flow_index = 0;
-  NR_QFI_t                       qfi = 0;
   int                            pdu_sessions_done = 0;
   int i;
   NR_CellGroupConfig_t *cellGroupConfig;
@@ -872,15 +871,21 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
     sdap_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
     memset(sdap_config, 0, sizeof(NR_SDAP_Config_t));
     sdap_config->pdu_Session = ue_context_pP->ue_context.pduSession[i].param.pdusession_id;
-    sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_present;
-    sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent;
+    if (rrc->configuration.enable_sdap) {
+      sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_present;
+      sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_present;
+    } else {
+      sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent;
+      sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent;
+    }
     sdap_config->defaultDRB = TRUE;
     sdap_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
     memset(sdap_config->mappedQoS_FlowsToAdd, 0, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
 
     for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pduSession[i].param.nb_qos; qos_flow_index++) {
-      qfi = ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].qfi;
-      ASN_SEQUENCE_ADD(&sdap_config->mappedQoS_FlowsToAdd->list, &qfi);
+      NR_QFI_t *qfi = calloc(1, sizeof(NR_QFI_t));
+      *qfi = ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].qfi;
+      ASN_SEQUENCE_ADD(&sdap_config->mappedQoS_FlowsToAdd->list, qfi);
     }
     sdap_config->mappedQoS_FlowsToRelease = NULL;
     DRB_config->cnAssociation->choice.sdap_Config = sdap_config;
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index ba5d7619d6985b1bd100e93b77c5ba5cd9287446..afad1dff943cd55806d6ca4544db27b2b5332fe0 100644
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -2788,7 +2788,6 @@ void start_oai_nrue_threads()
     init_queue(&nr_tx_req_queue);
     init_queue(&nr_ul_dci_req_queue);
     init_queue(&nr_ul_tti_req_queue);
-    init_queue(&nr_wait_ul_tti_req_queue);
 
     if (sem_init(&sfn_slot_semaphore, 0, 0) != 0)
     {
diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h
index 62d9167251300a064289082f07ddb7a6e6ed5fe5..510fbff230ebec811f9dd9a5c6b0c7ea5fe1454e 100644
--- a/openair2/RRC/NR_UE/rrc_proto.h
+++ b/openair2/RRC/NR_UE/rrc_proto.h
@@ -51,7 +51,6 @@ extern queue_t nr_dl_tti_req_queue;
 extern queue_t nr_tx_req_queue;
 extern queue_t nr_ul_dci_req_queue;
 extern queue_t nr_ul_tti_req_queue;
-extern queue_t nr_wait_ul_tti_req_queue;
 //
 //  main_rrc.c
 //
diff --git a/openair2/SDAP/nr_sdap/nr_sdap.c b/openair2/SDAP/nr_sdap/nr_sdap.c
new file mode 100644
index 0000000000000000000000000000000000000000..74ef93aff743fa9929e9c0d3aa2227dc5c45ec5b
--- /dev/null
+++ b/openair2/SDAP/nr_sdap/nr_sdap.c
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include "nr_sdap.h"
+
+boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p,
+                        const srb_flag_t srb_flag,
+                        const rb_id_t rb_id,
+                        const mui_t mui,
+                        const confirm_t confirm,
+                        const sdu_size_t sdu_buffer_size,
+                        unsigned char *const sdu_buffer,
+                        const pdcp_transmission_mode_t pt_mode,
+                        const uint32_t *sourceL2Id,
+                        const uint32_t *destinationL2Id,
+                        const uint8_t qfi,
+                        const boolean_t rqi,
+                        const int pdusession_id) {
+  nr_sdap_entity_t *sdap_entity;
+  sdap_entity = nr_sdap_get_entity(ctxt_p->rnti, pdusession_id);
+
+  if(sdap_entity == NULL) {
+    LOG_E(SDAP, "%s:%d:%s: Entity not found with ue rnti: %x and pdusession id: %d\n", __FILE__, __LINE__, __FUNCTION__, ctxt_p->rnti, pdusession_id);
+    return 0;
+  }
+
+  boolean_t ret = sdap_entity->tx_entity(sdap_entity,
+                                         ctxt_p,
+                                         srb_flag,
+                                         rb_id,
+                                         mui,
+                                         confirm,
+                                         sdu_buffer_size,
+                                         sdu_buffer,
+                                         pt_mode,
+                                         sourceL2Id,
+                                         destinationL2Id,
+                                         qfi,
+                                         rqi);
+  return ret;
+}
+
+void sdap_data_ind(rb_id_t pdcp_entity,
+                   int is_gnb,
+                   int has_sdap,
+                   int has_sdapULheader,
+                   int pdusession_id,
+                   int rnti,
+                   char *buf,
+                   int size) {
+  nr_sdap_entity_t *sdap_entity;
+  sdap_entity = nr_sdap_get_entity(rnti, pdusession_id);
+
+  if(sdap_entity == NULL) {
+    LOG_E(SDAP, "%s:%d:%s: Entity not found\n", __FILE__, __LINE__, __FUNCTION__);
+    return;
+  }
+
+  sdap_entity->rx_entity(sdap_entity,
+                         pdcp_entity,
+                         is_gnb,
+                         has_sdap,
+                         has_sdapULheader,
+                         pdusession_id,
+                         rnti,
+                         buf,
+                         size);
+}
diff --git a/openair2/SDAP/nr_sdap/nr_sdap.h b/openair2/SDAP/nr_sdap/nr_sdap.h
new file mode 100644
index 0000000000000000000000000000000000000000..cd702cfd7f39d2b6698842b3fa1b643458ba0710
--- /dev/null
+++ b/openair2/SDAP/nr_sdap/nr_sdap.h
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#ifndef _NR_SDAP_GNB_H_
+#define _NR_SDAP_GNB_H_
+
+#include "openair2/COMMON/platform_types.h"
+#include "common/utils/LOG/log.h"
+#include "nr_sdap_entity.h"
+
+/*
+ * TS 37.324 4.4 Functions
+ * Transfer of user plane data
+ * Downlink - gNB
+ * Uplink   - nrUE
+ */
+boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p,
+                        const srb_flag_t srb_flag,
+                        const rb_id_t rb_id,
+                        const mui_t mui,
+                        const confirm_t confirm,
+                        const sdu_size_t sdu_buffer_size,
+                        unsigned char *const sdu_buffer,
+                        const pdcp_transmission_mode_t pt_mode,
+                        const uint32_t *sourceL2Id,
+                        const uint32_t *destinationL2Id,
+                        const uint8_t qfi,
+                        const boolean_t rqi,
+                        const int pdusession_id
+                       );
+
+/*
+ * TS 37.324 4.4 Functions
+ * Transfer of user plane data
+ * Uplink   - gNB
+ * Downlink - nrUE
+ */
+void sdap_data_ind(rb_id_t pdcp_entity,
+                   int is_gnb,
+                   int has_sdap,
+                   int has_sdapULheader,
+                   int pdusession_id,
+                   int rnti,
+                   char *buf,
+                   int size
+                  );
+
+#endif
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5d1c1d6fe1dd1d630c464dd9e7fb2f79a491301
--- /dev/null
+++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
@@ -0,0 +1,481 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include "nr_sdap_entity.h"
+#include "common/utils/LOG/log.h"
+#include <openair2/LAYER2/PDCP_v10.1.0/pdcp.h>
+#include <openair3/ocp-gtpu/gtp_itf.h>
+#include "openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+
+typedef struct {
+  nr_sdap_entity_t *sdap_entity_llist;
+} nr_sdap_entity_info;
+
+static nr_sdap_entity_info sdap_info;
+
+nr_pdcp_ue_manager_t *nr_pdcp_sdap_get_ue_manager(void);
+
+void nr_pdcp_submit_sdap_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu){
+  nr_pdcp_ue_t *ue;
+  nr_pdcp_ue_manager_t *nr_pdcp_ue_manager;
+  nr_pdcp_ue_manager = nr_pdcp_sdap_get_ue_manager();
+  ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rnti);
+  ue->drb[sdap_ctrl_pdu_drb-1]->recv_sdu(ue->drb[sdap_ctrl_pdu_drb-1], (char*)&ctrl_pdu, SDAP_HDR_LENGTH, RLC_MUI_UNDEFINED);
+  return;
+}
+
+static boolean_t nr_sdap_tx_entity(nr_sdap_entity_t *entity,
+                                   protocol_ctxt_t *ctxt_p,
+                                   const srb_flag_t srb_flag,
+                                   const rb_id_t rb_id,
+                                   const mui_t mui,
+                                   const confirm_t confirm,
+                                   const sdu_size_t sdu_buffer_size,
+                                   unsigned char *const sdu_buffer,
+                                   const pdcp_transmission_mode_t pt_mode,
+                                   const uint32_t *sourceL2Id,
+                                   const uint32_t *destinationL2Id,
+                                   const uint8_t qfi,
+                                   const boolean_t rqi
+                                  ) {
+  /* The offset of the SDAP header, it might be 0 if the has_sdap is not true in the pdcp entity. */
+  int offset=0;
+  boolean_t ret=false;
+  /*Hardcode DRB ID given from upper layer (ue/enb_tun_read_thread rb_id), it will change if we have SDAP*/
+  rb_id_t sdap_drb_id = rb_id;
+  int pdcp_ent_has_sdap = 0;
+
+  if(sdu_buffer == NULL) {
+    LOG_E(SDAP, "%s:%d:%s: NULL sdu_buffer \n", __FILE__, __LINE__, __FUNCTION__);
+    exit(1);
+  }
+
+  uint8_t sdap_buf[SDAP_MAX_PDU];
+  rb_id_t pdcp_entity = entity->qfi2drb_map(entity, qfi, rb_id);
+
+  if(pdcp_entity){
+    sdap_drb_id = pdcp_entity;
+    pdcp_ent_has_sdap = entity->qfi2drb_table[qfi].hasSdap;
+  }
+
+  if(!pdcp_ent_has_sdap){
+    ret = pdcp_data_req(ctxt_p,
+                        srb_flag,
+                        sdap_drb_id,
+                        mui,
+                        confirm,
+                        sdu_buffer_size,
+                        sdu_buffer,
+                        pt_mode,
+                        sourceL2Id,
+                        destinationL2Id);
+
+    if(!ret)
+      LOG_E(SDAP, "%s:%d:%s: PDCP refused PDU\n", __FILE__, __LINE__, __FUNCTION__);
+
+    return ret;
+  }
+
+  if(sdu_buffer_size == 0 || sdu_buffer_size > 8999) {
+    LOG_E(SDAP, "%s:%d:%s: NULL or 0 or exceeded sdu_buffer_size (over max PDCP SDU)\n", __FILE__, __LINE__, __FUNCTION__);
+    return 0;
+  }
+
+  if(ctxt_p->enb_flag) { // gNB
+    offset = SDAP_HDR_LENGTH;
+    /*
+     * TS 37.324 4.4 Functions
+     * marking QoS flow ID in DL packets.
+     *
+     * Construct the DL SDAP data PDU.
+     */
+    nr_sdap_dl_hdr_t sdap_hdr;
+    sdap_hdr.QFI = qfi;
+    sdap_hdr.RQI = rqi;
+    sdap_hdr.RDI = 0; // SDAP Hardcoded Value
+    /* Add the SDAP DL Header to the buffer */
+    memcpy(&sdap_buf[0], &sdap_hdr, SDAP_HDR_LENGTH);
+    memcpy(&sdap_buf[SDAP_HDR_LENGTH], sdu_buffer, sdu_buffer_size);
+    LOG_D(SDAP, "TX Entity QFI: %u \n", sdap_hdr.QFI);
+    LOG_D(SDAP, "TX Entity RQI: %u \n", sdap_hdr.RQI);
+    LOG_D(SDAP, "TX Entity RDI: %u \n", sdap_hdr.RDI);
+  } else { // nrUE
+    offset = SDAP_HDR_LENGTH;
+    /*
+     * TS 37.324 4.4 Functions
+     * marking QoS flow ID in UL packets.
+     *
+     * 5.2.1 Uplink
+     * construct the UL SDAP data PDU as specified in the subclause 6.2.2.3.
+     */
+    nr_sdap_ul_hdr_t sdap_hdr;
+    sdap_hdr.QFI = qfi;
+    sdap_hdr.R = 0;
+    sdap_hdr.DC = rqi;
+    /* Add the SDAP UL Header to the buffer */
+    memcpy(&sdap_buf[0], &sdap_hdr, SDAP_HDR_LENGTH);
+    memcpy(&sdap_buf[SDAP_HDR_LENGTH], sdu_buffer, sdu_buffer_size);
+    LOG_D(SDAP, "TX Entity QFI: %u \n", sdap_hdr.QFI);
+    LOG_D(SDAP, "TX Entity R: %u \n", sdap_hdr.R);
+    LOG_D(SDAP, "TX Entity DC: %u \n", sdap_hdr.DC);
+  }
+
+  /*
+   * TS 37.324 5.2 Data transfer
+   * 5.2.1 Uplink UE side
+   * submit the constructed UL SDAP data PDU to the lower layers
+   *
+   * Downlink gNB side
+   */
+  ret = pdcp_data_req(ctxt_p,
+                      srb_flag,
+                      sdap_drb_id,
+                      mui,
+                      confirm,
+                      sdu_buffer_size+offset,
+                      sdap_buf,
+                      pt_mode,
+                      sourceL2Id,
+                      destinationL2Id);
+
+  if(!ret)
+    LOG_E(SDAP, "%s:%d:%s: PDCP refused PDU\n", __FILE__, __LINE__, __FUNCTION__);
+
+  return ret;
+}
+
+static void nr_sdap_rx_entity(nr_sdap_entity_t *entity,
+                              rb_id_t pdcp_entity,
+                              int is_gnb,
+                              int has_sdap,
+                              int has_sdapHeader,
+                              int pdusession_id,
+                              int rnti,
+                              char *buf,
+                              int size) {
+  /* The offset of the SDAP header, it might be 0 if the has_sdap is not true in the pdcp entity. */
+  int offset=0;
+
+  if(is_gnb) { // gNB
+    if(has_sdap && has_sdapHeader ) { // Handling the SDAP Header
+      offset = SDAP_HDR_LENGTH;
+      nr_sdap_ul_hdr_t *sdap_hdr = (nr_sdap_ul_hdr_t *)buf;
+      LOG_D(SDAP, "RX Entity Received QFI : %u\n", sdap_hdr->QFI);
+      LOG_D(SDAP, "RX Entity Received Reserved bit : %u\n", sdap_hdr->R);
+      LOG_D(SDAP, "RX Entity Received DC bit : %u\n", sdap_hdr->DC);
+
+      switch (sdap_hdr->DC) {
+        case SDAP_HDR_UL_DATA_PDU:
+          LOG_D(SDAP, "RX Entity Received SDAP Data PDU\n");
+          break;
+
+        case SDAP_HDR_UL_CTRL_PDU:
+          LOG_D(SDAP, "RX Entity Received SDAP Control PDU\n");
+          break;
+      }
+    }
+
+    // Pushing SDAP SDU to GTP-U Layer
+    MessageDef *message_p;
+    uint8_t *gtpu_buffer_p;
+    gtpu_buffer_p = itti_malloc(TASK_PDCP_ENB, TASK_GTPV1_U, size + GTPU_HEADER_OVERHEAD_MAX - offset);
+    AssertFatal(gtpu_buffer_p != NULL, "OUT OF MEMORY");
+    memcpy(&gtpu_buffer_p[GTPU_HEADER_OVERHEAD_MAX], buf+offset, size-offset);
+    message_p = itti_alloc_new_message(TASK_PDCP_ENB, 0 , GTPV1U_GNB_TUNNEL_DATA_REQ);
+    AssertFatal(message_p != NULL, "OUT OF MEMORY");
+    GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).buffer = gtpu_buffer_p;
+    GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).length              = size-offset;
+    GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).offset              = GTPU_HEADER_OVERHEAD_MAX;
+    GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).rnti                = rnti;
+    GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).pdusession_id       = pdusession_id;
+    LOG_D(SDAP, "%s()  sending message to gtp size %d\n", __func__,  size-offset);
+    itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p);
+  } else { //nrUE
+    /*
+     * TS 37.324 5.2 Data transfer
+     * 5.2.2 Downlink
+     * if the DRB from which this SDAP data PDU is received is configured by RRC with the presence of SDAP header.
+     */
+    if(has_sdap && has_sdapHeader) { // Handling the SDAP Header
+      offset = SDAP_HDR_LENGTH;
+      /*
+       * TS 37.324 5.2 Data transfer
+       * 5.2.2 Downlink
+       * retrieve the SDAP SDU from the DL SDAP data PDU as specified in the subclause 6.2.2.2.
+       */
+      nr_sdap_dl_hdr_t *sdap_hdr = (nr_sdap_dl_hdr_t *)buf;
+      LOG_D(SDAP, "RX Entity Received QFI : %u\n", sdap_hdr->QFI);
+      LOG_D(SDAP, "RX Entity Received RQI : %u\n", sdap_hdr->RQI);
+      LOG_D(SDAP, "RX Entity Received RDI : %u\n", sdap_hdr->RDI);
+
+      /*
+       * TS 37.324 5.2 Data transfer
+       * 5.2.2 Downlink
+       * Perform reflective QoS flow to DRB mapping as specified in the subclause 5.3.2.
+       */
+      if(sdap_hdr->RDI == SDAP_REFLECTIVE_MAPPING) {
+        /*
+         * TS 37.324 5.3 QoS flow to DRB Mapping 
+         * 5.3.2 Reflective mapping
+         * If there is no stored QoS flow to DRB mapping rule for the QoS flow and a default DRB is configured.
+         */
+        if(!entity->qfi2drb_table[sdap_hdr->QFI].drb_id && entity->default_drb){
+          nr_sdap_ul_hdr_t sdap_ctrl_pdu = entity->sdap_construct_ctrl_pdu(sdap_hdr->QFI);
+          rb_id_t sdap_ctrl_pdu_drb = entity->sdap_map_ctrl_pdu(entity, pdcp_entity, SDAP_CTRL_PDU_MAP_DEF_DRB, sdap_hdr->QFI);
+          entity->sdap_submit_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
+        }
+
+        /*
+         * TS 37.324 5.3 QoS flow to DRB mapping 
+         * 5.3.2 Reflective mapping
+         * if the stored QoS flow to DRB mapping rule for the QoS flow 
+         * is different from the QoS flow to DRB mapping of the DL SDAP data PDU
+         * and
+         * the DRB according to the stored QoS flow to DRB mapping rule is configured by RRC
+         * with the presence of UL SDAP header
+         */
+        if( (pdcp_entity != entity->qfi2drb_table[sdap_hdr->QFI].drb_id) && 
+             has_sdapHeader ){
+          nr_sdap_ul_hdr_t sdap_ctrl_pdu = entity->sdap_construct_ctrl_pdu(sdap_hdr->QFI);
+          rb_id_t sdap_ctrl_pdu_drb = entity->sdap_map_ctrl_pdu(entity, pdcp_entity, SDAP_CTRL_PDU_MAP_RULE_DRB, sdap_hdr->QFI);
+          entity->sdap_submit_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
+        }
+
+        /*
+         * TS 37.324 5.3 QoS flow to DRB Mapping 
+         * 5.3.2 Reflective mapping
+         * store the QoS flow to DRB mapping of the DL SDAP data PDU as the QoS flow to DRB mapping rule for the UL. 
+         */ 
+        entity->qfi2drb_table[sdap_hdr->QFI].drb_id = pdcp_entity;
+      }
+
+      /*
+       * TS 37.324 5.2 Data transfer
+       * 5.2.2 Downlink
+       * perform RQI handling as specified in the subclause 5.4
+       */
+      if(sdap_hdr->RQI == SDAP_RQI_HANDLING) {
+        LOG_W(SDAP, "UE - TODD 5.4\n");
+      }
+    } /*  else - retrieve the SDAP SDU from the DL SDAP data PDU as specified in the subclause 6.2.2.1 */
+
+    /*
+     * TS 37.324 5.2 Data transfer
+     * 5.2.2 Downlink
+     * deliver the retrieved SDAP SDU to the upper layer.
+     */
+    extern int nas_sock_fd[];
+    int len = write(nas_sock_fd[0], &buf[offset], size-offset);
+    LOG_D(SDAP, "RX Entity len : %d\n", len);
+    LOG_D(SDAP, "RX Entity size : %d\n", size);
+    LOG_D(SDAP, "RX Entity offset : %d\n", offset);
+
+    if (len != size-offset)
+      LOG_E(SDAP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
+  }
+}
+
+void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap){
+  if(qfi < SDAP_MAX_QFI &&
+     qfi > SDAP_MAP_RULE_EMPTY &&
+     drb > 0 &&
+     drb <= AVLBL_DRB)
+  {
+    entity->qfi2drb_table[qfi].drb_id = drb;
+    entity->qfi2drb_table[qfi].hasSdap = hasSdap;
+    LOG_D(SDAP, "Updated QFI to DRB Map: QFI %u -> DRB %ld \n", qfi, entity->qfi2drb_table[qfi].drb_id);
+    LOG_D(SDAP, "DRB %ld %s\n", entity->qfi2drb_table[qfi].drb_id, hasSdap ? "has SDAP" : "does not have SDAP");
+  }
+}
+
+void nr_sdap_qfi2drb_map_del(nr_sdap_entity_t *entity, uint8_t qfi){
+  entity->qfi2drb_table[qfi].drb_id = SDAP_NO_MAPPING_RULE;
+  LOG_D(SDAP, "Deleted QFI to DRB Map for QFI %u \n", qfi);
+}
+
+rb_id_t nr_sdap_qfi2drb_map(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t upper_layer_rb_id){
+  rb_id_t pdcp_entity;
+
+  pdcp_entity = entity->qfi2drb_table[qfi].drb_id;
+
+  if(pdcp_entity){
+    return pdcp_entity;
+  } else if(entity->default_drb) {
+    LOG_D(SDAP, "Mapped QFI %u to Default DRB\n", qfi);
+    return entity->default_drb;
+  } else {
+    return SDAP_MAP_RULE_EMPTY;
+  }
+
+  return pdcp_entity;
+}
+
+nr_sdap_ul_hdr_t nr_sdap_construct_ctrl_pdu(uint8_t qfi){
+  nr_sdap_ul_hdr_t sdap_end_marker_hdr;
+  sdap_end_marker_hdr.QFI = qfi;
+  sdap_end_marker_hdr.R = 0;
+  sdap_end_marker_hdr.DC = SDAP_HDR_UL_CTRL_PDU;
+  LOG_D(SDAP, "Constructed Control PDU with QFI:%u R:%u DC:%u \n", sdap_end_marker_hdr.QFI,
+                                                                   sdap_end_marker_hdr.R,
+                                                                   sdap_end_marker_hdr.DC);
+  return sdap_end_marker_hdr;
+}
+
+rb_id_t nr_sdap_map_ctrl_pdu(nr_sdap_entity_t *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi){
+  rb_id_t drb_of_endmarker = 0;
+  if(map_type == SDAP_CTRL_PDU_MAP_DEF_DRB){
+    drb_of_endmarker = entity->default_drb;
+    LOG_D(SDAP, "Mapped Control PDU to default drb\n");
+  }
+  if(map_type == SDAP_CTRL_PDU_MAP_RULE_DRB){
+    drb_of_endmarker = entity->qfi2drb_map(entity, dl_qfi, pdcp_entity);
+    LOG_D(SDAP, "Mapped Control PDU according to the mapping rule, qfi %u \n", dl_qfi);
+  }
+  return drb_of_endmarker;
+}
+
+void nr_sdap_submit_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu){
+  if(sdap_ctrl_pdu_drb){
+    nr_pdcp_submit_sdap_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, ctrl_pdu);
+    LOG_D(SDAP, "Sent Control PDU to PDCP Layer.\n");
+  }
+}
+
+void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity,
+                               rb_id_t pdcp_entity,
+                               uint16_t rnti,
+                               NR_QFI_t *mapped_qfi_2_add,
+                               uint8_t mappedQFIs2AddCount,
+                               uint8_t drb_identity)
+{
+  uint8_t qfi = 0;
+
+  for(int i = 0; i < mappedQFIs2AddCount; i++){
+    qfi = mapped_qfi_2_add[i];
+    if(existing_sdap_entity->default_drb && existing_sdap_entity->qfi2drb_table[qfi].drb_id == SDAP_NO_MAPPING_RULE){
+      nr_sdap_ul_hdr_t sdap_ctrl_pdu = existing_sdap_entity->sdap_construct_ctrl_pdu(qfi);
+      rb_id_t sdap_ctrl_pdu_drb = existing_sdap_entity->sdap_map_ctrl_pdu(existing_sdap_entity, pdcp_entity, SDAP_CTRL_PDU_MAP_DEF_DRB, qfi);
+      existing_sdap_entity->sdap_submit_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
+    }
+    if(existing_sdap_entity->qfi2drb_table[qfi].drb_id != drb_identity && existing_sdap_entity->qfi2drb_table[qfi].hasSdap){
+      nr_sdap_ul_hdr_t sdap_ctrl_pdu = existing_sdap_entity->sdap_construct_ctrl_pdu(qfi);
+      rb_id_t sdap_ctrl_pdu_drb = existing_sdap_entity->sdap_map_ctrl_pdu(existing_sdap_entity, pdcp_entity, SDAP_CTRL_PDU_MAP_RULE_DRB, qfi);
+      existing_sdap_entity->sdap_submit_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, sdap_ctrl_pdu);
+    }
+  }
+}
+
+nr_sdap_entity_t *new_nr_sdap_entity(int has_sdap,
+                                     uint16_t rnti,
+                                     int pdusession_id,
+                                     boolean_t is_defaultDRB,
+                                     uint8_t drb_identity,
+                                     NR_QFI_t *mapped_qfi_2_add,
+                                     uint8_t mappedQFIs2AddCount)
+{
+  if(nr_sdap_get_entity(rnti, pdusession_id)) {
+    LOG_E(SDAP, "SDAP Entity for UE already exists.\n");
+    nr_sdap_entity_t *existing_sdap_entity = nr_sdap_get_entity(rnti, pdusession_id);
+    rb_id_t pdcp_entity = existing_sdap_entity->default_drb;
+    nr_sdap_ue_qfi2drb_config(existing_sdap_entity, pdcp_entity, rnti, mapped_qfi_2_add, mappedQFIs2AddCount, drb_identity);
+    return existing_sdap_entity;
+  }
+
+  nr_sdap_entity_t *sdap_entity;
+  sdap_entity = calloc(1, sizeof(nr_sdap_entity_t));
+
+  if(sdap_entity == NULL) {
+    LOG_E(SDAP, "SDAP Entity creation failed, out of memory\n");
+    exit(1);
+  }
+
+  sdap_entity->rnti = rnti;
+  sdap_entity->pdusession_id = pdusession_id;
+
+  sdap_entity->tx_entity = nr_sdap_tx_entity;
+  sdap_entity->rx_entity = nr_sdap_rx_entity;
+
+  sdap_entity->sdap_construct_ctrl_pdu = nr_sdap_construct_ctrl_pdu;
+  sdap_entity->sdap_map_ctrl_pdu = nr_sdap_map_ctrl_pdu;
+  sdap_entity->sdap_submit_ctrl_pdu = nr_sdap_submit_ctrl_pdu;
+
+  sdap_entity->qfi2drb_map_update = nr_sdap_qfi2drb_map_update;
+  sdap_entity->qfi2drb_map_delete = nr_sdap_qfi2drb_map_del;
+  sdap_entity->qfi2drb_map = nr_sdap_qfi2drb_map;
+
+  if(is_defaultDRB) {
+    sdap_entity->default_drb = drb_identity;
+    LOG_I(SDAP, "Default DRB for the created SDAP entity: %ld \n", sdap_entity->default_drb);
+
+    if(mappedQFIs2AddCount) {
+      for (int i = 0; i < mappedQFIs2AddCount; i++)
+      {
+        LOG_D(SDAP, "Mapped QFI to Add : %ld \n", mapped_qfi_2_add[i]);
+        sdap_entity->qfi2drb_map_update(sdap_entity, mapped_qfi_2_add[i], sdap_entity->default_drb, has_sdap);
+      }
+    }
+  }
+
+  sdap_entity->next_entity = sdap_info.sdap_entity_llist;
+  sdap_info.sdap_entity_llist = sdap_entity;
+  return sdap_entity;
+}
+
+nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id) {
+  nr_sdap_entity_t *sdap_entity;
+  sdap_entity = sdap_info.sdap_entity_llist;
+
+  if(sdap_entity == NULL)
+    return NULL;
+
+  while(sdap_entity->rnti != rnti && sdap_entity->next_entity != NULL) {
+    sdap_entity = sdap_entity->next_entity;
+  }
+
+  if (sdap_entity->rnti == rnti && sdap_entity->pdusession_id == pdusession_id)
+    return sdap_entity;
+
+  return NULL;
+}
+
+void delete_nr_sdap_entity(uint16_t rnti) {
+  nr_sdap_entity_t *entityPtr, *entityPrev = NULL;
+  entityPtr = sdap_info.sdap_entity_llist;
+
+  if(entityPtr->rnti == rnti) {
+    sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity;
+    free(entityPtr);
+  } else {
+    while(entityPtr->rnti != rnti && entityPtr->next_entity != NULL) {
+      entityPrev = entityPtr;
+      entityPtr = entityPtr->next_entity;
+    }
+
+    if(entityPtr->rnti != rnti) {
+      entityPrev->next_entity = entityPtr->next_entity;
+      free(entityPtr);
+    }
+  }
+}
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.h b/openair2/SDAP/nr_sdap/nr_sdap_entity.h
new file mode 100644
index 0000000000000000000000000000000000000000..b46e5bf4e3462bef98b65b5e2e799b14dc7b6319
--- /dev/null
+++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.h
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#ifndef _NR_SDAP_ENTITY_H_
+#define _NR_SDAP_ENTITY_H_
+
+#include <stdint.h>
+#include "openair2/COMMON/platform_types.h"
+#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h"
+#include "NR_RadioBearerConfig.h"
+
+#define SDAP_BITMASK_DC             (0x80)
+#define SDAP_BITMASK_R              (0x40)
+#define SDAP_BITMASK_QFI            (0x3F)
+#define SDAP_BITMASK_RQI            (0x40)
+#define SDAP_HDR_UL_DATA_PDU        (1)
+#define SDAP_HDR_UL_CTRL_PDU        (0)
+#define SDAP_HDR_LENGTH             (1)
+#define SDAP_MAX_QFI                (64)
+#define SDAP_MAP_RULE_EMPTY         (0)
+#define AVLBL_DRB                   (5)
+#define SDAP_NO_MAPPING_RULE        (0)
+#define SDAP_REFLECTIVE_MAPPING     (1)
+#define SDAP_RQI_HANDLING           (1)
+#define SDAP_CTRL_PDU_MAP_DEF_DRB   (0)
+#define SDAP_CTRL_PDU_MAP_RULE_DRB  (1)
+#define SDAP_MAX_PDU                (9000)
+
+/*
+ * The values of QoS Flow ID (QFI) and Reflective QoS Indication,
+ * are located in the PDU Session Container, which is conveyed by
+ * the GTP-U Extension Header. Inside the DL PDU SESSION INFORMATION frame.
+ * TS 38.415 Fig. 5.5.2.1-1
+ */
+typedef struct nr_sdap_dl_hdr_s {
+  uint8_t QFI:6;
+  uint8_t RQI:1;
+  uint8_t RDI:1;
+} __attribute__((packed)) nr_sdap_dl_hdr_t;
+
+typedef struct nr_sdap_ul_hdr_s {
+  uint8_t QFI:6;
+  uint8_t R:1;
+  uint8_t DC:1;
+} __attribute__((packed)) nr_sdap_ul_hdr_t;
+
+typedef struct qfi2drb_s {
+  rb_id_t drb_id;
+  boolean_t hasSdap;
+} qfi2drb_t;
+
+void nr_pdcp_submit_sdap_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
+
+typedef struct nr_sdap_entity_s {
+  uint16_t rnti;
+  rb_id_t default_drb;
+  int pdusession_id;
+  qfi2drb_t qfi2drb_table[SDAP_MAX_QFI];
+
+  void (*qfi2drb_map_update)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap);
+  void (*qfi2drb_map_delete)(struct nr_sdap_entity_s *entity, uint8_t qfi);
+  rb_id_t (*qfi2drb_map)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t upper_layer_rb_id);
+
+  nr_sdap_ul_hdr_t (*sdap_construct_ctrl_pdu)(uint8_t qfi);
+  rb_id_t (*sdap_map_ctrl_pdu)(struct nr_sdap_entity_s *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi);
+  void (*sdap_submit_ctrl_pdu)(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
+
+
+  boolean_t (*tx_entity)(struct nr_sdap_entity_s *entity,
+                         protocol_ctxt_t *ctxt_p,
+                         const srb_flag_t srb_flag,
+                         const rb_id_t rb_id,
+                         const mui_t mui,
+                         const confirm_t confirm,
+                         const sdu_size_t sdu_buffer_size,
+                         unsigned char *const sdu_buffer,
+                         const pdcp_transmission_mode_t pt_mode,
+                         const uint32_t *sourceL2Id,
+                         const uint32_t *destinationL2Id,
+                         const uint8_t qfi,
+                         const boolean_t rqi
+                         );
+
+  void (*rx_entity)(struct nr_sdap_entity_s *entity,
+                    rb_id_t pdcp_entity,
+                    int is_gnb,
+                    int has_sdap,
+                    int has_sdapULheader,
+                    int pdusession_id,
+                    int rnti,
+                    char *buf,
+                    int size);
+
+  /* List of entities */
+  struct nr_sdap_entity_s *next_entity;
+} nr_sdap_entity_t;
+
+/* QFI to DRB Mapping Related Function */
+void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap);
+
+/* QFI to DRB Mapping Related Function */
+void nr_sdap_qfi2drb_map_del(nr_sdap_entity_t *entity, uint8_t qfi);
+
+/*
+ * TS 37.324
+ * 4.4 Functions
+ * Mapping between a QoS flow and a DRB for both DL and UL.
+ *
+ * 5.2.1 Uplink
+ * If there is no stored QoS flow to DRB mapping rule for the QoS flow as specified in the subclause 5.3, map the SDAP SDU to the default DRB
+ * else, map the SDAP SDU to the DRB according to the stored QoS flow to DRB mapping rule.
+ */
+rb_id_t nr_sdap_qfi2drb_map(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t upper_layer_rb_id);
+
+/*
+ * TS 37.324 5.3 QoS flow to DRB Mapping 
+ * construct an end-marker control PDU, as specified in the subclause 6.2.3, for the QoS flow;
+ */
+nr_sdap_ul_hdr_t nr_sdap_construct_ctrl_pdu(uint8_t qfi);
+
+/*
+ * TS 37.324 5.3 QoS flow to DRB Mapping 
+ * map the end-marker control PDU to the
+ * 1.) default DRB or 
+ * 2.) DRB according to the stored QoS flow to DRB mapping rule
+ */
+rb_id_t nr_sdap_map_ctrl_pdu(nr_sdap_entity_t *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi);
+
+/*
+ * TS 37.324 5.3 QoS flow to DRB Mapping 
+ * Submit the end-marker control PDU to the lower layer.
+ */
+void nr_sdap_submit_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
+
+/*
+ * TS 37.324 5.3 QoS flow to DRB Mapping 
+ * 5.3.1 Configuration Procedures
+ */
+void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, 
+                               rb_id_t pdcp_entity, 
+                               uint16_t rnti,
+                               NR_QFI_t *mapped_qfi_2_add, 
+                               uint8_t mappedQFIs2AddCount,
+                               uint8_t drb_identity);
+
+/*
+ * TS 37.324 4.4 5.1.1 SDAP entity establishment
+ * Establish an SDAP entity.
+ */
+nr_sdap_entity_t *new_nr_sdap_entity(int has_sdap,
+                                     uint16_t rnti,
+                                     int pdusession_id,
+                                     boolean_t is_defaultDRB,
+                                     uint8_t default_DRB,
+                                     NR_QFI_t *mapped_qfi_2_add,
+                                     uint8_t mappedQFIs2AddCount);
+
+/* Entity Handling Related Functions */
+nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id);
+
+/* Entity Handling Related Functions */
+void delete_nr_sdap_entity(uint16_t rnti);
+
+#endif
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_gnb.c b/openair2/SDAP/nr_sdap/nr_sdap_gnb.c
deleted file mode 100644
index 5f0a2640e960ddd6b660c21a4035cd64152b79a3..0000000000000000000000000000000000000000
--- a/openair2/SDAP/nr_sdap/nr_sdap_gnb.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-#include "nr_sdap_gnb.h"
-#include <openair2/LAYER2/PDCP_v10.1.0/pdcp.h>
-
-boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p,
-                            const srb_flag_t srb_flag,
-                            const rb_id_t rb_id,
-                            const mui_t mui,
-                            const confirm_t confirm,
-                            const sdu_size_t sdu_buffer_size,
-                            unsigned char *const sdu_buffer,
-                            const pdcp_transmission_mode_t pt_mode,
-                            const uint32_t *sourceL2Id,
-                            const uint32_t *destinationL2Id
-                           ) {
-  if(sdu_buffer == NULL) {
-    LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - NULL sdu_buffer \n", __FILE__, __LINE__, __FUNCTION__);
-    exit(1);
-  }
-
-  if(sdu_buffer_size == 0) {
-    LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - NULL or 0 sdu_buffer_size \n", __FILE__, __LINE__, __FUNCTION__);
-    exit(1);
-  }
-
-  uint8_t *sdap_buf = (uint8_t *)malloc(sdu_buffer_size+SDAP_HDR_LENGTH);
-  nr_sdap_dl_hdr_t sdap_hdr;
-  sdap_hdr.RDI = 0; // SDAP_Hardcoded -
-  sdap_hdr.RQI = 0; // SDAP_Hardcoded - Should get this info from DL_PDU_SESSION_INFORMATION
-  sdap_hdr.QFI = 1; // SDAP_Hardcoded - Should get this info from DL_PDU_SESSION_INFORMATION
-  memcpy(&sdap_buf[0], &sdap_hdr, 1);
-  memcpy(&sdap_buf[1], sdu_buffer, sdu_buffer_size);
-  rb_id_t sdap_drb_id = rb_id; // SDAP_Hardcoded - Should get this info from QFI to DRB mapping table
-  boolean_t ret = pdcp_data_req(ctxt_p,
-                                srb_flag,
-                                sdap_drb_id,
-                                mui,
-                                confirm,
-                                sdu_buffer_size+1,
-                                sdap_buf,
-                                pt_mode,
-                                sourceL2Id,
-                                destinationL2Id);
-
-  if(!ret) {
-    LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - PDCP DL refused PDU\n", __FILE__, __LINE__, __FUNCTION__);
-    free(sdap_buf);
-    return 0;
-  }
-
-  free(sdap_buf);
-  return 1;
-}
-
-void sdap_gnb_ul_header_handler(char sdap_gnb_ul_hdr) {
-  nr_sdap_ul_hdr_t *sdap_hdr_ul = (nr_sdap_ul_hdr_t *)&sdap_gnb_ul_hdr;
-
-  switch (sdap_hdr_ul->DC) {
-    case SDAP_HDR_UL_DATA_PDU:
-      LOG_I(PDCP, "%s:%d:%s: SDAP Layer gNB - UL Received SDAP Data PDU\n", __FILE__, __LINE__, __FUNCTION__);
-      break;
-
-    case SDAP_HDR_UL_CTRL_PDU:
-      LOG_I(PDCP, "%s:%d:%s: SDAP Layer gNB - Received SDAP Control PDU\n", __FILE__, __LINE__, __FUNCTION__);
-      break;
-  }
-}
\ No newline at end of file
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_gnb.h b/openair2/SDAP/nr_sdap/nr_sdap_gnb.h
deleted file mode 100644
index 243aa8901088d81039cfa8576883e49d6572e4c2..0000000000000000000000000000000000000000
--- a/openair2/SDAP/nr_sdap/nr_sdap_gnb.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-#ifndef _NR_SDAP_GNB_
-#define _NR_SDAP_GNB_
-
-#include "openair2/COMMON/platform_types.h"
-#include "common/utils/LOG/log.h"
-
-#define SDAP_BITMASK_DC         (0x80)
-#define SDAP_BITMASK_R          (0x40)
-#define SDAP_BITMASK_QFI        (0x3F)
-#define SDAP_HDR_UL_DATA_PDU    (1)
-#define SDAP_HDR_UL_CTRL_PDU    (0)
-#define SDAP_HDR_LENGTH         (1)
-
-typedef struct nr_sdap_dl_hdr_s {
-  uint8_t QFI:6;
-  uint8_t RQI:1;
-  uint8_t RDI:1;
-} __attribute__((packed)) nr_sdap_dl_hdr_t;
-
-typedef struct nr_sdap_ul_hdr_s {
-  uint8_t QFI:6;
-  uint8_t R:1;
-  uint8_t DC:1;
-} __attribute__((packed)) nr_sdap_ul_hdr_t;
-
-boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p,
-                            const srb_flag_t srb_flag,
-                            const rb_id_t rb_id,
-                            const mui_t mui,
-                            const confirm_t confirm,
-                            const sdu_size_t sdu_buffer_size,
-                            unsigned char *const sdu_buffer,
-                            const pdcp_transmission_mode_t pt_mode,
-                            const uint32_t *sourceL2Id,
-                            const uint32_t *destinationL2Id
-                           );
-
-void sdap_gnb_ul_header_handler(char sdap_gnb_ul_hdr);
-
-#endif
\ No newline at end of file
diff --git a/openair2/SDAP/nr_sdap/sdap_gNB.c b/openair2/SDAP/nr_sdap/sdap_gNB.c
deleted file mode 100644
index ad84e4c273a63a01331453c738080b675467f23d..0000000000000000000000000000000000000000
--- a/openair2/SDAP/nr_sdap/sdap_gNB.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-/*! \file sdap_gNB.c
- * \brief sdap tasks for gNB
- * \author Konstantinos Alexandris <Konstantinos.Alexandris@eurecom.fr>, Cedric Roux <Cedric.Roux@eurecom.fr>, Navid Nikaein <Navid.Nikaein@eurecom.fr>
- * \date 2018
- * \version 1.0
- */
-#define SDAP_GNB
-#define SDAP_GNB_C
-
diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp
index cc41de3550bb701e3b04cf09733aab6fb96dc347..7b8ba308bfb41a979b97c5244dc9052befe74a05 100644
--- a/openair3/ocp-gtpu/gtp_itf.cpp
+++ b/openair3/ocp-gtpu/gtp_itf.cpp
@@ -17,9 +17,11 @@ extern "C" {
 #include <openair2/COMMON/gtpv1_u_messages_types.h>
 #include <openair3/ocp-gtpu/gtp_itf.h>
 #include <openair2/LAYER2/PDCP_v10.1.0/pdcp.h>
-#include "openair2/SDAP/nr_sdap/nr_sdap_gnb.h"
+#include "openair2/SDAP/nr_sdap/nr_sdap.h"
 //#include <openair1/PHY/phy_extern.h>
 
+static boolean_t is_gnb = false;
+
 #pragma pack(1)
 
 typedef struct Gtpv1uMsgHeader {
@@ -34,8 +36,35 @@ typedef struct Gtpv1uMsgHeader {
   teid_t teid;
 } __attribute__((packed)) Gtpv1uMsgHeaderT;
 
+typedef struct Gtpv1uMsgHeaderOptFields {
+  uint8_t seqNum1Oct;
+  uint8_t seqNum2Oct;
+  uint8_t NPDUNum;
+  uint8_t NextExtHeaderType;    
+} __attribute__((packed)) Gtpv1uMsgHeaderOptFieldsT;
+
+typedef struct PDUSessionContainer {
+  uint8_t spare:4;
+  uint8_t PDU_type:4;
+  uint8_t QFI:6;
+  uint8_t RQI:1;
+  uint8_t PPP:1;
+} __attribute__((packed)) PDUSessionContainerT;
+
+typedef struct Gtpv1uExtHeader {
+  uint8_t ExtHeaderLen;
+  PDUSessionContainerT pdusession_cntr;
+  //uint8_t NextExtHeaderType;
+}__attribute__((packed)) Gtpv1uExtHeaderT;
+
 #pragma pack()
 
+// TS 29.281, fig 5.2.1-3
+#define PDU_SESSION_CONTAINER       (0x85)
+// TS 29.281, 5.2.1
+#define EXT_HDR_LNTH_OCTET_UNITS    (4)
+#define NO_MORE_EXT_HDRS            (0)
+
 // TS 29.060, table 7.1 defines the possible message types
 // here are all the possible messages (3GPP R16)
 #define GTP_ECHO_REQ                                         (1)
@@ -65,6 +94,8 @@ typedef struct {
   rnti_t rnti;
   ebi_t incoming_rb_id;
   gtpCallback callBack;
+  gtpCallbackSDAP callBackSDAP;
+  int pdusession_id;
 } rntiData_t;
 
 class gtpEndPoint {
@@ -448,6 +479,10 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
   inst->te2ue_mapping[incoming_teid].incoming_rb_id= incoming_bearer_id;
 
   inst->te2ue_mapping[incoming_teid].callBack=callBack;
+  
+  inst->te2ue_mapping[incoming_teid].callBackSDAP = sdap_data_req;
+
+  inst->te2ue_mapping[incoming_teid].pdusession_id = (uint8_t)outgoing_bearer_id;
 
   gtpv1u_bearer_t *tmp=&inst->ue2te_mapping[rnti].bearers[outgoing_bearer_id];
 
@@ -567,14 +602,14 @@ int gtpv1u_create_ngu_tunnel(  const instance_t instance,
         create_tunnel_req->num_tunnels,
         create_tunnel_req->outgoing_teid[0]);
   tcp_udp_port_t dstport=globGtp.instances[compatInst(instance)].get_dstport();
-
+  is_gnb = true;
   for (int i = 0; i < create_tunnel_req->num_tunnels; i++) {
     teid_t teid=newGtpuCreateTunnel(instance, create_tunnel_req->rnti,
                                     create_tunnel_req->incoming_rb_id[i],
                                     create_tunnel_req->pdusession_id[i],
                                     create_tunnel_req->outgoing_teid[i],
                                     create_tunnel_req->dst_addr[i], dstport,
-                                    sdap_gnb_data_req);
+                                    pdcp_data_req);
     create_tunnel_resp->status=0;
     create_tunnel_resp->rnti=create_tunnel_req->rnti;
     create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels;
@@ -815,10 +850,28 @@ static int Gtpv1uHandleGpdu(int h,
     return GTPNOK;
   }
 
-  int offset=8;
-
-  if( msgHdr->E ||  msgHdr->S ||msgHdr->PN)
-    offset+=8;
+  int offset=sizeof(Gtpv1uMsgHeaderT);
+
+  uint8_t qfi = 0;
+  boolean_t rqi = FALSE;
+
+  if( msgHdr->E || msgHdr->S || msgHdr->PN){
+   Gtpv1uMsgHeaderOptFieldsT *msgHdrOpt = (Gtpv1uMsgHeaderOptFieldsT *)(msgBuf+offset);
+   offset+=sizeof(Gtpv1uMsgHeaderOptFieldsT);
+    if( msgHdr->E && msgHdrOpt->NextExtHeaderType == PDU_SESSION_CONTAINER){
+      Gtpv1uExtHeaderT *msgHdrExt = (Gtpv1uExtHeaderT *)(msgBuf+offset);
+      offset+=msgHdrExt->ExtHeaderLen*EXT_HDR_LNTH_OCTET_UNITS;
+      qfi = msgHdrExt->pdusession_cntr.QFI;
+      rqi = msgHdrExt->pdusession_cntr.RQI;
+
+      /* 
+       * Check if the next extension header type of GTP extension header is set to 0
+       * We can not put it in the struct Gtpv1uExtHeaderT because the length is dynamic.
+       */
+      if(*(msgBuf+offset-1) != NO_MORE_EXT_HDRS)
+        LOG_W(GTPU, "Warning -  Next extension header is not zero, handle it \n");
+    }
+  }
 
   // This context is not good for gtp
   // frame, ... has no meaning
@@ -843,17 +896,34 @@ static int Gtpv1uHandleGpdu(int h,
   const uint32_t destinationL2Id=0;
   pthread_mutex_unlock(&globGtp.gtp_lock);
 
-  if ( !tunnel->second.callBack(&ctxt,
-                                srb_flag,
-                                rb_id,
-                                mui,
-                                confirm,
-                                sdu_buffer_size,
-                                sdu_buffer,
-                                mode,
-                                &sourceL2Id,
-                                &destinationL2Id) )
-    LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h);
+  if(is_gnb && qfi){
+    if ( !tunnel->second.callBackSDAP(&ctxt,
+                                      srb_flag,
+                                      rb_id,
+                                      mui,
+                                      confirm,
+                                      sdu_buffer_size,
+                                      sdu_buffer,
+                                      mode,
+                                      &sourceL2Id,
+                                      &destinationL2Id,
+                                      qfi,
+                                      rqi,
+                                      tunnel->second.pdusession_id) )
+      LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h);
+  } else {
+    if ( !tunnel->second.callBack(&ctxt,
+                                  srb_flag,
+                                  rb_id,
+                                  mui,
+                                  confirm,
+                                  sdu_buffer_size,
+                                  sdu_buffer,
+                                  mode,
+                                  &sourceL2Id,
+                                  &destinationL2Id) )
+      LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h);
+  }
 
   LOG_D(GTPU,"[%d] Received a %d bytes packet for: teid:%x\n", h,
         msgBufLen-offset,
diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h
index ba6cf0f8bb98e3da99af0e7c4162c5fe2ffb731d..17882ebf1e7e0f04846782a2e0733c123a5def7f 100644
--- a/openair3/ocp-gtpu/gtp_itf.h
+++ b/openair3/ocp-gtpu/gtp_itf.h
@@ -20,6 +20,21 @@ typedef boolean_t (*gtpCallback)(
   const uint32_t *sourceL2Id,
   const uint32_t *destinationL2Id);
 
+typedef boolean_t (*gtpCallbackSDAP)(
+  protocol_ctxt_t  *ctxt_pP,
+  const srb_flag_t     srb_flagP,
+  const rb_id_t        rb_idP,
+  const mui_t          muiP,
+  const confirm_t      confirmP,
+  const sdu_size_t     sdu_buffer_sizeP,
+  unsigned char *const sdu_buffer_pP,
+  const pdcp_transmission_mode_t modeP,
+  const uint32_t *sourceL2Id,
+  const uint32_t *destinationL2Id,
+  const uint8_t   qfi,
+  const boolean_t rqi,
+  const int       pdusession_id);
+
 typedef struct openAddr_s {
   char originHost[HOST_NAME_MAX];
   char originService[HOST_NAME_MAX];