diff --git a/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
index b9c569b6256d6e444d7abcc5bcfdd6552306f459..c9e51c352bffe6f9b3b60a8f3ba4fdadf3642b90 100644
--- a/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
+++ b/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
@@ -263,11 +263,6 @@ fhi_72 = {
   ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
   mtu = 9600;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429);
-    T2a_cp_ul = (285, 429);
-    T2a_up = (125, 428);
-    Ta3 = (130, 170);
     T1a_cp_dl = (285, 470);
     T1a_cp_ul = (285, 429);
     T1a_up = (125, 350);
diff --git a/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf b/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
index de2a610371ad3121b50c7d35db6e59146ad6a514..acb000e7c32d8a205c1b71cd28dc84503b64a6a8 100644
--- a/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
+++ b/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
@@ -271,11 +271,6 @@ fhi_72 = {
   ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
   mtu = 9600;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (259, 500);
-    T2a_cp_ul = (25, 500);
-    T2a_up = (134, 375);
-    Ta3 = (152, 160);
     T1a_cp_dl = (419, 470);
     T1a_cp_ul = (285, 336);
     T1a_up = (294, 345);
diff --git a/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch b/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8ab8da6aad1c7385edcce377061caa0804df5887
--- /dev/null
+++ b/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch
@@ -0,0 +1,493 @@
+diff --git a/fhi_lib/app/src/common.h b/fhi_lib/app/src/common.h
+index ac5f471..bbd39fe 100644
+--- a/fhi_lib/app/src/common.h
++++ b/fhi_lib/app/src/common.h
+@@ -28,7 +28,7 @@
+ #include <rte_common.h>
+ #include <rte_mbuf.h>
+ 
+-#define VERSIONX                "oran_f_release_v1.0"
++#define VERSIONX                "oran_f_release_v1.1"
+ 
+ #define APP_O_DU  0
+ #define APP_O_RU  1
+diff --git a/fhi_lib/lib/Makefile b/fhi_lib/lib/Makefile
+index eccc4ae..8ddb22e 100644
+--- a/fhi_lib/lib/Makefile
++++ b/fhi_lib/lib/Makefile
+@@ -23,12 +23,18 @@ MYCUSTOMSPACE1='------------------------------------------------------------'
+ ##############################################################
+ #  Tools configuration
+ ##############################################################
+-ifeq ($(WIRELESS_SDK_TOOLCHAIN),icc)
+-CC  := icc
+-CPP := icpc
+-AS := as
+-AR := ar
+-LD := icc
++ifeq ($(WIRELESS_SDK_TOOLCHAIN),gcc)
++    CC  := gcc
++    CPP := g++
++    AS := as
++    AR := ar
++    LD := gcc
++else ifeq ($(WIRELESS_SDK_TOOLCHAIN),icc)
++    CC  := icc
++    CPP := icpc
++    AS := as
++    AR := ar
++    LD := icc
+ else ifeq ($(WIRELESS_SDK_TOOLCHAIN),icx)
+     CC  := icx
+     CPP := icpx
+@@ -72,7 +78,7 @@ ifeq ($(RTE_SDK),)
+ endif
+ 
+ RTE_TARGET ?= x86_64-native-linux-icc
+-RTE_INC := $(shell PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$(RTE_SDK)/build/meson-uninstalled pkgconf --cflags-only-I libdpdk)
++RTE_INC := $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH):/usr/lib64/pkgconfig:$(RTE_SDK)/build/meson-uninstalled pkgconf --cflags-only-I libdpdk)
+ 
+ API_DIR := $(PROJECT_DIR)/api
+ SRC_DIR := $(PROJECT_DIR)/src
+@@ -110,8 +116,7 @@ CPP_SRC = $(SRC_DIR)/xran_compression.cpp \
+ 	$(SRC_DIR)/xran_bfp_cplane32.cpp \
+ 	$(SRC_DIR)/xran_bfp_cplane64.cpp \
+ 	$(SRC_DIR)/xran_bfp_uplane_9b16rb.cpp \
+-	$(SRC_DIR)/xran_bfp_uplane.cpp \
+-	$(SRC_DIR)/xran_mod_compression.cpp
++	$(SRC_DIR)/xran_bfp_uplane.cpp
+ 
+ CPP_SRC_SNC = $(SRC_DIR)/xran_compression_snc.cpp \
+ 	$(SRC_DIR)/xran_bfp_cplane8_snc.cpp \
+@@ -127,7 +132,7 @@ CC_FLAGS += -std=gnu11 -Wall -Wno-deprecated-declarations  \
+         -fPIC \
+ 	-Wall \
+ 	-Wimplicit-function-declaration \
+-	-g -O3 -mcmodel=large
++	-g -O -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512#--wd1786 -mcmodel=large
+ 
+ ifeq ($(WIRELESS_SDK_TOOLCHAIN),icc)
+ CC_FLAGS += -wd1786 -restrict
+@@ -138,8 +143,9 @@ CC_FLAGS += -march=icelake-server -mintrinsic-promote -Wno-unused-function -Wno-
+ endif
+ 
+ CPP_FLAGS := -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D_GNU_SOURCE -D_REENTRANT -pipe \
+-                  -falign-functions=16 \
+-        -Werror -Wno-unused-variable -std=c++14 -mcmodel=large -fPIC
++                -fPIC \
++                -falign-functions=16  \
++        -Werror -Wno-unused-variable -std=c++14 -mcmodel=large -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512
+ 
+ ifeq ($(WIRELESS_SDK_TOOLCHAIN),icc)
+ CPP_FLAGS +=  -fp-model fast=2 -no-prec-div -no-prec-sqrt -fast-transcendentals -restrict
+@@ -186,8 +192,8 @@ CPP_SNC_OBJTARGETS := $(addprefix $(PROJECT_OBJ_DIR)/,$(CPP_OBJS_SNC))
+ 
+ AS_OBJTARGETS := $(addprefix $(PROJECT_OBJ_DIR)/,$(AS_OBJS))
+ #-qopt-report=5 -qopt-matmul -qopt-report-phase=all
+-CPP_COMP       := -O3 -DNDEBUG  -xcore-avx512 -fPIE -fasm-blocks
+-CPP_COMP_SNC   := -O3 -DNDEBUG -march=icelake-server -fPIE -fasm-blocks
++CPP_COMP       := -O3 -DNDEBUG  -fPIE
++CPP_COMP_SNC   := -O3 -DNDEBUG -march=icelake-server -fPIE
+ CC_FLAGS_FULL  := $(CC_FLAGS)  $(INC) $(DEF)
+ CPP_FLAGS_FULL := $(CPP_FLAGS) $(CPP_COMP) $(INC) $(DEF)
+ CPP_FLAGS_FULL_SNC := $(CPP_FLAGS) $(CPP_COMP_SNC) $(INC) $(DEF)
+diff --git a/fhi_lib/lib/api/xran_fh_o_du.h b/fhi_lib/lib/api/xran_fh_o_du.h
+index bacf597..90a42a2 100644
+--- a/fhi_lib/lib/api/xran_fh_o_du.h
++++ b/fhi_lib/lib/api/xran_fh_o_du.h
+@@ -1193,6 +1193,31 @@ int32_t xran_reg_physide_cb_by_dev_id(void *pHandle, xran_fh_tti_callback_fn Cb,
+  */
+ int32_t xran_get_slot_idx (uint32_t PortId, uint32_t *nFrameIdx, uint32_t *nSubframeIdx,  uint32_t *nSlotIdx, uint64_t *nSecond);
+ 
++/**
++ * @ingroup xran
++ *
++ *   Function returns Frame, Subframe, Slot Number based on rx_tti
++ *
++ * @param tti
++ *    tti for which to compute Frame, Subframe, Slot
++ *
++ * @param nFrameIdx
++ *    Pointer to Frame number [0-99]
++ *
++ * @param nSubframeIdx
++ *    Pointer to Subframe number [0-10]
++ *
++ * @param nSlotIdx
++ *    Pointer to Slot number [0-7]
++ *
++ * @param nSecond
++ *    Pointer to current UTC second
++ *
++ * @return
++ *   current TTI number [0-7999]
++ */
++int32_t xran_get_slot_idx_from_tti(uint32_t tti, uint32_t *nFrameIdx, uint32_t *nSubframeIdx, uint32_t *nSlotIdx, uint64_t *nSecond);
++
+ /**
+  * @ingroup xran
+  *
+diff --git a/fhi_lib/lib/api/xran_up_api.h b/fhi_lib/lib/api/xran_up_api.h
+index 46e0e1d..409ef4b 100644
+--- a/fhi_lib/lib/api/xran_up_api.h
++++ b/fhi_lib/lib/api/xran_up_api.h
+@@ -80,6 +80,7 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf,
+     uint8_t *subframe_id,
+     uint8_t *slot_id,
+     uint8_t *symb_id,
++    uint8_t *filter_id,
+     union ecpri_seq_id *seq_id,
+     uint16_t *num_prbu,
+     uint16_t *start_prbu,
+@@ -89,7 +90,8 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf,
+     int8_t   expect_comp,
+     enum xran_comp_hdr_type staticComp,
+     uint8_t *compMeth,
+-    uint8_t *iqWidth);
++    uint8_t *iqWidth,
++    uint8_t *is_prach);
+ 
+ int xran_prepare_iq_symbol_portion(
+                         struct rte_mbuf *mbuf,
+diff --git a/fhi_lib/lib/ethernet/ethdi.c b/fhi_lib/lib/ethernet/ethdi.c
+index f5b2fd6..e949fe7 100644
+--- a/fhi_lib/lib/ethernet/ethdi.c
++++ b/fhi_lib/lib/ethernet/ethdi.c
+@@ -325,8 +325,8 @@ xran_ethdi_init_dpdk_io(char *name, const struct xran_io_cfg *io_cfg,
+     char bbdev_wdev[32]   = "";
+     char bbdev_vdev[32]   = "";
+     char iova_mode[32]    = "--iova-mode=pa";
+-    char socket_mem[32]   = "--socket-mem=8192";
+-    char socket_limit[32] = "--socket-limit=8192";
++    char socket_mem[32]   = "--socket-mem=0";
++    char socket_limit[32] = "--socket-limit=0";
+     char ring_name[32]    = "";
+     int32_t xran_port = -1;
+     queueid_t qi = 0;
+@@ -336,7 +336,7 @@ xran_ethdi_init_dpdk_io(char *name, const struct xran_io_cfg *io_cfg,
+     cpu = sched_getcpu();
+     node = numa_node_of_cpu(cpu);
+ 
+-    char *argv[] = { name, core_mask, "-n2", iova_mode, socket_mem, socket_limit, "--proc-type=auto",
++    char *argv[] = { name, core_mask, "-n2", iova_mode, socket_mem, socket_limit, "--proc-type=auto", "--no-telemetry",
+         "--file-prefix", name, "-a0000:00:00.0", bbdev_wdev, bbdev_vdev};
+ 
+     if (io_cfg == NULL)
+@@ -481,11 +481,13 @@ xran_ethdi_init_dpdk_io(char *name, const struct xran_io_cfg *io_cfg,
+                     ctx->tx_ring[i] = rte_ring_create(ring_name, NUM_MBUFS_RING_TRX,
+                     rte_lcore_to_socket_id(*lcore_id), RING_F_SC_DEQ);
+                     PANIC_ON(ctx->tx_ring[i] == NULL, "failed to allocate rx ring");
++                    printf("Created ring %s on core %d\n",ring_name,*lcore_id);
+                     for(qi = 0; qi < io_cfg->num_rxq; qi++) {
+                         snprintf(ring_name, RTE_DIM(ring_name), "%s_%d_%d", "rx_ring_cp", i, qi);
+                         ctx->rx_ring[i][qi] = rte_ring_create(ring_name, NUM_MBUFS_RING_TRX,
+                             rte_lcore_to_socket_id(*lcore_id), RING_F_SP_ENQ);
+                         PANIC_ON(ctx->rx_ring[i][qi] == NULL, "failed to allocate rx ring");
++                        printf("Created ring %s on core %d\n",ring_name,*lcore_id);
+                     }
+                 }
+             } else {
+@@ -555,7 +557,7 @@ xran_ethdi_init_dpdk_io(char *name, const struct xran_io_cfg *io_cfg,
+         ctx->up_dl_pkt_gen_ring[i] = rte_ring_create(ring_name, NUM_MBUFS_RING,
+         rte_lcore_to_socket_id(*lcore_id), /*RING_F_SC_DEQ*/0);
+         PANIC_ON(ctx->up_dl_pkt_gen_ring[i] == NULL, "failed to allocate dl gen ring");
+-        printf("created %s\n", ring_name);
++        printf("created %s on core %d\n", ring_name, *lcore_id);
+     }
+ 
+     return 1;
+diff --git a/fhi_lib/lib/src/xran_bfp_ref.cpp b/fhi_lib/lib/src/xran_bfp_ref.cpp
+index e6d3067..8e0abee 100644
+--- a/fhi_lib/lib/src/xran_bfp_ref.cpp
++++ b/fhi_lib/lib/src/xran_bfp_ref.cpp
+@@ -29,6 +29,7 @@
+ #include <complex>
+ #include <algorithm>
+ #include <limits.h>
++#include <limits>
+ 
+ static int16_t saturateAbs(int16_t inVal)
+ {
+diff --git a/fhi_lib/lib/src/xran_bfp_uplane.cpp b/fhi_lib/lib/src/xran_bfp_uplane.cpp
+index 59b6850..322d238 100644
+--- a/fhi_lib/lib/src/xran_bfp_uplane.cpp
++++ b/fhi_lib/lib/src/xran_bfp_uplane.cpp
+@@ -90,7 +90,7 @@ namespace BFP_UPlane
+   {
+     const __m512i* rawData = reinterpret_cast<const __m512i*>(dataIn.dataExpanded);
+     /// Abs
+-    const auto rawDataAbs = _mm512_abs_epi16(rawData[0]);
++    const auto rawDataAbs = _mm512_abs_epi16(_mm512_loadu_epi16(rawData));
+     /// No need to do a full horizontal max operation here, just do a max IQ step,
+     /// compute the exponents and then use a reduce max over all exponent values. This
+     /// is the fastest way to handle a single RB.
+@@ -116,7 +116,7 @@ namespace BFP_UPlane
+     /// Get AVX512 pointer aligned to desired RB
+     const __m512i* rawDataIn = reinterpret_cast<const __m512i*>(dataIn.dataExpanded + numREOffset);
+     /// Apply the exponent shift
+-    const auto compData = _mm512_srai_epi16(*rawDataIn, thisExp);
++    const auto compData = _mm512_srai_epi16(_mm512_loadu_epi16(rawDataIn), thisExp);
+     /// Pack compressed data network byte order
+     const auto compDataBytePacked = networkBytePack(compData);
+     /// Store exponent first
+@@ -201,7 +201,7 @@ namespace BFP_UPlane
+     /// Get AVX512 pointer aligned to desired RB
+     const __m512i* rawDataIn = reinterpret_cast<const __m512i*>(dataIn.dataExpanded + numREOffset);
+     /// Apply the exponent shift
+-    const auto compData = _mm512_srai_epi16(*rawDataIn, thisExp);
++    const auto compData = _mm512_srai_epi16(_mm512_loadu_epi16(rawDataIn), thisExp);
+     /// Store exponent first
+     dataOut->dataCompressed[thisRBExpAddr] = thisExp;
+     /// Now have 1 RB worth of bytes separated into 3 chunks (1 per lane)
+@@ -432,4 +432,4 @@ BlockFloatCompander::BFPExpandUserPlaneAvx512(const CompressedData& dataIn, Expa
+     BFP_UPlane::expandByAllocN<BlockFloatCompander::networkByteUnpack12b>(dataIn, dataOut, k_totNumBytesPerRB12, k_maxExpShift12);
+     break;
+   }
+-}
+\ No newline at end of file
++}
+diff --git a/fhi_lib/lib/src/xran_common.c b/fhi_lib/lib/src/xran_common.c
+index dc40ad9..4ac1fbf 100644
+--- a/fhi_lib/lib/src/xran_common.c
++++ b/fhi_lib/lib/src/xran_common.c
+@@ -714,11 +714,14 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid)
+     uint8_t compMeth = 0;
+     uint8_t iqWidth = 0;
+ 
++    uint8_t is_prach = 0;
++
+     int ret = MBUF_FREE;
+     uint32_t mb_free = 0;
+     int32_t valid_res = 0;
+     int expect_comp  = (p_dev_ctx->fh_cfg.ru_conf.compMeth != XRAN_COMPMETHOD_NONE);
+     enum xran_comp_hdr_type staticComp = p_dev_ctx->fh_cfg.ru_conf.xranCompHdrType;
++    uint8_t filter_id;
+ 
+     if(first_call == 0)
+         return ret;
+@@ -733,9 +736,9 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid)
+         return MBUF_FREE;
+ 
+     num_bytes = xran_extract_iq_samples(pkt, &iq_samp_buf,
+-                                &CC_ID, &Ant_ID, &frame_id, &subframe_id, &slot_id, &symb_id, &seq,
++                                &CC_ID, &Ant_ID, &frame_id, &subframe_id, &slot_id, &symb_id, &filter_id, &seq,
+                                 &num_prbu, &start_prbu, &sym_inc, &rb, &sect_id,
+-                                expect_comp, staticComp, &compMeth, &iqWidth);
++                                expect_comp, staticComp, &compMeth, &iqWidth, &is_prach);
+     if (num_bytes <= 0)
+     {
+         print_err("num_bytes is wrong [%d]\n", num_bytes);
+@@ -781,10 +784,9 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid)
+ 
+     else
+     {
+-        valid_res = xran_pkt_validate(p_dev_ctx,
+-                                pkt, iq_samp_buf, num_bytes,
+-                                CC_ID, Ant_ID, frame_id, subframe_id, slot_id, symb_id,
+-                                &seq, num_prbu, start_prbu, sym_inc, rb, sect_id);
++        pCnt->rx_counter++;
++        pCnt->Rx_on_time++;
++        pCnt->Total_msgs_rcvd++;
+ #ifndef FCN_ADAPT
+         if(valid_res != 0)
+         {
+@@ -807,8 +809,7 @@ process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid)
+             PrachCfg = &(p_dev_ctx->PrachCPConfig);
+         }
+ 
+-        if (Ant_ID >= PrachCfg->eAxC_offset && p_dev_ctx->fh_cfg.prachEnable)
+-        {
++        if (/*Ant_ID >= PrachCfg->eAxC_offset &&*/p_dev_ctx->fh_cfg.prachEnable && is_prach) {
+         /* PRACH packet has ruportid = num_eAxc + ant_id */
+             Ant_ID -= PrachCfg->eAxC_offset;
+         symbol_total_bytes[p_dev_ctx->xran_port_id][CC_ID][Ant_ID] += num_bytes;
+@@ -1412,7 +1413,7 @@ int generate_cpmsg_prach(void *pHandle, struct xran_cp_gen_params *params, struc
+     if(XRAN_FILTERINDEX_PRACH_ABC == pPrachCPConfig->filterIdx)
+     {
+     timeOffset = timeOffset >> nNumerology; //original number is Tc, convert to Ts based on mu
+-    if ((slot_id == 0) || (slot_id == (SLOTNUM_PER_SUBFRAME(pxran_lib_ctx->interval_us_local) >> 1)))
++    if (startSymId > 0 && ((slot_id == 0) || (slot_id == (SLOTNUM_PER_SUBFRAME(pxran_lib_ctx->interval_us_local) >> 1))))
+         timeOffset += 16;
+     }
+     else
+@@ -1547,8 +1548,7 @@ int32_t ring_processing_func(void* args)
+ 
+     for (i = 0; i < ctx->io_cfg.num_vfs && i < XRAN_VF_MAX; i++){
+         for(qi = 0; qi < ctx->rxq_per_port[i]; qi++) {
+-            if (process_ring(ctx->rx_ring[i][qi], i, qi))
+-            return 0;
++            process_ring(ctx->rx_ring[i][qi],i,qi);
+         }
+     }
+ 
+diff --git a/fhi_lib/lib/src/xran_compression.cpp b/fhi_lib/lib/src/xran_compression.cpp
+index 112caae..7c74342 100644
+--- a/fhi_lib/lib/src/xran_compression.cpp
++++ b/fhi_lib/lib/src/xran_compression.cpp
+@@ -62,7 +62,7 @@ xranlib_compress(const struct xranlib_compress_request *request,
+         return xranlib_5gnr_mod_compression(&mod_request, &mod_response);
+   }
+     else{
+-        if(_may_i_use_cpu_feature(_FEATURE_AVX512IFMA52)) {
++        if(false) {
+             return xranlib_compress_avxsnc(request,response);
+         } else {
+             return xranlib_compress_avx512(request,response);
+@@ -89,7 +89,7 @@ xranlib_decompress(const struct xranlib_decompress_request *request,
+         return xranlib_5gnr_mod_decompression(&mod_request, &mod_response);
+       }
+     else{
+-        if(_may_i_use_cpu_feature(_FEATURE_AVX512IFMA52)) {
++        if(false) {
+             return xranlib_decompress_avxsnc(request,response);
+         } else {
+             return xranlib_decompress_avx512(request,response);
+@@ -101,7 +101,7 @@ int32_t
+ xranlib_compress_bfw(const struct xranlib_compress_request *request,
+                         struct xranlib_compress_response *response)
+     {
+-    if(_may_i_use_cpu_feature(_FEATURE_AVX512IFMA52)) {
++    if(false) {
+         return xranlib_compress_avxsnc_bfw(request,response);
+     } else {
+         return xranlib_compress_avx512_bfw(request,response);
+@@ -112,7 +112,7 @@ int32_t
+ xranlib_decompress_bfw(const struct xranlib_decompress_request *request,
+     struct xranlib_decompress_response *response)
+   {
+-    if(_may_i_use_cpu_feature(_FEATURE_AVX512IFMA52)) {
++    if(false) {
+         return xranlib_decompress_avxsnc_bfw(request,response);
+     } else {
+         return xranlib_decompress_avx512_bfw(request,response);
+diff --git a/fhi_lib/lib/src/xran_main.c b/fhi_lib/lib/src/xran_main.c
+index 7c472d7..7bab6a8 100644
+--- a/fhi_lib/lib/src/xran_main.c
++++ b/fhi_lib/lib/src/xran_main.c
+@@ -306,7 +306,7 @@ xran_init_prach(struct xran_fh_config* pConf, struct xran_device_ctx * p_xran_de
+         printf("PRACH start symbol %u lastsymbol %u\n", p_xran_dev_ctx->prach_start_symbol[0], p_xran_dev_ctx->prach_last_symbol[0]);
+     }
+ 
+-    pPrachCPConfig->eAxC_offset = xran_get_num_eAxc(p_xran_dev_ctx);
++    pPrachCPConfig->eAxC_offset = pPRACHConfig->eAxC_offset;
+     print_dbg("PRACH eAxC_offset %d\n",  pPrachCPConfig->eAxC_offset);
+ 
+     /* Save some configs for app */
+@@ -1570,6 +1570,7 @@ int32_t handle_ecpri_ethertype(struct rte_mbuf* pkt_q[], uint16_t xport_id, stru
+         {
+         case ECPRI_IQ_DATA:
+                 pkt_data[num_data++] = pkt;
++            uint8_t *pkt_bytes=rte_pktmbuf_mtod(pkt,uint8_t*);
+             break;
+         // For RU emulation
+         case ECPRI_RT_CONTROL_DATA:
+@@ -1587,7 +1588,7 @@ int32_t handle_ecpri_ethertype(struct rte_mbuf* pkt_q[], uint16_t xport_id, stru
+                 break;
+             default:
+                 if (p_dev_ctx->fh_init.io_cfg.id == O_DU) {
+-                    print_err("Invalid eCPRI message type - %d", ecpri_hdr->cmnhdr.bits.ecpri_mesg_type);
++                    rte_pktmbuf_free(pkt);
+         }
+                 break;
+     }
+@@ -2347,8 +2348,7 @@ ring_processing_func_per_port(void* args)
+     for (i = 0; i < ctx->io_cfg.num_vfs && i < XRAN_VF_MAX; i = i+1) {
+         if (ctx->vf2xran_port[i] == port_id) {
+             for(qi = 0; qi < ctx->rxq_per_port[port_id]; qi++){
+-                if (process_ring(ctx->rx_ring[i][qi], i, qi))
+-                    return 0;
++                process_ring(ctx->rx_ring[i][qi],i,qi);
+             }
+         }
+     }
+@@ -2414,9 +2414,6 @@ xran_spawn_workers(void)
+         nWorkerCore = nWorkerCore << 1;
+     }
+ 
+-    extern int _may_i_use_cpu_feature(unsigned __int64);
+-    icx_cpu = _may_i_use_cpu_feature(_FEATURE_AVX512IFMA52);
+-
+     printf("O-XU      %d\n", eth_ctx->io_cfg.id);
+     printf("HW        %d\n", icx_cpu);
+     printf("Num cores %d\n", total_num_cores);
+@@ -4034,6 +4031,24 @@ xran_get_slot_idx (uint32_t PortId, uint32_t *nFrameIdx, uint32_t *nSubframeIdx,
+     return tti;
+ }
+ 
++int32_t
++xran_get_slot_idx_from_tti(uint32_t tti, uint32_t *nFrameIdx, uint32_t *nSubframeIdx, uint32_t *nSlotIdx, uint64_t *nSecond)
++{
++    struct xran_device_ctx * p_xran_dev_ctx = xran_dev_get_ctx_by_id(0);
++    if (!p_xran_dev_ctx)
++    {
++      print_err("Null xRAN context on port id %u!!\n", 0);
++      return 0;
++    }
++
++    *nSlotIdx     = (uint32_t)XranGetSlotNum(tti, SLOTNUM_PER_SUBFRAME(p_xran_dev_ctx->interval_us_local));
++    *nSubframeIdx = (uint32_t)XranGetSubFrameNum(tti,SLOTNUM_PER_SUBFRAME(p_xran_dev_ctx->interval_us_local),  SUBFRAMES_PER_SYSTEMFRAME);
++    *nFrameIdx    = (uint32_t)XranGetFrameNum(tti,0/*xran_getSfnSecStart()*/,SUBFRAMES_PER_SYSTEMFRAME, SLOTNUM_PER_SUBFRAME(p_xran_dev_ctx->interval_us_local));
++    *nSecond      = timing_get_current_second();
++
++    return tti;
++}
++
+ int32_t
+ xran_set_debug_stop(int32_t value, int32_t count)
+ {
+diff --git a/fhi_lib/lib/src/xran_mod_compression.cpp b/fhi_lib/lib/src/xran_mod_compression.cpp
+index 7d4a5d0..b9b44ac 100644
+--- a/fhi_lib/lib/src/xran_mod_compression.cpp
++++ b/fhi_lib/lib/src/xran_mod_compression.cpp
+@@ -747,9 +747,9 @@ int xranlib_5gnr_mod_compression(const struct xranlib_5gnr_mod_compression_reque
+ #ifdef C_Module_Used
+     return (xranlib_5gnr_mod_compression_c(request, response));
+ #else
+-    if(_may_i_use_cpu_feature(_FEATURE_AVX512IFMA52))
++    if (false) {
+         return (xranlib_5gnr_mod_compression_snc(request, response));
+-    else
++    } else {
+         return (xranlib_5gnr_mod_compression_avx512(request, response));
+ #endif
+ }
+diff --git a/fhi_lib/lib/src/xran_up_api.c b/fhi_lib/lib/src/xran_up_api.c
+index fe22a1f..f6c4830 100644
+--- a/fhi_lib/lib/src/xran_up_api.c
++++ b/fhi_lib/lib/src/xran_up_api.c
+@@ -336,6 +336,7 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf,
+     uint8_t *subframe_id,
+     uint8_t *slot_id,
+     uint8_t *symb_id,
++    uint8_t *filter_id,
+     union ecpri_seq_id *seq_id,
+     uint16_t *num_prbu,
+     uint16_t *start_prbu,
+@@ -345,7 +346,8 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf,
+     int8_t   expect_comp,
+     enum xran_comp_hdr_type staticComp,
+     uint8_t *compMeth,
+-    uint8_t *iqWidth)
++    uint8_t *iqWidth,
++    uint8_t *is_prach)
+ {
+ #if XRAN_MLOG_VAR
+     uint32_t mlogVar[10];
+@@ -381,6 +383,7 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf,
+         return 0;       /* packet too short */
+ 
+     radio_hdr->sf_slot_sym.value = rte_be_to_cpu_16(radio_hdr->sf_slot_sym.value);
++    *is_prach = (radio_hdr->data_feature.filter_id > 0);
+ 
+     if (frame_id)
+         *frame_id    = radio_hdr->frame_id;
+@@ -394,6 +397,9 @@ int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf,
+     if (symb_id)
+         *symb_id = radio_hdr->sf_slot_sym.symb_id;
+ 
++    if (filter_id)
++	    *filter_id = radio_hdr->data_feature.filter_id;
++
+     /* Process data section hdr */
+     struct data_section_hdr *data_hdr =
+         (void *)rte_pktmbuf_adj(mbuf, sizeof(*radio_hdr));
diff --git a/doc/ORAN_FHI7.2_Tutorial.md b/doc/ORAN_FHI7.2_Tutorial.md
index d0e66fe68c06c03ff05b5be64b18043955ac935c..199f910b1ce1c6b193f1697b65d63a50630711cf 100644
--- a/doc/ORAN_FHI7.2_Tutorial.md
+++ b/doc/ORAN_FHI7.2_Tutorial.md
@@ -78,8 +78,10 @@ Tested libxran releases:
 | Vendor                                  |
 |-----------------------------------------|
 | `oran_e_maintenance_release_v1.0`       |
+| `oran_f_release_v1.0`                   |
 
-**Note**: The libxran driver of OAI identifies the above version as "5.1.0" (E is fifth letter, then 1.0).
+
+**Note**: The libxran driver of OAI identifies the above E release version as "5.1.0" (E is fifth letter, then 1.0), and the above F release as "6.1.0".
 
 ## Configure your server
 
@@ -379,19 +381,22 @@ cd ~/openairinterface5g/
 
 ## Build ORAN Fronthaul Interface Library
 
-Download ORAN FHI DU library and checkout the correct version.
+Download ORAN FHI DU library, checkout the correct version, and apply the correct patch (available in `oai_folder/cmake_targets/tools/oran_fhi_integration_patches`).
 
+### E release
 ```bash
 git clone https://gerrit.o-ran-sc.org/r/o-du/phy.git ~/phy
 cd ~/phy
 git checkout oran_e_maintenance_release_v1.0
+git apply ~/openairinterface5g/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch
 ```
 
-Apply the patch (available in `oai_folder/cmake_targets/tools/oran_fhi_integration_patches/E`):
-
+### F release
 ```bash
+git clone https://gerrit.o-ran-sc.org/r/o-du/phy.git ~/phy
 cd ~/phy
-git apply ~/openairinterface5g/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch
+git checkout oran_f_release_v1.0
+git apply ~/openairinterface5g/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch
 ```
 
 Compile the fronthaul interface library by calling `make` and the option
@@ -404,7 +409,8 @@ environment variables `RTE_SDK` for the path to the source tree of DPDK, and
 ```bash
 cd ~/phy/fhi_lib/lib
 make clean
-RTE_SDK=~/dpdk-stable-20.11.9/ XRAN_DIR=~/phy/fhi_lib make XRAN_LIB_SO=1
+RTE_SDK=~/dpdk-stable-20.11.9/ XRAN_DIR=~/phy/fhi_lib make XRAN_LIB_SO=1 # E release
+WIRELESS_SDK_TOOLCHAIN=gcc RTE_SDK=~/dpdk-stable-20.11.9/ XRAN_DIR=~/phy/fhi_lib make XRAN_LIB_SO=1 # F release
 ...
 [AR] build/libxran.so
 ./build/libxran.so
@@ -911,6 +917,7 @@ Edit the sample OAI gNB configuration file and check following parameters:
     cannot preallocate memory on NUMA nodes other than 0; in this case, set
     this to 0 (no pre-allocation) and so that DPDK will allocate it on-demand
     on the right NUMA node.
+  * `owdm_enable`: used for eCPRI One-Way Delay Measurements; it depends if the RU supports it; if not set to 1 (enabled), default value is 0 (disabled)
   * `fh_config`: parameters that need to match RU parameters
     * timing parameters (starting with `T`) depend on the RU: `Tadv_cp_dl` is a
       single number, the rest pairs of numbers `(x, y)` specifying minimum and
@@ -928,7 +935,9 @@ Layer mapping (eAxC offsets) happens as follows:
 - For PUSCH/PDSCH, the layers are mapped to `[0,1,...,Nrx-1]/[0,1,...,Ntx-1]` where `Nrx/Ntx` is the
   respective RX/TX number of antennas.
 - For PRACH, the layers are mapped to `[No,No+1,...No+Nrx-1]` where `No` is the
-  `fhi_72.fh_config.[0].prach_config.eAxC_offset`. Please be aware that the following equation must be fullfilled: `No >= max(Nrx,Ntx)`.
+  `fhi_72.fh_config.[0].prach_config.eAxC_offset`. xran assumes PRACH offset `No >= max(Nrx,Ntx)`.
+  However, we made a workaround that xran supports PRACH eAxC IDs same as PUSCH eAxC IDs. This is achieved with `is_prach` and `filter_id` parameters in the patch.
+  Please note that this approach only applies to the RUs that support this functionality, e.g. LITEON RU.
 
 **Note**
 
diff --git a/docker/Dockerfile.build.fhi72.rhel9 b/docker/Dockerfile.build.fhi72.rhel9
index e8a1f2d76b4710ccc9c8faad2c725766f23c55e2..942896c4f8562dc9054de7d68ba79be1db12e61e 100644
--- a/docker/Dockerfile.build.fhi72.rhel9
+++ b/docker/Dockerfile.build.fhi72.rhel9
@@ -43,10 +43,10 @@ RUN wget http://fast.dpdk.org/rel/dpdk-20.11.9.tar.xz && \
 ## Build Fronthaul library
 RUN git clone https://gerrit.o-ran-sc.org/r/o-du/phy.git /opt/phy && \
     cd /opt/phy && \
-    git checkout oran_e_maintenance_release_v1.0 &&\
-    git apply /oai-ran/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch && \
+    git checkout oran_f_release_v1.0 &&\
+    git apply /oai-ran/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch && \
     cd /opt/phy/fhi_lib/lib && \
-    RTE_SDK=/oai-ran/dpdk-stable-20.11.9/ XRAN_DIR=/opt/phy/fhi_lib make XRAN_LIB_SO=1 
+    WIRELESS_SDK_TOOLCHAIN=gcc RTE_SDK=/oai-ran/dpdk-stable-20.11.9/ XRAN_DIR=/opt/phy/fhi_lib make XRAN_LIB_SO=1 
 
 FROM ran-base AS ran-build-fhi72
 ARG E2AP_VERSION=E2AP_V3
diff --git a/docker/Dockerfile.build.fhi72.ubuntu22 b/docker/Dockerfile.build.fhi72.ubuntu22
index 16ce820832ab7e7d8e40cbe132a7ca24d5dfe3e2..e40bff5c48aeeb565887df5f511ba490645c0f15 100644
--- a/docker/Dockerfile.build.fhi72.ubuntu22
+++ b/docker/Dockerfile.build.fhi72.ubuntu22
@@ -56,10 +56,10 @@ RUN wget http://fast.dpdk.org/rel/dpdk-20.11.9.tar.xz && \
 ## Build Fronthaul library
 RUN git clone https://gerrit.o-ran-sc.org/r/o-du/phy.git /opt/phy && \
     cd /opt/phy && \
-    git checkout oran_e_maintenance_release_v1.0 &&\
-    git apply /oai-ran/cmake_targets/tools/oran_fhi_integration_patches/E/oaioran_E.patch && \
+    git checkout oran_f_release_v1.0 &&\
+    git apply /oai-ran/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch && \
     cd /opt/phy/fhi_lib/lib && \
-    RTE_SDK=/oai-ran/dpdk-stable-20.11.9/ XRAN_DIR=/opt/phy/fhi_lib make XRAN_LIB_SO=1 
+    WIRELESS_SDK_TOOLCHAIN=gcc RTE_SDK=/oai-ran/dpdk-stable-20.11.9/ XRAN_DIR=/opt/phy/fhi_lib make XRAN_LIB_SO=1 
 
 FROM ran-base AS ran-build-fhi72
 ## Build and install OAI
diff --git a/radio/fhi_72/CMakeLists.txt b/radio/fhi_72/CMakeLists.txt
index 2f1b0a356ef9c3215324adba6418cf164818eb65..00f7ef97e0ea798550d58da89c7a79c6079ffb01 100644
--- a/radio/fhi_72/CMakeLists.txt
+++ b/radio/fhi_72/CMakeLists.txt
@@ -9,12 +9,6 @@ endif()
 pkg_check_modules(dpdk REQUIRED libdpdk)
 pkg_check_modules(numa REQUIRED numa)
 
-find_package(xran 5.1.4 EXACT REQUIRED) # E release -> 5
-
-# Ignore xran-specific warning: we don't care/can't change the following warning, so suppress
-# alignment 1 of 'struct XYZ' is less than 2
-add_compile_options(-Wno-packed-not-aligned)
-
 add_library(oran_fhlib_5g MODULE
             oran_isolate.c
             oaioran.c
@@ -22,6 +16,19 @@ add_library(oran_fhlib_5g MODULE
             oran-init.c
 )
 
+find_package(xran REQUIRED)
+if(xran_VERSION VERSION_EQUAL 5.1.4)
+  target_compile_definitions(oran_fhlib_5g PRIVATE E_RELEASE)
+elseif(xran_VERSION VERSION_EQUAL 6.1.1)
+  target_compile_definitions(oran_fhlib_5g PRIVATE F_RELEASE)
+else()
+  message(FATAL_ERROR "Found xran version ${xran_VERSION} but needed 5.1.4 (E release) or 6.1.1 (F release)")
+endif()
+
+# Ignore xran-specific warning: we don't care/can't change the following warning, so suppress
+# alignment 1 of 'struct XYZ' is less than 2
+add_compile_options(-Wno-packed-not-aligned)
+
 set_target_properties(oran_fhlib_5g PROPERTIES COMPILE_FLAGS "-fvisibility=hidden -march=native")
 target_link_libraries(oran_fhlib_5g PRIVATE xran::xran)
 target_link_libraries(oran_fhlib_5g PRIVATE ${dpdk_LINK_LIBRARIES})
diff --git a/radio/fhi_72/oaioran.c b/radio/fhi_72/oaioran.c
index 300a6869cfc3dd5fb1ad88b44951cf188a87a3a0..02487e93005617cc9456e3e18fc3491864882d27 100644
--- a/radio/fhi_72/oaioran.c
+++ b/radio/fhi_72/oaioran.c
@@ -90,7 +90,7 @@ void oai_xran_fh_rx_callback(void *pCallbackTag, xran_status_t status)
 
   tti = xran_get_slot_idx_from_tti(rx_tti, &frame, &subframe, &slot, &second);
 
-  rx_sym = callback_tag->symbol;
+  rx_sym = callback_tag->symbol & 0xFF;
   uint32_t ru_id = callback_tag->oXuId;
 
   LOG_D(NR_PHY,
@@ -101,7 +101,23 @@ void oai_xran_fh_rx_callback(void *pCallbackTag, xran_status_t status)
         (unsigned long long)second,
         rx_sym,
         ru_id);
-  if (rx_sym == 7) {
+  if (rx_sym == 7) { // in F release this value is defined as XRAN_FULL_CB_SYM (full slot (offset + 7))
+#ifdef F_RELEASE
+    int32_t nCellIdx = callback_tag->cellId;
+    int32_t ntti = (rx_tti + XRAN_N_FE_BUF_LEN - 1) % XRAN_N_FE_BUF_LEN;
+
+    for(uint32_t ant_id = 0; ant_id < fh_config->neAxc; ant_id++) {
+      struct xran_prb_map *pRbMap = (struct xran_prb_map *)xran_ctx->sFrontHaulRxPrbMapBbuIoBufCtrl[ntti][nCellIdx][ant_id].sBufferList.pBuffers->pData;
+      AssertFatal(pRbMap != NULL, "(%d:%d:%d)pRbMap == NULL. Aborting.\n", nCellIdx, ntti, ant_id);
+
+      for (uint32_t sym_id = 0; sym_id < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_id++) {
+        for (uint32_t idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++ ) {
+          struct xran_prb_elm *pRbElm = &pRbMap->prbMap[idxElm];
+          pRbElm->nSecDesc[sym_id] = 0; // number of section descriptors per symbol; M-plane info <supported-section-types>
+        }
+      }
+    }
+#endif
     if (first_call_set) {
       if (!first_rx_set) {
         LOG_I(NR_PHY, "first_rx is set (num_ports %d), first_read_set %d\n", num_ports, first_read_set);
@@ -332,7 +348,11 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot)
         struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
 
         struct xran_prb_elm *pRbElm = &pPrbMap->prbMap[0];
+#ifdef E_RELEASE
         struct xran_section_desc *p_sec_desc = pRbElm->p_sec_desc[sym_idx][0];
+#elif defined F_RELEASE
+        struct xran_section_desc *p_sec_desc = &pRbElm->sec_desc[sym_idx][0];
+#endif
         uint32_t one_rb_size =
             (((pRbElm->iqWidth == 0) || (pRbElm->iqWidth == 16)) ? (N_SC_PER_PRB * 2 * 2) : (3 * pRbElm->iqWidth + 1));
         if (fh_init->mtu < pRbElm->nRBSize * one_rb_size)
@@ -486,9 +506,12 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp)
           for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
             struct xran_section_desc *p_sec_desc = NULL;
             p_prbMapElm = &pRbMap->prbMap[idxElm];
-            p_sec_desc =
-                // assumes one fragment per symbol
-                p_prbMapElm->p_sec_desc[sym_id][0];
+            // assumes one fragment per symbol
+#ifdef E_RELEASE
+            p_sec_desc = p_prbMapElm->p_sec_desc[sym_id][0];
+#elif F_RELEASE
+            p_sec_desc = &p_prbMapElm->sec_desc[sym_id][0];
+#endif
 
             dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
 
diff --git a/radio/fhi_72/oran-config.c b/radio/fhi_72/oran-config.c
index 4f828b8a1af31458589d705e342f79f5d2b479e2..f165044429170709923c3bf089b9d34a74cfae47 100644
--- a/radio/fhi_72/oran-config.c
+++ b/radio/fhi_72/oran-config.c
@@ -59,55 +59,6 @@ static void print_fh_eowd_cmn(unsigned index, const struct xran_ecpri_del_meas_c
       eowd_cmn->owdm_PlLength);
 }
 
-static void print_fh_eowd_port(unsigned index, unsigned vf, const struct xran_ecpri_del_meas_port *eowd_port)
-{
-  printf("\
-    eowd_port[%u][%u]:\n\
-      t1 %ld\n\
-      t2 %ld\n\
-      tr %ld\n\
-      delta %ld\n\
-      portid %d\n\
-      runMeas %d\n\
-      currentMeasID %d\n\
-      msState %d\n\
-      numMeas %d\n\
-      txDone %d\n\
-      rspTimerIdx %ld\n\
-      delaySamples [%ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld]\n\
-      delayAvg %ld\n",
-      index,
-      vf,
-      eowd_port->t1,
-      eowd_port->t2,
-      eowd_port->tr,
-      eowd_port->delta,
-      eowd_port->portid,
-      eowd_port->runMeas,
-      eowd_port->currentMeasID,
-      eowd_port->msState,
-      eowd_port->numMeas,
-      eowd_port->txDone,
-      eowd_port->rspTimerIdx,
-      eowd_port->delaySamples[0],
-      eowd_port->delaySamples[1],
-      eowd_port->delaySamples[2],
-      eowd_port->delaySamples[3],
-      eowd_port->delaySamples[4],
-      eowd_port->delaySamples[5],
-      eowd_port->delaySamples[6],
-      eowd_port->delaySamples[7],
-      eowd_port->delaySamples[8],
-      eowd_port->delaySamples[9],
-      eowd_port->delaySamples[10],
-      eowd_port->delaySamples[11],
-      eowd_port->delaySamples[12],
-      eowd_port->delaySamples[13],
-      eowd_port->delaySamples[14],
-      eowd_port->delaySamples[15],
-      eowd_port->delayAvg);
-}
-
 static void print_fh_init_io_cfg(const struct xran_io_cfg *io_cfg)
 {
   printf("\
@@ -152,7 +103,7 @@ static void print_fh_init_io_cfg(const struct xran_io_cfg *io_cfg)
     pkt_proc_core_64_127 %016lx\n\
     pkt_aux_core %d\n\
     timing_core %d\n\
-    port [%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, ]\n\
+    port (filled within xran library)\n\
     io_sleep %d\n\
     nEthLinePerPort %d\n\
     nEthLineSpeed %d\n\
@@ -163,31 +114,17 @@ static void print_fh_init_io_cfg(const struct xran_io_cfg *io_cfg)
       io_cfg->pkt_proc_core_64_127,
       io_cfg->pkt_aux_core,
       io_cfg->timing_core,
-      io_cfg->port[XRAN_UP_VF],
-      io_cfg->port[XRAN_CP_VF],
-      io_cfg->port[XRAN_UP_VF1],
-      io_cfg->port[XRAN_CP_VF1],
-      io_cfg->port[XRAN_UP_VF2],
-      io_cfg->port[XRAN_CP_VF2],
-      io_cfg->port[XRAN_UP_VF3],
-      io_cfg->port[XRAN_CP_VF3],
-      io_cfg->port[XRAN_UP_VF4],
-      io_cfg->port[XRAN_CP_VF4],
-      io_cfg->port[XRAN_UP_VF5],
-      io_cfg->port[XRAN_CP_VF5],
-      io_cfg->port[XRAN_UP_VF6],
-      io_cfg->port[XRAN_CP_VF6],
-      io_cfg->port[XRAN_UP_VF7],
-      io_cfg->port[XRAN_CP_VF7],
       io_cfg->io_sleep,
       io_cfg->nEthLinePerPort,
       io_cfg->nEthLineSpeed,
       io_cfg->one_vf_cu_plane);
-  print_fh_eowd_cmn(0, &io_cfg->eowd_cmn[0]);
-  print_fh_eowd_cmn(1, &io_cfg->eowd_cmn[1]);
-  for (int i = 0; i < 2; ++i)
-    for (int v = 0; v < io_cfg->num_vfs; ++v)
-      print_fh_eowd_port(i, v, &io_cfg->eowd_port[i][v]);
+  print_fh_eowd_cmn(io_cfg->id, &io_cfg->eowd_cmn[io_cfg->id]);
+  printf("eowd_port (filled within xran library)\n");
+#ifdef F_RELEASE
+  printf("\
+    bbu_offload %d\n",
+      io_cfg->bbu_offload);
+#endif
 }
 
 static void print_fh_init_eaxcid_conf(const struct xran_eaxcid_config *eaxcid_conf)
@@ -247,6 +184,13 @@ void print_fh_init(const struct xran_fh_init *fh_init)
   printf("\
   totalBfWeights %d\n",
       fh_init->totalBfWeights);
+#ifdef F_RELEASE
+  printf("\
+  mlogxranenable %d\n\
+  dlCpProcBurst %d\n",
+      fh_init->mlogxranenable,
+      fh_init->dlCpProcBurst);
+#endif
 }
 
 static void print_prach_config(const struct xran_prach_config *prach_conf)
@@ -283,6 +227,11 @@ static void print_prach_config(const struct xran_prach_config *prach_conf)
       prach_conf->timeOffset,
       prach_conf->freqOffset,
       prach_conf->eAxC_offset);
+#ifdef F_RELEASE
+  printf("\
+    nPrachConfIdxLTE %d\n",
+      prach_conf->nPrachConfIdxLTE);
+#endif
 }
 
 static void print_srs_config(const struct xran_srs_config *srs_conf)
@@ -442,6 +391,14 @@ void print_fh_config(const struct xran_fh_config *fh_config)
       fh_config->GPS_Alpha,
       fh_config->GPS_Beta);
 
+#ifdef F_RELEASE
+  printf("\
+  srsEnableCp %d\n\
+  SrsDelaySym %d\n",
+      fh_config->srsEnableCp,
+      fh_config->SrsDelaySym);
+#endif
+
   print_prach_config(&fh_config->prach_conf);
   print_srs_config(&fh_config->srs_conf);
   print_frame_config(&fh_config->frame_conf);
@@ -466,6 +423,17 @@ void print_fh_config(const struct xran_fh_config *fh_config)
       fh_config->log_level,
       fh_config->max_sections_per_slot,
       fh_config->max_sections_per_symbol);
+
+#ifdef F_RELEASE
+  printf("\
+  RunSlotPrbMapBySymbolEnable %d\n\
+  dssEnable %d\n\
+  dssPeriod %d\n\
+  technology[XRAN_MAX_DSS_PERIODICITY] (not filled as DSS disabled)\n",
+      fh_config->RunSlotPrbMapBySymbolEnable,
+      fh_config->dssEnable,
+      fh_config->dssPeriod);
+#endif
 }
 
 static const paramdef_t *gpd(const paramdef_t *pd, int num, const char *name)
@@ -522,9 +490,32 @@ static bool set_fh_io_cfg(struct xran_io_cfg *io_cfg, const paramdef_t *fhip, in
   io_cfg->nEthLineSpeed = *gpd(fhip, nump, ORAN_CONFIG_NETHSPEED)->uptr; // 10G,25G,40G,100G speed of Physical connection on O-RU
   io_cfg->one_vf_cu_plane = (io_cfg->num_vfs == num_rus); // C-plane and U-plane use one VF
 
-  /* use owdm to calculate T12 and T34 -> CUS specification, section 2.3.3.3 */
-  // io_cfg->eowd_cmn[2] // ecpri one-way delay measurements common settings for O-DU and O-RU
-  // io_cfg->eowd_port[2][XRAN_VF_MAX] // ecpri owd measurements per port variables for O-DU and O-RU
+  /* eCPRI One-Way Delay Measurements common settings for O-DU and O-RU;
+    use owdm to calculate T12 and T34 -> CUS specification, section 2.3.3.3;
+    this is an optional feature that RU might or might not support;
+    to verify if RU supports, please check in the official RU documentation or
+    via M-plane the o-ran-ecpri-delay@<version>.yang capability;
+    this functionality is improved in F release */
+  /* if RU does support, io_cfg->eowd_cmn[0] should only be filled as id = O_DU; io_cfg->eowd_cmn[1] only used if id = O_RU */
+  const uint16_t owdm_enable = *gpd(fhip, nump, ORAN_CONFIG_ECPRI_OWDM)->uptr;
+  if (owdm_enable) {
+    io_cfg->eowd_cmn[0].initiator_en = 1; // 1 -> initiator (always O-DU), 0 -> recipient (always O-RU)
+    io_cfg->eowd_cmn[0].numberOfSamples = 8; // total number of samples to be collected and averaged per port
+    io_cfg->eowd_cmn[0].filterType = 0; // 0 -> simple average based on number of measurements; not used in xran in both E and F releases
+    io_cfg->eowd_cmn[0].responseTo = 10000000; // response timeout in [ns]
+    io_cfg->eowd_cmn[0].measVf = 0; // VF using the OWD transmitter; within xran, the measurements are calculated per each supported VF, but starts from measVf
+    io_cfg->eowd_cmn[0].measState = 0; // the state of the OWD transmitter; 0 -> OWDMTX_INIT (enum xran_owdm_tx_state)
+    io_cfg->eowd_cmn[0].measId = 0; // measurement ID to be used by the transmitter
+    io_cfg->eowd_cmn[0].measMethod = 0; // measurement method; 0 -> XRAN_REQUEST (enum xran_owd_meas_method)
+    io_cfg->eowd_cmn[0].owdm_enable = 1; // 1 -> enabled; 0 -> disabled
+    io_cfg->eowd_cmn[0].owdm_PlLength = 40; // payload in the measurement packet; 40 <= PlLength <= 1400
+  }
+  /* eCPRI OWDM per port variables for O-DU; this parameter is filled within xran library */
+  // eowd_port[0][XRAN_VF_MAX]
+
+#ifdef F_RELEASE
+  io_cfg->bbu_offload = 0; // enable packet handling on BBU cores
+#endif
 
   return true;
 }
@@ -620,7 +611,7 @@ static bool set_fh_init(struct xran_fh_init *fh_init, enum xran_category xran_ca
   fh_init->dpdkBasebandFecMode = 0; // DPDK Baseband FEC device mode (0-SW, 1-HW); not used in xran
   fh_init->dpdkBasebandDevice = NULL; // DPDK Baseband device address; not used in xran
   /* used to specify a unique prefix for shared memory, and files created by multiple DPDK processes;
-    is it necessary */
+    it is necessary */
   fh_init->filePrefix = strdup(*gpd(fhip, nump, ORAN_CONFIG_FILE_PREFIX)->strptr);
   /* maximum transmission unit (MTU) is the size of the largest protocol data unit (PDU) that can be
     communicated in a single xRAN network layer transaction. Supported 1500 bytes and 9600 bytes (Jumbo Frame);
@@ -643,6 +634,12 @@ static bool set_fh_init(struct xran_fh_init *fh_init, enum xran_category xran_ca
 
   fh_init->totalBfWeights = 0; // only used if id = O_RU (for emulation); C-plane extension types; section 5.4.6 of CUS spec
 
+#ifdef F_RELEASE
+  fh_init->mlogxranenable = 0; // enable mlog; 0 -> disabled
+  fh_init->dlCpProcBurst = 0; /* 1 -> DL CP processing will be done on single symbol,
+                                 0 -> DL CP processing will be spread across all allowed symbols and multiple cores to reduce burstiness */
+#endif
+
   return true;
 }
 
@@ -680,10 +677,15 @@ static bool set_fh_prach_config(const openair0_config_t *oai0,
   prach_config->numPrbc = 0;
   prach_config->timeOffset = 0;
   prach_config->freqOffset = 0;
+#ifdef F_RELEASE
+  prach_config->nPrachConfIdxLTE = 0; // used only if DSS enabled and technology is XRAN_RAN_LTE
+#endif
 
   /* xran defines PDSCH eAxC IDs as [0...Ntx-1];
      xran defines PUSCH eAxC IDs as [0...Nrx-1];
-     PRACH offset must be >= max(Ntx, Nrx) */
+     xran assumes PRACH offset >= max(Ntx, Nrx). However, we made a workaround that xran supports PRACH eAxC IDs same as PUSCH eAxC IDs.
+     This is achieved with is_prach and filter_id parameters in the patch.
+     Please note that this approach only applies to the RUs that support this functionality, e.g. LITEON RU. */
   uint8_t offset = *gpd(prachp, nprach, ORAN_PRACH_CONFIG_EAXC_OFFSET)->u8ptr;
   prach_config->eAxC_offset = (offset != 0) ? offset : max_num_ant;
 
@@ -804,41 +806,39 @@ static bool set_fh_config(int ru_idx, int num_rus, enum xran_category xran_cat,
   fh_config->nAntElmTRx = 0; // number of antenna elements for TX and RX = SRS; used only if XRAN_CATEGORY_B
   fh_config->nDLFftSize = 0; // DL FFT size; not used in xran
   fh_config->nULFftSize = 0; // UL FFT size; not used in xran
-  fh_config->nDLRBs = oai0->num_rb_dl; // DL PRB
-  fh_config->nULRBs = oai0->num_rb_dl; // UL PRB; in xran not used as id = O_DU,  but used in oaioran.c/oran-init.c
+  fh_config->nDLRBs = oai0->num_rb_dl; // DL PRB; used in oaioran.c/oran-init.c; not used in xran, neither in E nor in F release
+  fh_config->nULRBs = oai0->num_rb_dl; // UL PRB; used in oaioran.c/oran-init.c; in xran E release not used so the patch fixes it, but in xran F release this value is properly used
   fh_config->nDLAbsFrePointA = 0; // Abs Freq Point A of the Carrier Center Frequency for in KHz Value; not used in xran
   fh_config->nULAbsFrePointA = 0; // Abs Freq Point A of the Carrier Center Frequency for in KHz Value; not used in xran
   fh_config->nDLCenterFreqARFCN = 0; // center frequency for DL in NR-ARFCN; not used in xran
   fh_config->nULCenterFreqARFCN = 0; // center frequency for UL in NR-ARFCN; not used in xran
   fh_config->ttiCb = NULL; // check tti_to_phy_cb(), tx_cp_dl_cb() and tx_cp_ul_cb => first_call
   fh_config->ttiCbParam = NULL; // check tti_to_phy_cb(), tx_cp_dl_cb() and tx_cp_ul_cb => first_call
-  fh_config->Tadv_cp_dl = *gpd(fhp, nfh, ORAN_FH_CONFIG_TADV_CP_DL)->uptr; // not used in xran
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_CP_DL, &fh_config->T2a_min_cp_dl, &fh_config->T2a_max_cp_dl)) // not used in xran
-    return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_CP_UL, &fh_config->T2a_min_cp_ul, &fh_config->T2a_max_cp_ul)) // not used in xran
-    return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_UP, &fh_config->T2a_min_up, &fh_config->T2a_max_up)) // not used in xran
-    return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_TA3, &fh_config->Ta3_min, &fh_config->Ta3_max)) // not used in xran
-    return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T1A_CP_DL, &fh_config->T1a_min_cp_dl, &fh_config->T1a_max_cp_dl))
+
+  /* DU delay profile */
+  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T1A_CP_DL, &fh_config->T1a_min_cp_dl, &fh_config->T1a_max_cp_dl)) // E - min not used in xran, max yes; F - both min and max are used in xran
     return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T1A_CP_UL, &fh_config->T1a_min_cp_ul, &fh_config->T1a_max_cp_ul))
+  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T1A_CP_UL, &fh_config->T1a_min_cp_ul, &fh_config->T1a_max_cp_ul)) // both E and F - min not used in xran, max yes
     return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T1A_UP, &fh_config->T1a_min_up, &fh_config->T1a_max_up))
+  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T1A_UP, &fh_config->T1a_min_up, &fh_config->T1a_max_up)) // both E and F - min not used in xran, max yes
     return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_TA4, &fh_config->Ta4_min, &fh_config->Ta4_max))
+  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_TA4, &fh_config->Ta4_min, &fh_config->Ta4_max)) // both E and F - min not used in xran, max yes
     return false;
+
   fh_config->enableCP = 1; // enable C-plane
   fh_config->prachEnable = 1; // enable PRACH
   fh_config->srsEnable = 0; // enable SRS; used only if XRAN_CATEGORY_B
+#ifdef F_RELEASE
+  fh_config->srsEnableCp = 0; // enable SRS CP; used only if XRAN_CATEGORY_B
+  fh_config->SrsDelaySym = 0; // number of SRS delay symbols; used only if XRAN_CATEGORY_B
+#endif
   fh_config->puschMaskEnable = 0; // enable PUSCH mask; only used if id = O_RU
   fh_config->puschMaskSlot = 0; // specific which slot PUSCH channel masked; only used if id = O_RU
   fh_config->cp_vlan_tag = *gpd(fhp, nfh, ORAN_FH_CONFIG_CP_VLAN_TAG)->uptr; // C-plane VLAN tag; not used in xran; needed for M-plane
   fh_config->up_vlan_tag = *gpd(fhp, nfh, ORAN_FH_CONFIG_UP_VLAN_TAG)->uptr; // U-plane VLAN tag; not used in xran; needed for M-plane
-  fh_config->debugStop = 0; // enable auto stop; not used in xran
+  fh_config->debugStop = 0; // enable auto stop; only used if id = O_RU
   fh_config->debugStopCount = 0; // enable auto stop after number of Tx packets; not used in xran
-  fh_config->DynamicSectionEna = 0; // enable dynamic C-Plane section allocation; not used in xran
+  fh_config->DynamicSectionEna = 0; // enable dynamic C-Plane section allocation
   fh_config->GPS_Alpha = 0; // refers to alpha as defined in section 9.7.2 of ORAN spec. this value should be alpha*(1/1.2288ns), range 0 - 1e7 (ns); offset_nsec = (pConf->GPS_Beta - offset_sec * 100) * 1e7 + pConf->GPS_Alpha
   fh_config->GPS_Beta = 0; // beta value as defined in section 9.7.2 of ORAN spec. range -32767 ~ +32767; offset_sec = pConf->GPS_Beta / 100
 
@@ -873,6 +873,14 @@ static bool set_fh_config(int ru_idx, int num_rus, enum xran_category xran_cat,
   fh_config->max_sections_per_slot = 0; // not used in xran
   fh_config->max_sections_per_symbol = 0; // not used in xran
 
+#ifdef F_RELEASE
+  fh_config->RunSlotPrbMapBySymbolEnable = 0; // enable PRB mapping by symbol with multisection
+
+  fh_config->dssEnable = 0; // enable DSS (extension-9)
+  fh_config->dssPeriod = 0; // DSS pattern period for LTE/NR
+  // fh_config->technology[XRAN_MAX_DSS_PERIODICITY] // technology array represents slot is LTE(0)/NR(1); used only if DSS enabled
+#endif
+
   return true;
 }
 
diff --git a/radio/fhi_72/oran-init.c b/radio/fhi_72/oran-init.c
index e290db561bf11a7a4b908c31f94d19f8b4fd7c4c..8072c5852ea870e67f71dc5d6a51a52f510ea600 100644
--- a/radio/fhi_72/oran-init.c
+++ b/radio/fhi_72/oran-init.c
@@ -29,6 +29,7 @@
 #include "oaioran.h"
 
 #include "common/utils/assertions.h"
+#include "common/utils/LOG/log.h"
 #include "common_lib.h"
 
 /* PRACH data samples are 32 bits wide (16bits for I/Q). Each packet contains
@@ -140,10 +141,10 @@ static uint32_t oran_allocate_uplane_buffers(
 {
   xran_status_t status;
   uint32_t pool;
-  // we need at least XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT
-  // buffers, but xran_bm_init() uses rte_pktmbuf_pool_create() which
-  // recommends to use a power of two for the buffers
-  uint32_t numBufs = next_power_2(XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT);
+  /* xran_bm_init() uses rte_pktmbuf_pool_create() which recommends to use a power of two for the buffers;
+    the E release sample app didn't take this into account, but we introduced it ourselves;
+    the F release sample app took this into account, so we can proudly say we assumed correctly */
+  uint32_t numBufs = next_power_2(XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT) - 1;
   status = xran_bm_init(instHandle, &pool, numBufs, bufSize);
   AssertFatal(XRAN_STATUS_SUCCESS == status, "Failed at xran_bm_init(), status %d\n", status);
   printf("xran_bm_init() hInstance %p poolIdx %u elements %u size %u\n", instHandle, pool, numBufs, bufSize);
@@ -217,26 +218,33 @@ static void oran_allocate_cplane_buffers(void *instHandle,
                                          struct xran_flat_buffer buf[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN],
                                          uint32_t ant,
                                          uint32_t sect,
+                                       #ifdef F_RELEASE
+                                         uint32_t mtu,
+                                         const struct xran_fh_config *fh_config,
+                                       #endif
                                          uint32_t size_of_prb_map,
-                                         const oran_cplane_prb_config *prb_conf)
+                                         oran_cplane_prb_config *prb_conf)
 {
   xran_status_t status;
+  uint32_t count1 = 0;
+
+#ifdef E_RELEASE
+  uint32_t count2 = 0;
   uint32_t poolSec;
   uint32_t numBufsSec = next_power_2(XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT * sect * XRAN_MAX_FRAGMENT);
   uint32_t bufSizeSec = sizeof(struct xran_section_desc);
   status = xran_bm_init(instHandle, &poolSec, numBufsSec, bufSizeSec);
   AssertFatal(XRAN_STATUS_SUCCESS == status, "Failed at xran_bm_init(), status %d\n", status);
   printf("xran_bm_init() hInstance %p poolIdx %u elements %u size %u\n", instHandle, poolSec, numBufsSec, bufSizeSec);
+#endif
 
   uint32_t poolPrb;
-  uint32_t numBufsPrb = next_power_2(XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT);
+  uint32_t numBufsPrb = next_power_2(XRAN_N_FE_BUF_LEN * ant * XRAN_NUM_OF_SYMBOL_PER_SLOT) - 1;
   uint32_t bufSizePrb = size_of_prb_map;
   status = xran_bm_init(instHandle, &poolPrb, numBufsPrb, bufSizePrb);
   AssertFatal(XRAN_STATUS_SUCCESS == status, "Failed at xran_bm_init(), status %d\n", status);
   printf("xran_bm_init() hInstance %p poolIdx %u elements %u size %u\n", instHandle, poolPrb, numBufsPrb, bufSizePrb);
 
-  uint32_t count1 = 0;
-  uint32_t count2 = 0;
   for (uint32_t a = 0; a < ant; a++) {
     for (uint32_t j = 0; j < XRAN_N_FE_BUF_LEN; ++j) {
       list[a][j].pBuffers = &buf[a][j];
@@ -254,13 +262,15 @@ static void oran_allocate_cplane_buffers(void *instHandle,
       fb->pData = ptr;
       fb->pCtrl = mb;
 
-      // the original sample app code copies up to size_of_prb_map, but I think
-      // this is wrong because the way it is computed leads to a number larger
-      // than sizeof(map)
-      struct xran_prb_map *p_rb_map = (struct xran_prb_map *)ptr;
-      const struct xran_prb_map *src = &prb_conf->slotMap;
+      struct xran_prb_map *src = &prb_conf->slotMap;
       if ((j % prb_conf->nTddPeriod) == prb_conf->mixed_slot_index)
         src = &prb_conf->mixedSlotMap;
+#ifdef E_RELEASE
+      /* as per E release sample app, the memory is copied up to size_of_prb_map
+        which translates to >= sizeof(struct xran_prb_map) + sizeof(struct xran_prb_elm)*5,
+        but we assume that RB allocation is done as 1 RE/UE so the total memory size is sizeof(struct xran_prb_map);
+        this is improved in F release */
+      struct xran_prb_map *p_rb_map = (struct xran_prb_map *)ptr;
       memcpy(p_rb_map, src, sizeof(*src));
 
       for (uint32_t elm_id = 0; elm_id < p_rb_map->nPrbElm; ++elm_id) {
@@ -282,10 +292,19 @@ static void oran_allocate_cplane_buffers(void *instHandle,
           }
         }
       }
+#elif defined F_RELEASE
+      if (fh_config->RunSlotPrbMapBySymbolEnable) {
+        xran_init_PrbMap_by_symbol_from_cfg(src, ptr, mtu, fh_config->nDLRBs);
+      } else {
+        xran_init_PrbMap_from_cfg(src, ptr, mtu);
+      }
+#endif
     }
   }
   printf("xran_bm_allocate_buffer() hInstance %p poolIdx %u count %u\n", instHandle, poolPrb, count1);
+#ifdef E_RELEASE
   printf("xran_bm_allocate_buffer() hInstance %p poolIdx %u count %u\n", instHandle, poolSec, count2);
+#endif
 }
 
 /* callback not actively used */
@@ -298,6 +317,9 @@ static void oran_allocate_buffers(void *handle,
                                   int xran_inst,
                                   int num_sectors,
                                   oran_port_instance_t *portInstances,
+                                #ifdef F_RELEASE
+                                  uint32_t mtu,
+                                #endif
                                   const struct xran_fh_config *fh_config)
 {
   AssertFatal(num_sectors == 1, "only support one sector at the moment\n");
@@ -305,7 +327,6 @@ static void oran_allocate_buffers(void *handle,
   AssertFatal(handle != NULL, "no handle provided\n");
   uint32_t xran_max_antenna_nr = RTE_MAX(fh_config->neAxc, fh_config->neAxcUl);
   uint32_t xran_max_sections_per_slot = RTE_MAX(fh_config->max_sections_per_slot, XRAN_MIN_SECTIONS_PER_SLOT);
-  uint32_t size_of_prb_map = sizeof(struct xran_prb_map) + sizeof(struct xran_prb_elm) * (xran_max_sections_per_slot - 1);
 
   pi->buf_list = _mm_malloc(sizeof(*pi->buf_list), 256);
   AssertFatal(pi->buf_list != NULL, "out of memory\n");
@@ -331,11 +352,23 @@ static void oran_allocate_buffers(void *handle,
       .slotMap = dlPm,
       .mixedSlotMap = dlPmMixed,
   };
+
+#ifdef E_RELEASE
+  uint32_t size_of_prb_map = sizeof(struct xran_prb_map) + sizeof(struct xran_prb_elm) * (xran_max_sections_per_slot - 1);
+#elif defined F_RELEASE
+  uint32_t numPrbElm = xran_get_num_prb_elm(&dlPmMixed, mtu);
+  uint32_t size_of_prb_map  = sizeof(struct xran_prb_map) + sizeof(struct xran_prb_elm) * (numPrbElm);
+#endif
+
   oran_allocate_cplane_buffers(pi->instanceHandle,
                                bl->srccp,
                                bl->bufs.tx_prbmap,
                                xran_max_antenna_nr,
                                xran_max_sections_per_slot,
+                             #ifdef F_RELEASE
+                               mtu,
+                               fh_config,
+                             #endif
                                size_of_prb_map,
                                &dlConf);
 
@@ -357,6 +390,10 @@ static void oran_allocate_buffers(void *handle,
                                bl->bufs.rx_prbmap,
                                xran_max_antenna_nr,
                                xran_max_sections_per_slot,
+                             #ifdef F_RELEASE
+                               mtu,
+                               fh_config,
+                             #endif
                                size_of_prb_map,
                                &ulConf);
 
@@ -422,7 +459,12 @@ int *oai_oran_initialize(struct xran_fh_init *xran_fh_init, struct xran_fh_confi
     struct xran_cb_tag tag = {.cellId = sector, .oXuId = o_xu_id};
     pi->prach_tag = tag;
     pi->pusch_tag = tag;
+#ifdef E_RELEASE
+    LOG_W(PHY, "Please be aware that E release support will be removed by the end of January 2025. Instead, F release will be mandatory.\n");
     oran_allocate_buffers(gxran_handle, o_xu_id, 1, pi, &xran_fh_config[o_xu_id]);
+#elif defined F_RELEASE
+    oran_allocate_buffers(gxran_handle, o_xu_id, 1, pi, xran_fh_init->mtu, &xran_fh_config[o_xu_id]);
+#endif
 
     if ((xret = xran_reg_physide_cb(gxran_handle, oai_physide_dl_tti_call_back, NULL, 10, XRAN_CB_TTI)) != XRAN_STATUS_SUCCESS) {
       printf("xran_reg_physide_cb failed %d\n", xret);
diff --git a/radio/fhi_72/oran-params.h b/radio/fhi_72/oran-params.h
index e9de03660cdf7aaccc1de824616b654c84fb9527..d7eaf47a3ba224127e2d56f8a074152bbbe401d3 100644
--- a/radio/fhi_72/oran-params.h
+++ b/radio/fhi_72/oran-params.h
@@ -37,6 +37,7 @@
 #define ORAN_CONFIG_NETHPERPORT "eth_lines"
 #define ORAN_CONFIG_NETHSPEED "eth_speed"
 #define ORAN_CONFIG_DPDK_MEM_SIZE "dpdk_mem_size"
+#define ORAN_CONFIG_ECPRI_OWDM "owdm_enable"
 
 // clang-format off
 // TODO: PCI addr check
@@ -52,16 +53,12 @@
   {ORAN_CONFIG_NETHPERPORT,     "number of links per port\n",               0,                   .uptr=NULL,       .defuintval=1,       TYPE_UINT,       0}, \
   {ORAN_CONFIG_NETHSPEED,       "ethernet speed link\n",                    0,                   .uptr=NULL,       .defuintval=10,      TYPE_UINT,       0}, \
   {ORAN_CONFIG_DPDK_MEM_SIZE,   "DPDK huge page pre-allocation in MiB\n",   0,                   .uptr=NULL,       .defuintval=8192,    TYPE_UINT,       0}, \
+  {ORAN_CONFIG_ECPRI_OWDM,      "eCPRI One-Way Delay Measurements\n",       PARAMFLAG_BOOL,      .uptr=NULL,       .defuintval=0,       TYPE_UINT,       0}, \
 }
 // clang-format on
 
 #define CONFIG_STRING_ORAN_FH "fh_config"
 
-#define ORAN_FH_CONFIG_TADV_CP_DL "Tadv_cp_dl"
-#define ORAN_FH_CONFIG_T2A_CP_DL "T2a_cp_dl"
-#define ORAN_FH_CONFIG_T2A_CP_UL "T2a_cp_ul"
-#define ORAN_FH_CONFIG_T2A_UP "T2a_up"
-#define ORAN_FH_CONFIG_TA3 "Ta3"
 #define ORAN_FH_CONFIG_T1A_CP_DL "T1a_cp_dl"
 #define ORAN_FH_CONFIG_T1A_CP_UL "T1a_cp_ul"
 #define ORAN_FH_CONFIG_T1A_UP "T1a_up"
@@ -73,11 +70,6 @@
 
 // clang-format off
 #define ORAN_FH_DESC { \
-  {ORAN_FH_CONFIG_TADV_CP_DL,   "Tadv parameter of RU\n",      PARAMFLAG_MANDATORY, .uptr=NULL, .defuintval=0,     TYPE_UINT,      0}, \
-  {ORAN_FH_CONFIG_T2A_CP_DL,    "T2a_cp_dl" ORAN_FH_HLP_CPLT,  PARAMFLAG_MANDATORY, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
-  {ORAN_FH_CONFIG_T2A_CP_UL,    "T2a_cp_ul" ORAN_FH_HLP_CPLT,  PARAMFLAG_MANDATORY, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
-  {ORAN_FH_CONFIG_T2A_UP,       "T2a_up" ORAN_FH_HLP_CPLT,     PARAMFLAG_MANDATORY, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
-  {ORAN_FH_CONFIG_TA3,          "Ta3" ORAN_FH_HLP_CPLT,        PARAMFLAG_MANDATORY, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
   {ORAN_FH_CONFIG_T1A_CP_DL,    "T1a_cp_dl" ORAN_FH_HLP_CPLT,  PARAMFLAG_MANDATORY, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
   {ORAN_FH_CONFIG_T1A_CP_UL,    "T1a_cp_ul" ORAN_FH_HLP_CPLT,  PARAMFLAG_MANDATORY, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
   {ORAN_FH_CONFIG_T1A_UP,       "T1a_up" ORAN_FH_HLP_CPLT,     PARAMFLAG_MANDATORY, .uptr=NULL, .defintarrayval=0, TYPE_UINTARRAY, 0}, \
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf
index 5072dc32bb0ecc8130e4524b92ec7bae708485f7..10decbaf1df607e5328e6879cdbfb16c0c949749 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf
@@ -253,11 +253,6 @@ fhi_72 = {
   ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46");
   mtu = 9600;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (259, 500);
-    T2a_cp_ul = (25, 500);
-    T2a_up = (134, 375);
-    Ta3 = (152, 160);
     T1a_cp_dl = (419, 470);
     T1a_cp_ul = (285, 336);
     T1a_up = (294, 345);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf
index fa54c074243ac0f7241166dc7ae2ee0e7458ade2..79c6e02f307cf7e172f46271c623cc1d2a695ea2 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf
@@ -255,11 +255,6 @@ fhi_72 = {
   fh_config = (
 # RAN650 #1
   {
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (259, 500);
-    T2a_cp_ul = (25, 500);
-    T2a_up = (134, 375);
-    Ta3 = (152, 160);
     T1a_cp_dl = (419, 470);
     T1a_cp_ul = (285, 336);
     T1a_up = (294, 345);
@@ -271,11 +266,6 @@ fhi_72 = {
   },
 # RAN650 #2
   {
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (259, 500);
-    T2a_cp_ul = (25, 500);
-    T2a_up = (134, 375);
-    Ta3 = (152, 160);
     T1a_cp_dl = (419, 470);
     T1a_cp_ul = (285, 336);
     T1a_up = (294, 345);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf
index 8f9d6460c78cb8e54864a83fabbdb4aa3a53d6b2..c92bf1d0ce8e345e54554c85685c9083d7ce3b21 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf
@@ -269,11 +269,6 @@ fhi_72 = {
   ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
   mtu = 9600;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429);
-    T2a_cp_ul = (285, 429);
-    T2a_up = (125, 428);
-    Ta3 = (130, 170);
     T1a_cp_dl = (285, 470);
     T1a_cp_ul = (285, 429);
     T1a_up = (125, 350);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf
index ab97c214e23ef3f5fa8f16597ef789e07f7cc82f..d4ce05b5d57fd0b48756a63279e4eb9800cbaae5 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf
@@ -266,11 +266,6 @@ fhi_72 = {
   ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
   mtu = 9600;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429);
-    T2a_cp_ul = (285, 429);
-    T2a_up = (125, 428);
-    Ta3 = (130, 170);
     T1a_cp_dl = (285, 470);
     T1a_cp_ul = (285, 429);
     T1a_up = (125, 350);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
index 2954e6e096516820a074e98bdfaf851ccccf9767..86079fd7c4704f9519cd54a38ce30408d4d278a8 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
@@ -268,11 +268,6 @@ fhi_72 = {
   ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
   mtu = 9600;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429);
-    T2a_cp_ul = (285, 429);
-    T2a_up = (125, 428);
-    Ta3 = (130, 170);
     T1a_cp_dl = (285, 470);
     T1a_cp_ul = (285, 429);
     T1a_up = (125, 350);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf
index 2c25a6334891d97541664a39575693ff29a8d006..a159cd5f9be8ef351dc4dcf014c8413b10b9a155 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf
@@ -268,11 +268,6 @@ fhi_72 = {
   ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
   mtu = 9600;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (259, 500);
-    T2a_cp_ul = (25, 500);
-    T2a_up = (134, 375);
-    Ta3 = (152, 160);
     T1a_cp_dl = (419, 470);
     T1a_cp_ul = (285, 336);
     T1a_up = (294, 345);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
index ba96da73ce5a506bbb36277728d449a65951741b..23da52e1f93edadf7cf978eb229fff11fa8f73db 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
@@ -270,11 +270,6 @@ fhi_72 = {
   ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
   mtu = 9600;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (259, 500);
-    T2a_cp_ul = (25, 500);
-    T2a_up = (134, 375);
-    Ta3 = (152, 160);
     T1a_cp_dl = (419, 470);
     T1a_cp_ul = (285, 336);
     T1a_up = (294, 345);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf
index f1698391a0e5409e2c3e289c8015621579203cc7..cd994b246a137a531ec0d63dd97754b18d8950df 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf
@@ -266,11 +266,6 @@ fhi_72 = {
   worker_cores = (2);
   ru_addr = ("e8:c7:4f:1e:c7:11", "e8:c7:4f:1e:c7:11");
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429);
-    T2a_cp_ul = (285, 429);
-    T2a_up = (125, 428);
-    Ta3 = (130, 170);
     T1a_cp_dl = (285, 429);
     T1a_cp_ul = (285, 429);
     T1a_up = (96, 196);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf
index cf3e429709b5d456eb7a394b4a497be129e2a5dd..00ca853c6dd9fb8baf909ebe945ac2893defbbb5 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf
@@ -252,11 +252,6 @@ fhi_72 = {
   ru_addr = ("00:e0:0c:00:ae:06", "00:e0:0c:00:ae:06");
   mtu = 9000;
   fh_config = ({
-    Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429);
-    T2a_cp_ul = (285, 429);
-    T2a_up = (125, 428);
-    Ta3 = (130, 170);
     T1a_cp_dl = (285, 470);
     T1a_cp_ul = (285, 429);
     T1a_up = (125, 350);