diff --git a/FofbTool/__init__.py b/FofbTool/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/FofbTool/cli.py b/FofbTool/cli.py
new file mode 100755
index 0000000000000000000000000000000000000000..fbe95a69d3d30a2e9ab5c2349091bcd90893d4ac
--- /dev/null
+++ b/FofbTool/cli.py
@@ -0,0 +1,114 @@
+#!/usr/bin/env python
+###################################################################################################
+#   COMMAND LINE INTERFACE
+###################################################################################################
+#
+# This file gives the Command Line Interface for FofbTool
+#
+###################################################################################################
+
+if __name__ == '__main__':
+    import logging
+    import argparse
+
+    # Get the module logger
+    logger = logging.getLogger("FofbTool")
+
+    # Add a Stream handler to the module logger
+    sh=logging.StreamHandler()
+    sh.setLevel(logging.DEBUG)
+    sh.setFormatter(logging.Formatter("{levelname:8}: {message}", style='{'))
+    logger.addHandler(sh)
+
+    parser = argparse.ArgumentParser("FofbTool")
+    parser.add_argument("--log", default="info",
+            help="Log level (error, warning, info, debug)")
+    parser.add_argument("--init", action="store_true",
+            help="Run init on devices.")
+    parser.add_argument("--confDS", action="store_true",
+            help="Configure the Device servers, by applying attribute configuration.")
+    parser.add_argument("--stop", action="store_true",
+            )
+    parser.add_argument("--conf", action="store_true",
+            )
+    parser.add_argument("--start", action="store_true",
+            )
+    parser.add_argument("--disable-corr", action="store_true",
+            help="Disable cellnode corrector output frames."
+            )
+    parser.add_argument("--respmat", default=None,
+            help="Configure response matrix from file"
+            )
+    parser.add_argument("node", default="allnodes", nargs='*',
+            choices=('c01', 'c06', 'c09', 'c14', 'central', 'allcells', 'allnodes'),
+            help="Node to apply the selected actions. Default is all.")
+
+    args = parser.parse_args()
+
+    # Set log level from args
+    logger.setLevel(getattr(logging, args.log.upper()))
+    ####
+
+    logger.debug(args)
+
+
+    #### Node selection
+    nodes = []
+    if 'allnodes' in args.node:
+        nodes = cellnode_subscribers + [centralnode_subscriber,]
+    if 'allcells' in args.node:
+        nodes = nodes +  cellnode_subscribers
+    if 'central' in args.node:
+        nodes.append(centralnode_subscriber)
+    if 'c01' in args.node:
+        nodes.append(cellnode_subscribers[0])
+    if 'c06' in args.node:
+        nodes.append(cellnode_subscribers[1])
+    if 'c09' in args.node:
+        nodes.append(cellnode_subscribers[2])
+    if 'c14' in args.node:
+        nodes.append(cellnode_subscribers[3])
+
+    nodes = list(set(nodes))
+    logger.debug("Perform actions on {}".format(nodes))
+    ####
+
+    if args.init:
+        for cnp in nodes:
+            logger.info("Apply command init on {}".format(cnp.name()))
+            cnp.init()
+
+    if args.confDS:
+        for cnp in nodes:
+            set_attr_config(cnp)
+
+    if args.stop:
+        for cnp in cellnode_subscribers:
+            cellnode_stop_ccn(cnp)
+            cellnode_stop_combpm(cnp)
+        centralnode_stop_ccn(centralnode_subscriber)
+
+    if not args.respmat is None:
+        centralnode_configure_respmat(centralnode_subscriber, args.respmat)
+
+
+
+    if args.conf:
+        for cnp in cellnode_subscribers:
+            cellnode_configure_combpm(cnp)
+            cellnode_configure_comcorr(cnp, not args.disable_corr)
+            time.sleep(2)
+            cellnode_configure_ccn(cnp)
+        centralnode_configure_ccn(centralnode_subscriber)
+        centralnode_configure_corr(centralnode_subscriber)
+    elif args.disable_corr:
+        for cnp in cellnode_subscribers:
+            cellnode_configure_comcorr(cnp, not args.disable_corr)
+
+    if args.start:
+        for cnp in cellnode_subscribers:
+            cellnode_start_ccn(cnp)
+            cellnode_start_combpm(cnp)
+            cellnode_ack_ccn(cnp)
+        centralnode_start_ccn(centralnode_subscriber)
+
diff --git a/FofbTool.py b/FofbTool/dsconfig.py
similarity index 52%
rename from FofbTool.py
rename to FofbTool/dsconfig.py
index 4f11ca7b9d776bed304192af82949d872f3be9c0..2c1c34920b6d501da3ca88b3d663d65cf503e2fd 100755
--- a/FofbTool.py
+++ b/FofbTool/dsconfig.py
@@ -1,39 +1,30 @@
-#!/usr/bin/env python
-
-import tango
-import logging
-import argparse
-import numpy as np
-import time
-
-
 ###################################################################################################
