diff --git a/nfapi/nfapi_pnf.c b/nfapi/nfapi_pnf.c
index 7009833ecca5db031b7ed2f3afae3bb9f08d2804..ca554b74105f546b31de022da10b387f74ee0ce0 100644
--- a/nfapi/nfapi_pnf.c
+++ b/nfapi/nfapi_pnf.c
@@ -23,20 +23,12 @@ extern RAN_CONTEXT_t RC;
 #include <vendor_ext.h>
 #include "fapi_stub.h"
 
-#if 0
-#include "pool.h"
-
-#include <mutex>
-#include <list>
-#include <queue>
-#include <map>
-#include <vector>
-#include <algorithm>
-#include <stdlib.h>
-#endif
-
 #define NUM_P5_PHY 2
 
+extern void phy_init_RU(RU_t*);
+
+
+
 uint16_t phy_antenna_capability_values[] = { 1, 2, 4, 8, 16 };
 
 nfapi_pnf_param_response_t g_pnf_param_resp;
@@ -222,137 +214,6 @@ typedef struct
   nfapi_pnf_p7_config_t* p7_config;
 }pnf_phy_user_data_t;
 
-//DJP int read_pnf_xml(pnf_info& pnf, const char* xml_file)
-int read_pnf_xml(pnf_info* pnf, const char* xml_file)
-{
-#if 0
-  try
-  {
-    std::ifstream input(xml_file);
-
-    using boost::property_tree::ptree;
-    ptree pt;
-
-    read_xml(input, pt);
-
-    pnf.wireshark_test_mode = pt.get<unsigned>("pnf.wireshark_test_mode", 0);
-
-
-    pnf.sync_mode = pt.get<unsigned>("pnf.sync_mode");
-    pnf.location_mode= pt.get<unsigned>("pnf.location_mode");
-    //pnf.sync_mode = pt.get<unsigned>("pnf.location_coordinates");
-
-    pnf.dl_config_timing= pt.get<unsigned>("pnf.dl_config_timing");
-    pnf.ul_config_timing = pt.get<unsigned>("pnf.ul_config_timing");
-    pnf.tx_timing = pt.get<unsigned>("pnf.tx_timing");
-    pnf.hi_dci0_timing = pt.get<unsigned>("pnf.hi_dci0_timing");
-
-    pnf.max_phys = pt.get<unsigned>("pnf.max_phys");
-    pnf.max_total_bw = pt.get<unsigned>("pnf.max_total_bandwidth");
-    pnf.max_total_dl_layers = pt.get<unsigned>("pnf.max_total_num_dl_layers");
-    pnf.max_total_ul_layers = pt.get<unsigned>("pnf.max_total_num_ul_layers");
-
-    pnf.shared_bands = pt.get<unsigned>("pnf.shared_bands");
-    pnf.shared_pa = pt.get<unsigned>("pnf.shared_pas");
-
-    pnf.max_total_power = pt.get<signed>("pnf.maximum_total_power");
-
-    //"oui");
-
-    for(const auto& v : pt.get_child("pnf.phys"))
-    {
-      if(v.first == "phy")
-      {
-        phy_info phy;
-
-
-
-        phy.index = v.second.get<unsigned>("index");
-        phy.local_port = v.second.get<unsigned>("port");
-        phy.local_addr = v.second.get<std::string>("address");
-        phy.duplex_mode = v.second.get<unsigned>("duplex_mode");
-
-        phy.dl_channel_bw_support = v.second.get<unsigned>("downlink_channel_bandwidth_support");
-        phy.ul_channel_bw_support = v.second.get<unsigned>("uplink_channel_bandwidth_support");
-        phy.num_dl_layers_supported = v.second.get<unsigned>("number_of_dl_layers");
-        phy.num_ul_layers_supported = v.second.get<unsigned>("number_of_ul_layers");
-        phy.release_supported = v.second.get<unsigned>("3gpp_release_supported");
-        phy.nmm_modes_supported = v.second.get<unsigned>("nmm_modes_supported");
-
-        for(const auto& v2 : v.second.get_child("rfs"))
-        {
-          if(v2.first == "index")
-            phy.rfs.push_back(v2.second.get_value<unsigned>());
-        }
-        for(const auto& v2 : v.second.get_child("excluded_rfs"))
-        {
-          if(v2.first == "index")
-            phy.excluded_rfs.push_back(v2.second.get_value<unsigned>());
-        }
-
-        boost::optional<const boost::property_tree::ptree&> d = v.second.get_child_optional("data.udp");
-        if(d.is_initialized())
-        {
-          phy.udp.enabled = true;
-          phy.udp.rx_port = d.get().get<unsigned>("rx_port");
-          phy.udp.tx_port = d.get().get<unsigned>("tx_port");
-          phy.udp.tx_addr = d.get().get<std::string>("tx_addr");
-        }
-        else
-        {
-          phy.udp.enabled = false;
-        }
-
-        phy.dl_ues_per_subframe = v.second.get<unsigned>("dl_ues_per_subframe");
-        phy.ul_ues_per_subframe = v.second.get<unsigned>("ul_ues_per_subframe");
-
-        pnf.phys.push_back(phy);
-      }
-    }	
-    for(const auto& v : pt.get_child("pnf.rfs"))
-    {
-      if(v.first == "rf")
-      {
-        rf_info rf;
-
-        rf.index = v.second.get<unsigned>("index");
-        rf.band = v.second.get<unsigned>("band");
-        rf.max_transmit_power = v.second.get<signed>("max_transmit_power");
-        rf.min_transmit_power = v.second.get<signed>("min_transmit_power");
-        rf.num_antennas_supported = v.second.get<unsigned>("num_antennas_supported");
-        rf.min_downlink_frequency = v.second.get<unsigned>("min_downlink_frequency");
-        rf.max_downlink_frequency = v.second.get<unsigned>("max_downlink_frequency");
-        rf.min_uplink_frequency = v.second.get<unsigned>("max_uplink_frequency");
-        rf.max_uplink_frequency = v.second.get<unsigned>("min_uplink_frequency");
-
-        pnf.rfs.push_back(rf);
-      }
-    }	
-  }
-  catch(std::exception& e)
-  {
-    printf("%s", e.what());
-    return -1;
-  }
-  catch(boost::exception& e)
-  {
-    printf("%s", boost::diagnostic_information(e).c_str());
-    return -1;
-  }
-
-#endif
-
-#if 0
-  pnf->phys[0].udp.enabled = 1;
-  pnf->phys[0].udp.rx_port = 50000; //DJP d.get().get<unsigned>("rx_port");
-  pnf->phys[0].udp.tx_port = 50001; //DJP d.get().get<unsigned>("tx_port");
-  strcpy(pnf->phys[0].udp.tx_addr, "127.0.0.2"); //DJP d.get().get<std::string>("tx_addr");
-  printf("%s() DJP HARD CODED PHY UDP address port to %s rx:%d tx:%d\n", 
-      __FUNCTION__, pnf->phys[0].udp.tx_addr, pnf->phys[0].udp.rx_port, pnf->phys[0].udp.tx_port);
-#endif
-
-  return 0;
-}
 
 void pnf_sim_trace(nfapi_trace_level_t level, const char* message, ...)
 {
@@ -643,117 +504,6 @@ int pnf_config_request(nfapi_pnf_config_t* config, nfapi_pnf_config_request_t* r
   return 0;
 }
 
-int fapi_param_response(fapi_t* fapi, fapi_param_resp_t* resp)
-{
-  printf("[PNF] fapi param response\n");
-  pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data);
-
-  nfapi_param_response_t nfapi_resp;
-
-  printf("[PNF] fapi param response phy_id:%d number_of_tlvs:%u\n", data->phy_id, resp->number_of_tlvs);
-
-  memset(&nfapi_resp, 0, sizeof(nfapi_resp));
-  nfapi_resp.header.message_id = NFAPI_PARAM_RESPONSE;
-  nfapi_resp.header.phy_id = data->phy_id;
-  nfapi_resp.error_code = resp->error_code;
-
-  for(int i = 0; i < resp->number_of_tlvs; ++i)
-  {
-    switch(resp->tlvs[i].tag)
-    {
-      case FAPI_PHY_STATE_TAG:
-        nfapi_resp.l1_status.phy_state.tl.tag = NFAPI_L1_STATUS_PHY_STATE_TAG;
-        nfapi_resp.l1_status.phy_state.value = resp->tlvs[i].value;
-        nfapi_resp.num_tlv++;
-        break;
-
-      case FAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG:
-        nfapi_resp.phy_capabilities.dl_bandwidth_support.tl.tag = NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG;
-        nfapi_resp.phy_capabilities.dl_bandwidth_support.value = resp->tlvs[i].value;
-        nfapi_resp.num_tlv++;
-        printf("%s() DL BW support %d\n", __FUNCTION__, nfapi_resp.phy_capabilities.dl_bandwidth_support.value);
-        break;
-
-      case FAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG:
-        nfapi_resp.phy_capabilities.ul_bandwidth_support.tl.tag = NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG;
-        nfapi_resp.phy_capabilities.ul_bandwidth_support.value = resp->tlvs[i].value;
-        nfapi_resp.num_tlv++;
-        break;
-      default:
-        printf("%s() %s:%d Unhandled TLV:%d\n", __FUNCTION__, __FILE__, __LINE__, resp->tlvs[i].tag);
-        break;
-    }
-  }
-
-  {
-    //if(phy->state == NFAPI_PNF_PHY_IDLE)
-    //if(nfapi_resp.l1_status.phy_state.value == NFAPI_PNF_PHY_IDLE)
-    {
-      // -- NFAPI
-      // Downlink UEs per Subframe
-      nfapi_resp.nfapi_config.dl_ue_per_sf.tl.tag = NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG;
-      nfapi_resp.nfapi_config.dl_ue_per_sf.value = data->phy->dl_ues_per_subframe;
-      nfapi_resp.num_tlv++;
-      // Uplink UEs per Subframe
-      nfapi_resp.nfapi_config.ul_ue_per_sf.tl.tag = NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG;
-      nfapi_resp.nfapi_config.ul_ue_per_sf.value = data->phy->ul_ues_per_subframe;
-      nfapi_resp.num_tlv++;
-      // nFAPI RF Bands
-      nfapi_resp.nfapi_config.rf_bands.tl.tag = NFAPI_PHY_RF_BANDS_TAG;
-      nfapi_resp.nfapi_config.rf_bands.number_rf_bands = 2;
-      nfapi_resp.nfapi_config.rf_bands.rf_band[0] = 23;
-      nfapi_resp.nfapi_config.rf_bands.rf_band[1] = 7;
-
-      // P7 PNF Address IPv4
-      nfapi_resp.nfapi_config.p7_pnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG;
-      struct sockaddr_in pnf_p7_sockaddr;
-      //DJP pnf_p7_sockaddr.sin_addr.s_addr = inet_addr(data->phy->local_addr.c_str());
-
-      //DJP
-      strcpy(data->phy->local_addr, "192.168.1.74");
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DJP HARD CODED IP ADDRESS to %s\n", __FUNCTION__, data->phy->local_addr);
-      data->phy->local_port = 32123;
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DJP HARD CODED PORT to %d\n", __FUNCTION__, data->phy->local_port);
-
-
-
-
-      pnf_p7_sockaddr.sin_addr.s_addr = inet_addr(data->phy->local_addr);
-      memcpy(&(nfapi_resp.nfapi_config.p7_pnf_address_ipv4.address[0]), &pnf_p7_sockaddr.sin_addr.s_addr, 4);
-      nfapi_resp.num_tlv++;
-      // P7 PNF Address IPv6
-      // P7 PNF Port
-      nfapi_resp.nfapi_config.p7_pnf_port.tl.tag = NFAPI_NFAPI_P7_PNF_PORT_TAG;
-      nfapi_resp.nfapi_config.p7_pnf_port.value = data->phy->local_port;
-      nfapi_resp.num_tlv++;
-      // NMM GSM Frequency Bands
-      nfapi_resp.nfapi_config.nmm_gsm_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG;
-      nfapi_resp.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands = 1;
-      nfapi_resp.nfapi_config.nmm_gsm_frequency_bands.bands[0] = 23;
-      nfapi_resp.num_tlv++;
-      // NMM UMTS Frequency Bands
-      nfapi_resp.nfapi_config.nmm_umts_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG;
-      nfapi_resp.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands = 1;
-      nfapi_resp.nfapi_config.nmm_umts_frequency_bands.bands[0] = 23;
-      nfapi_resp.num_tlv++;
-      // NMM LTE Frequency Bands
-      nfapi_resp.nfapi_config.nmm_lte_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG;
-      nfapi_resp.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands = 1;
-      nfapi_resp.nfapi_config.nmm_lte_frequency_bands.bands[0] = 23;
-      nfapi_resp.num_tlv++;
-      // NMM Uplink RSSI supported
-      nfapi_resp.nfapi_config.nmm_uplink_rssi_supported.tl.tag = NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG;
-      nfapi_resp.nfapi_config.nmm_uplink_rssi_supported.value = 1;
-      nfapi_resp.num_tlv++;
-
-    }
-  }
-
-  nfapi_pnf_param_resp(data->config, &nfapi_resp);
-
-  return 0;
-}
-
 void nfapi_send_pnf_start_resp(nfapi_pnf_config_t* config, uint16_t phy_id)
 {
   printf("Sending NFAPI_START_RESPONSE config:%p phy_id:%d\n", config, phy_id);
@@ -818,6 +568,8 @@ int param_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
 
   nfapi_param_response_t nfapi_resp;
 
+  pnf_info* pnf = (pnf_info*)(config->user_data);
+
   memset(&nfapi_resp, 0, sizeof(nfapi_resp));
   nfapi_resp.header.message_id = NFAPI_PARAM_RESPONSE;
   nfapi_resp.header.phy_id = req->header.phy_id;
@@ -826,9 +578,7 @@ int param_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
   char local_addr[80];
   struct sockaddr_in pnf_p7_sockaddr;
 
-  strcpy(local_addr, "192.168.1.74"); // DJP - hard code alert FIXME TODO
-
-  pnf_p7_sockaddr.sin_addr.s_addr = inet_addr(local_addr);
+  pnf_p7_sockaddr.sin_addr.s_addr = inet_addr(pnf->phys[0].local_addr);
   nfapi_resp.nfapi_config.p7_pnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG;
   memcpy(nfapi_resp.nfapi_config.p7_pnf_address_ipv4.address, &pnf_p7_sockaddr.sin_addr.s_addr, 4);
   nfapi_resp.num_tlv++;
@@ -875,6 +625,8 @@ int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfap
 
   pnf_info* pnf = (pnf_info*)(config->user_data);
   uint8_t num_tlv = 0;
+  struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
+  LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
 
 #if 0
   //DJP
@@ -921,9 +673,9 @@ int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfap
   if(req->rf_config.dl_channel_bandwidth.tl.tag == NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG)
   {
     phy_info->dl_channel_bw_support = req->rf_config.dl_channel_bandwidth.value;
-    RC.eNB[0][0]->frame_parms.N_RB_DL = req->rf_config.dl_channel_bandwidth.value;
+    fp->N_RB_DL = req->rf_config.dl_channel_bandwidth.value;
     num_tlv++;
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG N_RB_DL:%u\n", __FUNCTION__, RC.eNB[0][0]->frame_parms.N_RB_DL);
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG N_RB_DL:%u\n", __FUNCTION__, fp->N_RB_DL);
   }
   else
   {
@@ -933,152 +685,141 @@ int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfap
   if(req->rf_config.ul_channel_bandwidth.tl.tag == NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG)
   {
     phy_info->ul_channel_bw_support = req->rf_config.ul_channel_bandwidth.value;
-    RC.eNB[0][0]->frame_parms.N_RB_UL = req->rf_config.ul_channel_bandwidth.value;
+    fp->N_RB_UL = req->rf_config.ul_channel_bandwidth.value;
     num_tlv++;
   }
 
   if(req->nfapi_config.rf_bands.tl.tag == NFAPI_NFAPI_RF_BANDS_TAG)
   {
     pnf->rfs[0].band = req->nfapi_config.rf_bands.rf_band[0];
-    RC.eNB[0][0]->frame_parms.eutra_band = req->nfapi_config.rf_bands.rf_band[0];
+    fp->eutra_band = req->nfapi_config.rf_bands.rf_band[0];
     num_tlv++;
   }
 
   if(req->nfapi_config.earfcn.tl.tag == NFAPI_NFAPI_EARFCN_TAG)
   {
-    RC.eNB[0][0]->frame_parms.dl_CarrierFreq = from_earfcn(RC.eNB[0][0]->frame_parms.eutra_band, req->nfapi_config.earfcn.value); // DJP - TODO FIXME - hard coded to first rf
-    RC.eNB[0][0]->frame_parms.ul_CarrierFreq = RC.eNB[0][0]->frame_parms.dl_CarrierFreq - (get_uldl_offset(RC.eNB[0][0]->frame_parms.eutra_band) * 1e5);
+    fp->dl_CarrierFreq = from_earfcn(fp->eutra_band, req->nfapi_config.earfcn.value); // DJP - TODO FIXME - hard coded to first rf
+    fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(fp->eutra_band) * 1e5);
     num_tlv++;
 
     NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() earfcn:%u dl_carrierFreq:%u ul_CarrierFreq:%u band:%u N_RB_DL:%u\n", 
-        __FUNCTION__, req->nfapi_config.earfcn.value, RC.eNB[0][0]->frame_parms.dl_CarrierFreq, RC.eNB[0][0]->frame_parms.ul_CarrierFreq, pnf->rfs[0].band, RC.eNB[0][0]->frame_parms.N_RB_DL);
+        __FUNCTION__, req->nfapi_config.earfcn.value, fp->dl_CarrierFreq, fp->ul_CarrierFreq, pnf->rfs[0].band, fp->N_RB_DL);
   }
 
   if (req->subframe_config.duplex_mode.tl.tag == NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG)
   {
-    RC.eNB[0][0]->frame_parms.frame_type = req->subframe_config.duplex_mode.value==0 ? TDD : FDD;
+    fp->frame_type = req->subframe_config.duplex_mode.value==0 ? TDD : FDD;
     num_tlv++;
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() frame_type:%d\n", __FUNCTION__, RC.eNB[0][0]->frame_parms.frame_type);
+    NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() frame_type:%d\n", __FUNCTION__, fp->frame_type);
   }
   if (req->subframe_config.dl_cyclic_prefix_type.tl.tag == NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG)
   {
-    RC.eNB[0][0]->frame_parms.Ncp = req->subframe_config.dl_cyclic_prefix_type.value;
+    fp->Ncp = req->subframe_config.dl_cyclic_prefix_type.value;
     num_tlv++;
   }
 
   if (req->subframe_config.ul_cyclic_prefix_type.tl.tag == NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG)
   {
-    RC.eNB[0][0]->frame_parms.Ncp_UL = req->subframe_config.ul_cyclic_prefix_type.value;
+    fp->Ncp_UL = req->subframe_config.ul_cyclic_prefix_type.value;
     num_tlv++;
   }
 
