diff --git a/cmds/config_file/lab_testbed.json b/cmds/config_file/lab_testbed.json
index 0060d7055e4f82f7bd584ca73a08b48f4e6361c7..fe6d63c63dcefa3c0c986cfa3e55ba9dc04e4f65 100644
--- a/cmds/config_file/lab_testbed.json
+++ b/cmds/config_file/lab_testbed.json
@@ -15,32 +15,24 @@
     "output_queues" : {
         "default" : {
             "enabled" : false,
-            "eth_src_mac" : "0e:05:05:00:00:04",
-            "eth_dst_mac" : "50:6b:4b:c0:b2:50",
-            "ip_src_addr" : "192.168.10.10",
-            "ip_dst_addr" : "192.168.10.100",
-            "udp_src_port" : 8997,
-            "udp_dst_port" : 9000,
+            "destination_lut_index" : 0,
             "readout_type" : "0x48",
             "pkt_gen_enable" : false,
             "pkt_gen_idles" : "0x00000f",
             "pkt_gen_length" : "0x000000ff"
         },
         "0": {
-            "enabled" : true,
-            "udp_dst_port" : 9000
-        },
-        "1": {
-            "enabled" : false,
-            "udp_dst_port" : 9001
-        },
-        "2": {
-            "enabled" : false,
-            "udp_dst_port" : 9002
-        },
-        "3": {
-            "enabled" : false,
-            "udp_dst_port" : 9003
+            "enabled" : true
+        }
+    },
+    "udp_core" : {
+        "src_mac" : "0e:05:05:00:00:04",
+        "src_ip" : "192.168.10.1",
+        "src_port" : 9000,
+        "arp_refresh_timeout" : 1228.7,
+        "arp_reply_timeout" : 25.5,
+        "lut" : {
+            "0": { "dst_ip" : "192.168.10.100", "dst_port" : 51001}
         }
     }
 }
\ No newline at end of file
diff --git a/cmds/st.cmd b/cmds/st.cmd
index f6ccfa7ae796298c5c61f05672b3743ec7148f20..9f5e01fed9d219c5124dd52ce9316e1c6c380db2 100644
--- a/cmds/st.cmd
+++ b/cmds/st.cmd
@@ -11,15 +11,18 @@ drvAsynIPPortConfigure("L0", "$(IPADDR):$(IPPORT) UDP", 0, 0, 1)
 #asynSetTraceIOMask( L0, -1, 0x4)
 #asynSetTraceInfoMask ( L0, -1, 0x9)
 
-RMMConfig("RMM", "L0", "/home/iocuser/douglas/fe-vmm-tbl/cmds/config_file/lab_testbed.json" 0)
-VMMTblConfig("RMM", 0, 0)
+RMMConfig("RMM", "L0", "/home/iocuser/douglas/fe-vmm-tbl/cmds/config_file/lab_testbed.json", 0)
+
+#VMMTblConfig("portName", ring, number_hybrids)
+VMMTblConfig("RMM", 0, 2)
 
 dbLoadRecords("${asyn_DIR}/db/asynRecord.db","P=asyn:,R=Test,PORT=L0,ADDR=0,IMAX=0,OMAX=0")
 dbLoadRecords($(rmm_DB)/rmm.db, "P=$(P), R=$(R), PORT=RMM, ADDR=0, TIMEOUT=1")
 dbLoadRecords($(rmm_DB)/rmm_sensors.db, "P=$(P), R=$(R), PORT=RMM, TIMEOUT=1")
-dbLoadRecords($(rmm_DB)/topology.db, "P=$(P), R=$(R), PORT=RMM, TIMEOUT=1")
+dbLoadRecords($(rmm_DB)/ring.db, "P=$(P), R=$(R), ADDR=0, PORT=RMM, TIMEOUT=1")
 
 dbLoadRecords("$(rmm_DB)/rmm_packets.template", "P=$(P), R=$(R), PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1")
+dbLoadRecords("$(rmm_DB)/topology.template", "P=$(P), R=$(R), PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1")
 
 dbLoadRecords("$(vmmTbl_DB)/vmm_tbl.db", "P=$(P), R=NDet-VMM-001:, PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1")
 