-#    TANGO DEVICE PROXIES
+#    TANGO DB ATTRIBUTE CONFIG
+###################################################################################################
+#
+# This file contains crude functions to configure the attributes of the OPCUAProxy tango devices.
+#
 ###################################################################################################
 
-cellnode_subscribers = [ tango.DeviceProxy("ans/dg/fofb-cellnode-{}".format(cell)) for cell in ("C01", "C06", "C09", "C14") ]
-
-centralnode_subscriber = tango.DeviceProxy("ans/dg/fofb-centralnode")
 
-bpmmanager = tango.DeviceProxy("ans/dg/bpm-manager")
+import logging
 
-fofbcommand = tango.DeviceProxy("ans/dg/fofb-command")
 
-###################################################################################################
-#    LOGGER
-###################################################################################################
-# Install a BasicLogger
-logger = logging.getLogger("TestDev")
-sh=logging.StreamHandler()
-sh.setLevel(logging.DEBUG)
-sh.setFormatter(logging.Formatter("{levelname:8}: {message}", style='{'))
+# Get the module logger
+logger = logging.getLogger("FofbTool")
 
+def set_attr_config(cnp):
+    """
+    Convenient function that choose the proper configuration function.
+    Based on the tango path, select either cellnode or centralnode then call
+    set_attr_config_centralnode if 'central' is in the path or set_attr_config_cellnode.
 
-###################################################################################################
-#    TANGO DB ATTRIBUTE CONFIG
-###################################################################################################
+    PARAMETERS
+    ----------
+    cnp: tango.DeviceProxy
+        Device Proxy to the target device
+    """
 
-def set_attr_config(cnp):
     if "central" in cnp.name().lower():
         set_attr_config_centralnode(cnp)
     else:
@@ -41,8 +32,17 @@ def set_attr_config(cnp):
 
 
 def set_attr_config_cellnode(cnp):
+    """
+    Apply CellNode attribute configuration on the Tango Device cnp.
+    This does not check the kind of proxy passed. Expect exception if misuse.
 
-    logger.info("Apply attribute configuration on device {}".format(cnp.name()))
+    PARAMETERS
+    ----------
+    cnp: tango.DeviceProxy
+        Device Proxy to the target device
+    """
+
+    logger.info("Apply CellNode attribute configuration on device {}".format(cnp.name()))
 
     c = cnp.get_attribute_config("app_version")
     c.description = "FPGA firmware version\n" +c.description
@@ -234,8 +234,18 @@ def set_attr_config_cellnode(cnp):
     cnp.set_attribute_config(c)
 
 def set_attr_config_centralnode(cnp):
+    """
+    Apply Centralnode attribute configuration on the Tango Device cnp.
+    This does not check the kind of proxy passed. Expect exception if misuse.
+
+    PARAMETERS
+    ----------
+    cnp: tango.DeviceProxy
+        Device Proxy to the target device
+    """
 
-    logger.info("Apply attribute configuration on device {}".format(cnp.name()))
+
+    logger.info("Apply CentralNode attribute configuration on device {}".format(cnp.name()))
 
     c = cnp.get_attribute_config("app_version")
     c.description = "FPGA firmware version\n" +c.description