-  RC.eNB[0][0]->frame_parms.num_MBSFN_config = 0; // DJP - hard code alert
+  fp->num_MBSFN_config = 0; // DJP - hard code alert
 
   if (req->sch_config.physical_cell_id.tl.tag == NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG)
   {
-    RC.eNB[0][0]->frame_parms.Nid_cell = req->sch_config.physical_cell_id.value;
+    fp->Nid_cell = req->sch_config.physical_cell_id.value;
+    fp->nushift = fp->Nid_cell%6;
     num_tlv++;
   }
 
   if (req->rf_config.tx_antenna_ports.tl.tag == NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG)
   {
-    RC.eNB[0][0]->frame_parms.nb_antennas_tx = req->rf_config.tx_antenna_ports.value;
-    RC.eNB[0][0]->frame_parms.nb_antenna_ports_eNB = 1;
+    fp->nb_antennas_tx = req->rf_config.tx_antenna_ports.value;
+    fp->nb_antenna_ports_eNB = 1;
     num_tlv++;
   }
 
   if (req->rf_config.rx_antenna_ports.tl.tag == NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG)
   {
-    RC.eNB[0][0]->frame_parms.nb_antennas_rx = req->rf_config.rx_antenna_ports.value;
+    fp->nb_antennas_rx = req->rf_config.rx_antenna_ports.value;
     num_tlv++;
   }
 