@@ -34,4 +37,4 @@ dbpf $(P)$(R)VoltVCC1V2-R.SCAN 2
 dbpf $(P)$(R)VoltMGTAVCC-R.SCAN 2
 dbpf $(P)$(R)VoltMGTAVTT-R.SCAN 2
 dbpf $(P)$(R)VoltVCCINTIOBRAM-R.SCAN 2
-#
\ No newline at end of file
+#
diff --git a/vmmTblApp/src/vmm_config.cpp b/vmmTblApp/src/vmm_config.cpp
index 1e1132c2aca6c2c9dc48ec150e9a3b704fc69cf4..cee4c5ede01ca0e3a2aeda5bdee3982edf12064b 100644
--- a/vmmTblApp/src/vmm_config.cpp
+++ b/vmmTblApp/src/vmm_config.cpp
@@ -46,10 +46,10 @@ void FENConfigModule::sendAll(bool useConfigCheck) {
 }
 
 void FENConfigModule::enableAcquisition(bool enabled) {
-  pFEN->user_reg_write("app_acq_enable", enabled);
-  pFEN->user_reg_write("sc_acq_on_off", 0x00000000);
-  pFEN->user_reg_write("sc_acq_on_off", 0x00000001);
-  pFEN->user_reg_write("sc_acq_on_off", 0x00000000);
+  pFEN->userRegWrite("app_acq_enable", enabled);
+  pFEN->userRegWrite("sc_acq_on_off", 0x00000000);
+  pFEN->userRegWrite("sc_acq_on_off", 0x00000001);
+  pFEN->userRegWrite("sc_acq_on_off", 0x00000000);
 }
 
 void FENConfigModule::checkLinkStatus(std::string& message, std::vector<std::string>& linkStatus) {
@@ -71,18 +71,18 @@ void FENConfigModule::checkLinkStatus(std::string& message, std::vector<std::str
 }
 
 void FENConfigModule::configFEN() {
-  pFEN->user_reg_write("app_debug_data_format", 0);
-  pFEN->user_reg_write("app_latency_reset", 27);
-  pFEN->user_reg_write("app_latency_data_max", 1024);
-  pFEN->user_reg_write("app_latency_data_jitter", 0);
-  pFEN->user_reg_write("app_tp_offset_first", 100);
-  pFEN->user_reg_write("app_tp_offset", 1000);
-  pFEN->user_reg_write("app_tp_latency", 46);
-  pFEN->user_reg_write("app_tp_number", 1);
-  pFEN->user_reg_write("app_chmask", getChMap());
-  pFEN->user_reg_write("sc_cfg_app", 0x00000000);
-  pFEN->user_reg_write("sc_cfg_app", 0x00000001);
-  pFEN->user_reg_write("sc_cfg_app", 0x00000000);
+  pFEN->userRegWrite("app_debug_data_format", 0);
+  pFEN->userRegWrite("app_latency_reset", 27);
+  pFEN->userRegWrite("app_latency_data_max", 1024);
+  pFEN->userRegWrite("app_latency_data_jitter", 0);
+  pFEN->userRegWrite("app_tp_offset_first", 100);
+  pFEN->userRegWrite("app_tp_offset", 1000);
+  pFEN->userRegWrite("app_tp_latency", 46);
+  pFEN->userRegWrite("app_tp_number", 1);
+  pFEN->userRegWrite("app_chmask", getChMap());
+  pFEN->userRegWrite("sc_cfg_app", 0x00000000);
+  pFEN->userRegWrite("sc_cfg_app", 0x00000001);
+  pFEN->userRegWrite("sc_cfg_app", 0x00000000);
 }
 
 uint16_t FENConfigModule::getChMap() {
@@ -122,13 +122,13 @@ void FENConfigModule::configHybrid(int hybrid_index) {
   for (const auto& reg : registers) {
     unsigned short result = 0;
     hybrids[hybrid_index].getRegister(reg, result);
-    pFEN->user_reg_write(reg + std::to_string(hybrid_index), result);
+    pFEN->userRegWrite(reg + std::to_string(hybrid_index), result);
   }
 
   uint32_t value = (1 << hybrid_index);
-  pFEN->user_reg_write("sc_cfg_hyb", 0x0);
-  pFEN->user_reg_write("sc_cfg_hyb", value);
-  pFEN->user_reg_write("sc_cfg_hyb", 0x0);
+  pFEN->userRegWrite("sc_cfg_hyb", 0x0);
+  pFEN->userRegWrite("sc_cfg_hyb", value);
+  pFEN->userRegWrite("sc_cfg_hyb", 0x0);
 }
 
 bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConfigCheck)
@@ -192,7 +192,7 @@ bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConf
   for(unsigned int i = firstGlobalRegSPI_2; i <= lastGlobalRegSPI_2; i++) {
     std::string param = "vmm_global_bank2_sp" + std::to_string(i - firstGlobalRegSPI_2) + sVmmIndex;
     uint32_t value = std::stoul(globalRegisters2[i - firstGlobalRegSPI_2], nullptr, 2);
-    pFEN->user_reg_write(param, value);
+    pFEN->userRegWrite(param, value);
   }
 
   //channel SPI
@@ -202,20 +202,20 @@ bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConf
     std::string param = "vmm_ch" + position_str + sVmmIndex;
     uint32_t value = std::stoul(channelRegisters[i], nullptr, 2);
     std::cout << "param: " << param << std::endl;
-    pFEN->user_reg_write(param, value);
+    pFEN->userRegWrite(param, value);
   }
 
   // global SPI / VMM3: global bank 1
   for(unsigned int i = firstGlobalRegSPI_1; i <= lastGlobalRegSPI_1; i++) {
     std::string param = "vmm_global_bank1_sp" + std::to_string(i - firstGlobalRegSPI_1) + sVmmIndex;
     uint32_t value = std::stoul(globalRegisters[i - firstGlobalRegSPI_1], nullptr, 2);
-    pFEN->user_reg_write(param, value);
+    pFEN->userRegWrite(param, value);
   }
 
   uint32_t value = (1 << idx);