@@ -402,315 +412,3 @@ def set_attr_config_centralnode(cnp):
                 c.unit = ' '
                 cnp.set_attribute_config(c)
 
-
-
-###################################################################################################
-#    OPERATION FUNCTIONS
-###################################################################################################
-
-def cellnode_stop_ccn(cnp):
-    logger.info("Stopping CCN on {}".format(cnp.name()))
-    cnp["ccnpack0_control"] = False
-    cnp["ccnunpack0_control"] = False
-
-def cellnode_start_ccn(cnp):
-    logger.info("Starting CCN on {}".format(cnp.name()))
-    cnp["ccneth0_reset"] = 0x60000001 # impossible to write 0xE0000001
-    cnp["ccneth0_gt_reset"] = 1
-    cnp["ccneth0_gt_reset"] = 0
-    cnp["ccneth0_reset"] = 0
-    cnp["ccnpack0_control"] = True
-    cnp["ccnunpack0_control"] = True
-
-def cellnode_ack_ccn(snp):
-    logger.info("Ack CCN error on {}".format(cnp.name()))
-    cnp["ccnpack0_reset_error"] = True
-    cnp["ccnunpack0_reset_error"] = True
-    cnp["ccnpack0_reset_error"] = False
-    cnp["ccnunpack0_reset_error"] = False
-
-def centralnode_stop_ccn(cnp):
-    logger.info("Stopping CCN on {}".format(cnp.name()))
-    for n in range(4):
-        cnp["ccnpack{}_control".format(n)] = False
-        cnp["ccnunpack{}_control".format(n)] = False
-
-def centralnode_start_ccn(cnp):
-    logger.info("Starting CCN on {}".format(cnp.name()))
-    for n in range(4):
-        cnp["ccneth{}_reset".format(n)] = 0x60000001 # impossible to write 0xE0000001
-        cnp["ccneth{}_gt_reset".format(n)] = 1
-        cnp["ccneth{}_gt_reset".format(n)] = 0
-        cnp["ccneth{}_reset".format(n)] = 0
-        cnp["ccnpack{}_control".format(n)] = True
-        cnp["ccnunpack{}_control".format(n)] = True
-        cnp["ccnpack{}_reset_error".format(n)] = True
-        cnp["ccnunpack{}_reset_error".format(n)] = True
-        cnp["ccnpack{}_reset_error".format(n)] = False
-        cnp["ccnunpack{}_reset_error".format(n)] = False
-
-def cellnode_configure_ccn(cnp, nbpm=None, npsc=100):
-    """
-    Configure the ComCellNode block.
-
-    PARAMETERS
-    ----------
-    nbpm:
-        Number of BPM allowed by the filter, hence the number of expected BPM packets.
-        If None, auto detect the number from the combpm_filter_table attribute.
-    npsc:
-        Number of total PSC, hence the number of expected PSC packets.
-
-    """
-
-    if nbpm is None:
-        # Get number of BPM activated in the filter
-        nbpm = int((cnp["combpm_filter_table"].value == 0x80).sum())
-        logger.debug("{} bpm allowed in the filter on {}".format(nbpm, cnp.name()))
-
-    maclen = 10*nbpm+10
-    logger.debug("Configure packeter framesize (mac length) to {}".format(maclen))
-    cnp["ccnpack0_framesize"] = maclen
-
-    logger.debug("Configure packeter npackets to {}".format(nbpm-1))
-    cnp["ccnpack0_npackets"] = nbpm-1
-
-    maclen = npsc*6+10
-    logger.debug("Configure unpacketer framesize (mac length) to {}".format(maclen))
-    cnp["ccnunpack0_framesize"] = maclen
-
-    logger.info("Configuration of CCN done on {}.".format(cnp.name()))
-
-def centralnode_configure_ccn(cnp, nbpm=[30,30,30,32], npsc=100):
-    """
-    Configure the ComCellNode block.
-
-    PARAMETERS
-    ----------
-    nbpm: list(int)
-        Number of BPM packet received on each interface.
-    npsc:
-        Number of total PSC, hence the number of expected PSC packets.
-
-    """
-
-    for n in range(4):
-
-        maclen = npsc*6+10
-        logger.debug("Configure packeter {} framesize (mac length) to {}".format(n, maclen))
-        cnp["ccnpack{}_framesize".format(n)] = maclen
-
-        logger.debug("Configure packeter {}  npackets to {}".format(n, npsc-1))
-        cnp["ccnpack{}_npackets".format(n)] = npsc-1
-
-        maclen = 10*nbpm[n]+10
-        logger.debug("Configure unpacketer {} framesize (mac length) to {}".format(n, maclen))
-        cnp["ccnunpack{}_framesize".format(n)] = maclen
-
-    logger.info("Configuration of CCN done on {}.".format(cnp.name()))
-
-
-def cellnode_stop_combpm(cnp):
-    logger.info("Stopping ComBpm on {}".format(cnp.name()))
-    cnp["combpm_reset"] = 1
-    cnp["combpm_gt_control"] = 0x5
-
-def cellnode_start_combpm(cnp):
-    logger.info("Starting ComBpm on {}".format(cnp.name()))
-    cnp["combpm_reset"] = 0
-    cnp["combpm_gt_control"] = 0x1
-    cnp["combpm_reset_error"] = True
-    cnp["combpm_reset_error"] = False
-
-def cellnode_configure_combpm(cnp):
-
-    # Filter list depends on the cellnode
-    filterlist = {
-            "C01":np.array(list(range(1,23))+list(range(115,123))),
-            "C06":np.array(range(23,53)),
-            "C09":np.array(range(53,83)),
-            "C14":np.array(range(83,115)),
-            }
-
-    for k in filterlist.keys():
-        if k in cnp.name():
-            logger.debug("Activate BPMs {} in the filter for {}".format(filterlist[k], cnp.name()))
-            f = cnp["combpm_filter_table"].value
-            f[:] = 0
-            f[np.array(filterlist[k])] = 0x80
-            cnp["combpm_filter_table"] = f
-
-    logger.info("Configuration of ComBpm done on {}.".format(cnp.name()))
-
-def cellnode_configure_comcorr(cnp, enable=True):
-
-    pscidlist = {
-        'C01':[50,100,49,99,255,255,255,255,2,52,1,51,255,255,255,255,56,6,3,53,4,54,5,55,10,60,7,57,8,58,9,59],
-        'C06':[12,62,11,61,255,255,255,255,14,64,13,63,255,255,255,255,68,18,15,65,16,66,17,67,22,72,19,69,20,70,21,71],
-        'C09':[24,74,23,73,255,255,255,255,26,76,25,75,255,255,255,255,80,30,27,77,28,78,29,79,34,84,31,81,32,82,33,83],
-        'C14':[36,86,35,85,37,87,38,88,40,90,39,89,255,255,255,255,94,44,41,91,42,92,43,93,48,98,45,95,46,96,47,97]
-        }
-
-    for k in pscidlist.keys():
-        if k in cnp.name():
-            logger.debug("Set PSCIDs {} in the filter for {}".format(pscidlist[k], cnp.name()))
-            f= cnp["comcorr_line_id"].value
-            f[:] = pscidlist[k]
-            f[:] = f+ 0x10000*bool(enable)
-            logger.debug("Set comcorr_line_id {} for {}".format(f, cnp.name()))
-            cnp["comcorr_line_id"] = f
-
-    logger.info("Configuration of ComCorr done on {}.".format(cnp.name()))
-
-def centralnode_configure_corr(cnp):
-
-    # Legacy
-    cnp["corr_k1a_x"]=256
-    cnp["corr_k1b_x"]=0
-    cnp["corr_k1ic_x"]=64
-    cnp["corr_k1d_x"]=16300
-
-    cnp["corr_k1a_y"]=256
-    cnp["corr_k1b_y"]=0
-    cnp["corr_k1ic_y"]=64
-    cnp["corr_k1d_y"]=16300
-
-    # Unitary
-    cnp["corr_k2a_x"]=128
-    cnp["corr_k2b_x"]=0
-    cnp["corr_k2ic_x"]=8192
-    cnp["corr_k2d_x"]=0
-
-    cnp["corr_k2a_y"]=128
-    cnp["corr_k2b_y"]=0
-    cnp["corr_k2ic_y"]=8192
-    cnp["corr_k2d_y"]=0
-
-    f= cnp["corr_pscid"].value
-    f[0:100] = range(1,101)
-    cnp["corr_pscid"] = f
-
-    logger.info("Configuration of Corr done on {}.".format(cnp.name()))
-
-def fofbcommand_writeref(what='current'):
-    if what=="current":
-        fofbcommand["x_ref_orbit"] = (bpmmanager.xmeanorbit*1e6).astype(int)
-        fofbcommand["y_ref_orbit"] = (bpmmanager.zmeanorbit*1e6).astype(int)
-
-    if what=="oldref":
-        fofbcommand["x_ref_orbit"] = (bpmmanager.xreforbit*1e6).astype(int)
-        fofbcommand["y_ref_orbit"] = (bpmmanager.zreforbit*1e6).astype(int)
-
-    if what=="zeros":
-        fofbcommand["x_ref_orbit"] = np.zeros(122, dtype=int)
-        fofbcommand["y_ref_orbit"] = np.zeros(122, dtype=int)
-
-def fofbcommand_writemat(filename='respmat.npy'):
-
-    fofbcommand["x_inv_resp_mat"] = np.hstack([np.zeros((50, 1)), np.load(filename)[50:], np.zeros((50,5))]).astype(int)
-    fofbcommand["y_inv_resp_mat"] = np.hstack([np.zeros((50, 1)), np.load(filename)[:50], np.zeros((50,5))]).astype(int)
-
-###################################################################################################
-#
-###################################################################################################
-
-if __name__ == '__main__':
-
-    parser = argparse.ArgumentParser("FofbTool")
-    parser.add_argument("--log", default="info",
-            help="Log level (error, warning, info, debug)")
-    parser.add_argument("--init", action="store_true",
-            help="Run init devices.")
-    parser.add_argument("--confDS", action="store_true",
-            help="Configure the Device servers, by applying attribute configuration.")
-    parser.add_argument("--stop", action="store_true",
-            )
-    parser.add_argument("--conf", action="store_true",
-            )
-    parser.add_argument("--start", action="store_true",
-            )
-    parser.add_argument("--disable-corr", action="store_true",
-            help="Disable cellnode corrector output frames."
-            )
-    parser.add_argument("--respmat", default=None,
-            help="Configure response matrix from file"
-            )
-    parser.add_argument("node", default="allnodes", nargs='*',
-            choices=('c01', 'c06', 'c09', 'c14', 'central', 'allcells', 'allnodes'),
-            help="Node to apply the selected actions. Default is all.")
-
-    args = parser.parse_args()
-
-    #### Install logger
-    # Remove handler previously attached
-    for hdlr in logger.handlers:
-        logger.removeHandler(hdlr)
-    # Attach this handler
-    logger.addHandler(sh)
-    # Set log level from args
-    logger.setLevel(getattr(logging, args.log.upper()))
-    ####
-
-    logger.debug(args)
-
-
-    #### Node selection
-    nodes = []
-    if 'allnodes' in args.node:
-        nodes = cellnode_subscribers + [centralnode_subscriber,]
-    if 'allcells' in args.node:
-        nodes = nodes +  cellnode_subscribers
-    if 'central' in args.node:
-        nodes.append(centralnode_subscriber)
-    if 'c01' in args.node:
-        nodes.append(cellnode_subscribers[0])
-    if 'c06' in args.node:
-        nodes.append(cellnode_subscribers[1])
-    if 'c09' in args.node:
-        nodes.append(cellnode_subscribers[2])
-    if 'c14' in args.node:
-        nodes.append(cellnode_subscribers[3])
-
-    nodes = list(set(nodes))
-    logger.debug("Perform actions on {}".format(nodes))
-    ####
-
-    if args.init:
-        for cnp in nodes:
-            logger.info("Apply command init on {}".format(cnp.name()))
-            cnp.init()
-
-    if args.confDS:
-        for cnp in nodes:
-            set_attr_config(cnp)
-
-    if args.stop:
-        for cnp in cellnode_subscribers:
-            cellnode_stop_ccn(cnp)
-            cellnode_stop_combpm(cnp)
-        centralnode_stop_ccn(centralnode_subscriber)
-
-    if not args.respmat is None:
-        centralnode_configure_respmat(centralnode_subscriber, args.respmat)
-
-
-
-    if args.conf:
-        for cnp in cellnode_subscribers:
-            cellnode_configure_combpm(cnp)
-            cellnode_configure_comcorr(cnp, not args.disable_corr)
-            time.sleep(2)
-            cellnode_configure_ccn(cnp)
-        centralnode_configure_ccn(centralnode_subscriber)
-        centralnode_configure_corr(centralnode_subscriber)
-    elif args.disable_corr:
-        for cnp in cellnode_subscribers:
-            cellnode_configure_comcorr(cnp, not args.disable_corr)
-
-    if args.start:
-        for cnp in cellnode_subscribers:
-            cellnode_start_ccn(cnp)
-            cellnode_start_combpm(cnp)
-            cellnode_ack_ccn(cnp)
-        centralnode_start_ccn(centralnode_subscriber)
-
diff --git a/FofbTool/operation.py b/FofbTool/operation.py
new file mode 100755
index 0000000000000000000000000000000000000000..359d5f508ac02e03290f1c46281c6af423f842f4
--- /dev/null
+++ b/FofbTool/operation.py
@@ -0,0 +1,230 @@
+#!/usr/bin/env python
+
+import tango
+import logging
+import argparse
+import numpy as np
+import time
+
+
+# Get the module logger
+logger = logging.getLogger("FofbTool")
+
+###################################################################################################
+#    TANGO DEVICE PROXIES
+###################################################################################################
+
+cellnode_subscribers = [ tango.DeviceProxy("ans/dg/fofb-cellnode-{}".format(cell)) for cell in ("C01", "C06", "C09", "C14") ]
+
+centralnode_subscriber = tango.DeviceProxy("ans/dg/fofb-centralnode")
+
+bpmmanager = tango.DeviceProxy("ans/dg/bpm-manager")
+
+fofbcommand = tango.DeviceProxy("ans/dg/fofb-command")
+
+
+###################################################################################################
+#    OPERATION FUNCTIONS
+###################################################################################################
+
+def cellnode_stop_ccn(cnp):
+    logger.info("Stopping CCN on {}".format(cnp.name()))
+    cnp["ccnpack0_control"] = False
+    cnp["ccnunpack0_control"] = False
+
+def cellnode_start_ccn(cnp):
+    logger.info("Starting CCN on {}".format(cnp.name()))
+    cnp["ccneth0_reset"] = 0x60000001 # impossible to write 0xE0000001
+    cnp["ccneth0_gt_reset"] = 1
+    cnp["ccneth0_gt_reset"] = 0
+    cnp["ccneth0_reset"] = 0
+    cnp["ccnpack0_control"] = True
+    cnp["ccnunpack0_control"] = True
+
+def cellnode_ack_ccn(snp):
+    logger.info("Ack CCN error on {}".format(cnp.name()))
+    cnp["ccnpack0_reset_error"] = True
+    cnp["ccnunpack0_reset_error"] = True
+    cnp["ccnpack0_reset_error"] = False
+    cnp["ccnunpack0_reset_error"] = False
+
+def centralnode_stop_ccn(cnp):
+    logger.info("Stopping CCN on {}".format(cnp.name()))
+    for n in range(4):
+        cnp["ccnpack{}_control".format(n)] = False
+        cnp["ccnunpack{}_control".format(n)] = False
+
+def centralnode_start_ccn(cnp):
+    logger.info("Starting CCN on {}".format(cnp.name()))
+    for n in range(4):
+        cnp["ccneth{}_reset".format(n)] = 0x60000001 # impossible to write 0xE0000001
+        cnp["ccneth{}_gt_reset".format(n)] = 1
+        cnp["ccneth{}_gt_reset".format(n)] = 0
+        cnp["ccneth{}_reset".format(n)] = 0
+        cnp["ccnpack{}_control".format(n)] = True
+        cnp["ccnunpack{}_control".format(n)] = True
+        cnp["ccnpack{}_reset_error".format(n)] = True
+        cnp["ccnunpack{}_reset_error".format(n)] = True
+        cnp["ccnpack{}_reset_error".format(n)] = False
+        cnp["ccnunpack{}_reset_error".format(n)] = False
+
+def cellnode_configure_ccn(cnp, nbpm=None, npsc=100):
+    """
+    Configure the ComCellNode block.
+
+    PARAMETERS
+    ----------
+    nbpm:
+        Number of BPM allowed by the filter, hence the number of expected BPM packets.
+        If None, auto detect the number from the combpm_filter_table attribute.
+    npsc:
+        Number of total PSC, hence the number of expected PSC packets.
+
+    """
+
+    if nbpm is None:
+        # Get number of BPM activated in the filter
+        nbpm = int((cnp["combpm_filter_table"].value == 0x80).sum())
+        logger.debug("{} bpm allowed in the filter on {}".format(nbpm, cnp.name()))
+
+    maclen = 10*nbpm+10
+    logger.debug("Configure packeter framesize (mac length) to {}".format(maclen))
+    cnp["ccnpack0_framesize"] = maclen
+
+    logger.debug("Configure packeter npackets to {}".format(nbpm-1))
+    cnp["ccnpack0_npackets"] = nbpm-1
+
+    maclen = npsc*6+10
+    logger.debug("Configure unpacketer framesize (mac length) to {}".format(maclen))
+    cnp["ccnunpack0_framesize"] = maclen
+
+    logger.info("Configuration of CCN done on {}.".format(cnp.name()))
+
+def centralnode_configure_ccn(cnp, nbpm=[30,30,30,32], npsc=100):
+    """
+    Configure the ComCellNode block.
+
+    PARAMETERS
+    ----------
+    nbpm: list(int)
+        Number of BPM packet received on each interface.
+    npsc:
+        Number of total PSC, hence the number of expected PSC packets.
+
+    """
+
+    for n in range(4):
+
+        maclen = npsc*6+10
+        logger.debug("Configure packeter {} framesize (mac length) to {}".format(n, maclen))
+        cnp["ccnpack{}_framesize".format(n)] = maclen
+
+        logger.debug("Configure packeter {}  npackets to {}".format(n, npsc-1))
+        cnp["ccnpack{}_npackets".format(n)] = npsc-1
+
+        maclen = 10*nbpm[n]+10
+        logger.debug("Configure unpacketer {} framesize (mac length) to {}".format(n, maclen))
+        cnp["ccnunpack{}_framesize".format(n)] = maclen
+
+    logger.info("Configuration of CCN done on {}.".format(cnp.name()))
+
+
+def cellnode_stop_combpm(cnp):
+    logger.info("Stopping ComBpm on {}".format(cnp.name()))
+    cnp["combpm_reset"] = 1
+    cnp["combpm_gt_control"] = 0x5
+
+def cellnode_start_combpm(cnp):
+    logger.info("Starting ComBpm on {}".format(cnp.name()))
+    cnp["combpm_reset"] = 0
+    cnp["combpm_gt_control"] = 0x1
+    cnp["combpm_reset_error"] = True
+    cnp["combpm_reset_error"] = False
+
+def cellnode_configure_combpm(cnp):
+
+    # Filter list depends on the cellnode
+    filterlist = {
+            "C01":np.array(list(range(1,23))+list(range(115,123))),
+            "C06":np.array(range(23,53)),
+            "C09":np.array(range(53,83)),
+            "C14":np.array(range(83,115)),
+            }
+
+    for k in filterlist.keys():
+        if k in cnp.name():
+            logger.debug("Activate BPMs {} in the filter for {}".format(filterlist[k], cnp.name()))
+            f = cnp["combpm_filter_table"].value
+            f[:] = 0
+            f[np.array(filterlist[k])] = 0x80
+            cnp["combpm_filter_table"] = f
+
+    logger.info("Configuration of ComBpm done on {}.".format(cnp.name()))
+
+def cellnode_configure_comcorr(cnp, enable=True):
+
+    pscidlist = {
+        'C01':[50,100,49,99,255,255,255,255,2,52,1,51,255,255,255,255,56,6,3,53,4,54,5,55,10,60,7,57,8,58,9,59],
+        'C06':[12,62,11,61,255,255,255,255,14,64,13,63,255,255,255,255,68,18,15,65,16,66,17,67,22,72,19,69,20,70,21,71],
+        'C09':[24,74,23,73,255,255,255,255,26,76,25,75,255,255,255,255,80,30,27,77,28,78,29,79,34,84,31,81,32,82,33,83],
+        'C14':[36,86,35,85,37,87,38,88,40,90,39,89,255,255,255,255,94,44,41,91,42,92,43,93,48,98,45,95,46,96,47,97]
+        }
+
+    for k in pscidlist.keys():
+        if k in cnp.name():
+            logger.debug("Set PSCIDs {} in the filter for {}".format(pscidlist[k], cnp.name()))
+            f= cnp["comcorr_line_id"].value
+            f[:] = pscidlist[k]
+            f[:] = f+ 0x10000*bool(enable)
+            logger.debug("Set comcorr_line_id {} for {}".format(f, cnp.name()))
+            cnp["comcorr_line_id"] = f
+
+    logger.info("Configuration of ComCorr done on {}.".format(cnp.name()))
+
+def centralnode_configure_corr(cnp):
+
+    # Legacy
+    cnp["corr_k1a_x"]=256
+    cnp["corr_k1b_x"]=0
+    cnp["corr_k1ic_x"]=64
+    cnp["corr_k1d_x"]=16300
+
+    cnp["corr_k1a_y"]=256
+    cnp["corr_k1b_y"]=0
+    cnp["corr_k1ic_y"]=64
+    cnp["corr_k1d_y"]=16300
+
+    # Unitary
+    cnp["corr_k2a_x"]=128
+    cnp["corr_k2b_x"]=0
+    cnp["corr_k2ic_x"]=8192
+    cnp["corr_k2d_x"]=0
+
+    cnp["corr_k2a_y"]=128
+    cnp["corr_k2b_y"]=0
+    cnp["corr_k2ic_y"]=8192
+    cnp["corr_k2d_y"]=0
+
+    f= cnp["corr_pscid"].value
+    f[0:100] = range(1,101)
+    cnp["corr_pscid"] = f
+
+    logger.info("Configuration of Corr done on {}.".format(cnp.name()))
+
+def fofbcommand_writeref(what='current'):
+    if what=="current":
+        fofbcommand["x_ref_orbit"] = (bpmmanager.xmeanorbit*1e6).astype(int)
+        fofbcommand["y_ref_orbit"] = (bpmmanager.zmeanorbit*1e6).astype(int)
+
+    if what=="oldref":
+        fofbcommand["x_ref_orbit"] = (bpmmanager.xreforbit*1e6).astype(int)
+        fofbcommand["y_ref_orbit"] = (bpmmanager.zreforbit*1e6).astype(int)
+
+    if what=="zeros":
+        fofbcommand["x_ref_orbit"] = np.zeros(122, dtype=int)
+        fofbcommand["y_ref_orbit"] = np.zeros(122, dtype=int)
+
+def fofbcommand_writemat(filename='respmat.npy'):
+
+    fofbcommand["x_inv_resp_mat"] = np.hstack([np.zeros((50, 1)), np.load(filename)[50:], np.zeros((50,5))]).astype(int)
+    fofbcommand["y_inv_resp_mat"] = np.hstack([np.zeros((50, 1)), np.load(filename)[:50], np.zeros((50,5))]).astype(int)