-  if (req->rf_config.rx_antenna_ports.tl.tag == NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG)
-  {
-    RC.eNB[0][0]->frame_parms.nb_antennas_rx = req->rf_config.rx_antenna_ports.value;
-    num_tlv++;
-  }
-
-  RC.eNB[0][0]->frame_parms.nushift = 0;
-
   if (req->phich_config.phich_resource.tl.tag == NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG)
   {
-    RC.eNB[0][0]->frame_parms.phich_config_common.phich_resource = req->phich_config.phich_resource.value;
+    fp->phich_config_common.phich_resource = req->phich_config.phich_resource.value;
     num_tlv++;
   }
 
   if (req->phich_config.phich_duration.tl.tag == NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG)
   {
-    RC.eNB[0][0]->frame_parms.phich_config_common.phich_duration = req->phich_config.phich_duration.value;
+    fp->phich_config_common.phich_duration = req->phich_config.phich_duration.value;
     num_tlv++;
   }
 
   if (req->phich_config.phich_power_offset.tl.tag == NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG)
   {
     LOG_E(PHY, "%s() NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG tag:%d not supported\n", __FUNCTION__, req->phich_config.phich_power_offset.tl.tag);
-    //RC.eNB[0][0]->frame_parms.phich_config_common.phich_power_offset = req->phich_config.
+    //fp->phich_config_common.phich_power_offset = req->phich_config.
     num_tlv++;
   }
 
   // UL RS Config
   if (req->uplink_reference_signal_config.cyclic_shift_1_for_drms.tl.tag == NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG)
   {
-    RC.eNB[0][0]->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = req->uplink_reference_signal_config.cyclic_shift_1_for_drms.value;
+    fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = req->uplink_reference_signal_config.cyclic_shift_1_for_drms.value;
     num_tlv++;
   }
 
   if (req->uplink_reference_signal_config.uplink_rs_hopping.tl.tag == NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG)
   {
-    RC.eNB[0][0]->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = req->uplink_reference_signal_config.uplink_rs_hopping.value;
+    fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = req->uplink_reference_signal_config.uplink_rs_hopping.value;
     num_tlv++;
   }
 
   if (req->uplink_reference_signal_config.group_assignment.tl.tag == NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG)
   {
-    RC.eNB[0][0]->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = req->uplink_reference_signal_config.group_assignment.value;
+    fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = req->uplink_reference_signal_config.group_assignment.value;
     num_tlv++;
   }
 
   if (req->pusch_config.hopping_mode.tl.tag == NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG) { }  // DJP - not being handled?
 