-  pFEN->user_reg_write("sc_cfg_vmm", 0x00000000);
-  pFEN->user_reg_write("sc_cfg_vmm", value);
-  pFEN->user_reg_write("sc_cfg_vmm", 0x00000000);
+  pFEN->userRegWrite("sc_cfg_vmm", 0x00000000);
+  pFEN->userRegWrite("sc_cfg_vmm", value);
+  pFEN->userRegWrite("sc_cfg_vmm", 0x00000000);
   
   return result;
 }
@@ -418,16 +418,16 @@ int FENConfigModule::readADC(int hybrid_index, int vmm_index) {
 
 uint32_t FENConfigModule::readWriteRegs(std::string command_reg, int index, std::string read_reg) {
   unsigned int data = 0x00000000;
-  pFEN->user_reg_write(command_reg, data);
+  pFEN->userRegWrite(command_reg, data);
   data = (1 << index);
-  pFEN->user_reg_write(command_reg, data);
+  pFEN->userRegWrite(command_reg, data);
 
   //Do not read registers back too soon, otherwise old ADC value is read
   delayMilliseconds(7);
 
-  uint32_t value = pFEN->user_reg_read(read_reg);
+  uint32_t value = pFEN->userRegRead(read_reg);
   std::cout << "value: " << value << std::endl;
-  pFEN->user_reg_write(command_reg, 0x0);
+  pFEN->userRegWrite(command_reg, 0x0);
 
   return value;
 }
diff --git a/vmmTblApp/src/vmm_tbl.cpp b/vmmTblApp/src/vmm_tbl.cpp
index 6e4fa7bfadfa44065f0f4c0432a287bea86c49c3..16150768f39d085def210b9293d8ff7df0f098e8 100644
--- a/vmmTblApp/src/vmm_tbl.cpp
+++ b/vmmTblApp/src/vmm_tbl.cpp
@@ -1,28 +1,32 @@
 #include "vmm_tbl.h"
 
 /** Constructor for the VMMTbl class */
-VMMTbl::VMMTbl(RMM& rmm, int ring, int node)
+VMMTbl::VMMTbl(RMM& rmm, int ring, int node, int hybrids)
   : FrontEndBase(rmm.get_rmm_reg_access(), ring, node),
     pVMMConfig(*this),
     pRMM(&rmm)
 {
+  number_hybrids = hybrids;
   addr_list = ring * NUMBER_NODES_PER_RING + node;
   fe_addr_map[ring] = vmm_tbl_register_map;
-  create_epics_params();
-  set_initial_epics_params();
+  createEpicsParams();
+  setInitialEpicsParams();
   pRMM->get_rmm_rings().set_topology(ring, node, "vmm-tbl");
-  pVMMConfig.enableHybrid(0, true);
+  pRMM->updateTopologyPvs(ring, node, "ac701");
+  for (int hyb = 0; hyb < number_hybrids; hyb++) {
+    pVMMConfig.enableHybrid(hyb, true);
+  }
 }
 
-void VMMTbl::config_FE() {
+void VMMTbl::configFE() {
   puts("config_FE");
 }
 
-void VMMTbl::set_initial_epics_params() {
+void VMMTbl::setInitialEpicsParams() {
   puts("set_initial_epics_params");
 }
 
-asynStatus VMMTbl::create_epics_params() {
+asynStatus VMMTbl::createEpicsParams() {
   pRMM->createParam(addr_list, "SEL_ANALOG_MONITOR_VMM0", asynParamInt32, &vmmSelectMonitorVMM0_);
   pRMM->createParam(addr_list, "SEL_ANALOG_MONITOR_VMM1", asynParamInt32, &vmmSelectMonitorVMM1_);
   pRMM->createParam(addr_list, "READ_ADC_VMMS", asynParamInt32, &vmmProcessReadMonitorVMMs_);
@@ -64,7 +68,7 @@ asynStatus VMMTbl::writeInt32(asynUser *pasynUser, epicsInt32 value) {
     // enable test_pulse (st) of Hybrid 0, VMM 0, channel 0 to test purpose
     // TODO: ADD PVs to enable/disable that
     pVMMConfig.getHybrid(0).getVMM(0).setRegister("st", 1, 0);
-    
+  
     if (value) pVMMConfig.acquire(true);
     else pVMMConfig.acquire(false);
   }
@@ -83,15 +87,16 @@ asynStatus VMMTbl::writeFloat64(asynUser *pasynUser, epicsFloat64 value) {
 
 
 extern "C" {
-  static void VMMTblConfig(const char *rmm_port_name, int ring, int node) {
+  static void VMMTblConfig(const char *rmm_port_name, int ring, int hybrids) {
+    int node = 0; // VMM use always only the Node 0
     RMM *pRMM;
     pRMM = (RMM *) findAsynPortDriver(rmm_port_name);
-    pRMM->frontends[ring][node] = std::make_shared<VMMTbl>(*pRMM, ring, node);
+    pRMM->frontends[ring][node] = std::make_shared<VMMTbl>(*pRMM, ring, node, hybrids);
   }
 
   static const iocshArg configArg0 = { "RMM Port name", iocshArgString};
   static const iocshArg configArg1 = { "Ring", iocshArgInt};
-  static const iocshArg configArg2 = { "Node", iocshArgInt};
+  static const iocshArg configArg2 = { "Hybrids", iocshArgInt};
 
 
   static const iocshArg * const configArgs[] = {&configArg0,
diff --git a/vmmTblApp/src/vmm_tbl.h b/vmmTblApp/src/vmm_tbl.h
index 5d92c5fa3dc46d34af2680dc43b15cf2aca4995a..727dfb71b4ff6b0365341eb887213894c4f63026 100644
--- a/vmmTblApp/src/vmm_tbl.h
+++ b/vmmTblApp/src/vmm_tbl.h
@@ -8,12 +8,12 @@
 /** Class definition for the VMMTbl class */
 class VMMTbl : public FrontEndBase {
 public:
-  VMMTbl(RMM& rmm, int ring, int node);
-  asynStatus create_epics_params();
+  VMMTbl(RMM& rmm, int ring, int node, int hybrids);
+  asynStatus createEpicsParams();
 	virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
   virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
-  void set_initial_epics_params();
-  void config_FE();
+  void setInitialEpicsParams();
+  void configFE();
 
 protected:
   int vmmSelectMonitorVMM0_;
@@ -27,4 +27,5 @@ private:
   FENConfigModule pVMMConfig;
   RMM *pRMM;
   int addr_list = 0;
+  int number_hybrids;
 };