-  RC.eNB[0][0]->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; // DJP - not being handled
+  fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; // DJP - not being handled
 
   if (req->prach_config.configuration_index.tl.tag == NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG)
   {
-    RC.eNB[0][0]->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=req->prach_config.configuration_index.value;
+    fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=req->prach_config.configuration_index.value;
     num_tlv++;
   }
 
   if (req->prach_config.root_sequence_index.tl.tag == NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG)
   {
-    RC.eNB[0][0]->frame_parms.prach_config_common.rootSequenceIndex=req->prach_config.root_sequence_index.value;
+    fp->prach_config_common.rootSequenceIndex=req->prach_config.root_sequence_index.value;
     num_tlv++;
   }
 
   if (req->prach_config.zero_correlation_zone_configuration.tl.tag == NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG)
   {
-    RC.eNB[0][0]->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=req->prach_config.zero_correlation_zone_configuration.value;
+    fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=req->prach_config.zero_correlation_zone_configuration.value;
     num_tlv++;
   }
 
   if (req->prach_config.high_speed_flag.tl.tag == NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG)
   {
-    RC.eNB[0][0]->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=req->prach_config.high_speed_flag.value;
+    fp->prach_config_common.prach_ConfigInfo.highSpeedFlag=req->prach_config.high_speed_flag.value;
     num_tlv++;
   }
 
   if (req->prach_config.frequency_offset.tl.tag == NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG)
   {
-    RC.eNB[0][0]->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=req->prach_config.frequency_offset.value;
+    fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset=req->prach_config.frequency_offset.value;
     num_tlv++;
   }
 
   printf("[PNF] CONFIG_REQUEST[num_tlv:%d] TLVs processed:%d\n", req->num_tlv, num_tlv);
 
-  // DJP - commented out 19/9/17
-  //init_frame_parms(&RC.eNB[0][0]->frame_parms,1);
-  //init_lte_top(&RC.eNB[0][0]->frame_parms);
-
   printf("[PNF] Simulating PHY CONFIG - DJP\n");
   PHY_Config_t phy_config;
   phy_config.Mod_id = 0;
@@ -1087,7 +828,7 @@ int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfap
 
   phy_config_request(&phy_config);
 
-  dump_frame_parms(&RC.eNB[0][0]->frame_parms);
+  dump_frame_parms(fp);
 
   phy_info->remote_port = req->nfapi_config.p7_vnf_port.value;
 
@@ -1555,22 +1296,22 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
     NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] DJP - HACK - Set p7_config global ready for subframe ind%s\n", __FUNCTION__);
     p7_config_g = p7_config;
 
-    printf("[PNF] MARKING RC.eNB[0][0]->configured=1 %s()\n", __FUNCTION__);
-    RC.eNB[0][0]->configured = 1;
-
     // DJP - INIT PHY RELATED STUFF - this should be separate i think but is not currently...
     {
       printf("[PNF] %s() Calling phy_init_lte_eNB() and setting nb_antennas_rx = 1\n", __FUNCTION__);
       printf("[PNF] %s() TBD create frame_parms from NFAPI message\n", __FUNCTION__);
 
       phy_init_lte_eNB(RC.eNB[0][0],0,0);
-      RC.eNB[0][0]->frame_parms.nb_antennas_rx = 1;
+      //RC.eNB[0][0]->frame_parms.nb_antennas_rx = 1;
       for (int ce_level=0;ce_level<4;ce_level++)
 	RC.eNB[0][0]->prach_vars.rxsigF[ce_level] = (int16_t**)malloc16(64*sizeof(int16_t*));
 #ifdef Rel14
       for (int ce_level=0;ce_level<4;ce_level++)
 	RC.eNB[0][0]->prach_vars_br.rxsigF[ce_level] = (int16_t**)malloc16(64*sizeof(int16_t*));
 #endif
+
+      printf("[PNF] Calling mac_top_init_eNB() so that RC.mac[] is init\n");
+      mac_top_init_eNB();
     }
 
     while(sync_var<0)
@@ -1579,6 +1320,11 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
       printf("[PNF] waiting for OAI to be started\n");
     }
 
+    printf("[PNF] RC.nb_inst=1 DJP - this is because phy_init_RU() uses that to index and not RC.num_eNB - why the 2 similar variables?\n");
+    RC.nb_inst =1; // DJP - fepc_tx uses num_eNB but phy_init_RU uses nb_inst
+    printf("[PNF] About to call phy_init_RU()\n");
+    phy_init_RU(RC.ru[0]);
+
     printf("[PNF] Sending PNF_START_RESP\n");
     nfapi_send_pnf_start_resp(config, p7_config->phy_id);
 
@@ -1890,17 +1636,8 @@ void* pnf_start_thread(void* ptr)
   return (void*)0;
 }
 
-void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, int pnf_p7_port, int vnf_p7_port)
+void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port)
 {
-  char *xml_file = 0;
-
-  //DJP if(read_pnf_xml(pnf, argv[3]) < 0)
-  if(read_pnf_xml(&pnf, xml_file) < 0)
-  {
-    printf("Failed to read xml file>\n");
-    return ;
-  }
-
   nfapi_pnf_config_t* config = nfapi_pnf_config_create();
 
   config->vnf_ip_addr = vnf_ip_addr;
@@ -1911,9 +1648,12 @@ void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, int pnf_p7_port, in
   pnf.phys[0].udp.tx_port = vnf_p7_port;
   strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr);
 
-  printf("%s() VNF:%s:%d PNF_PHY[UDP:tx_addr:%s:%d rx:%d]\n", 
+  strcpy(pnf.phys[0].local_addr, pnf_ip_addr);
+
+  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n", 
       __FUNCTION__, 
       config->vnf_ip_addr, config->vnf_p5_port, 
+      pnf.phys[0].local_addr,
       pnf.phys[0].udp.tx_addr, pnf.phys[0].udp.tx_port,
       pnf.phys[0].udp.rx_port);
 
diff --git a/nfapi/nfapi_pnf.h b/nfapi/nfapi_pnf.h
index 5b97536f58bc8b3900e24b2cb26d951b916f5e1c..12f2f8e9927c21e272412a0edd213c151d770fac 100644
--- a/nfapi/nfapi_pnf.h
+++ b/nfapi/nfapi_pnf.h
@@ -1,6 +1,6 @@
 #if !defined(NFAPI_PNF_H__)
 #define NFAPI_PNF_H__
 
-void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, int pnf_p7_port, int vnf_p7_port);
+void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
 
 #endif