diff --git a/omec/omec-user-plane/Chart.yaml b/omec/omec-user-plane/Chart.yaml
index 04b0b65..e54b051 100644
--- a/omec/omec-user-plane/Chart.yaml
+++ b/omec/omec-user-plane/Chart.yaml
@@ -17,4 +17,4 @@
 name: omec-user-plane
 icon: https://guide.opencord.org/logos/cord.svg
 
-version: 0.1.2
+version: 0.1.3
diff --git a/omec/omec-user-plane/files/__init__.py b/omec/omec-user-plane/files/__init__.py
deleted file mode 100644
index b3c75bf..0000000
--- a/omec/omec-user-plane/files/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env python
-# SPDX-License-Identifier: Apache-2.0
-# Copyright(c) 2019 Intel Corporation
diff --git a/omec/omec-user-plane/files/route_control.py b/omec/omec-user-plane/files/route_control.py
deleted file mode 100755
index 1d9a169..0000000
--- a/omec/omec-user-plane/files/route_control.py
+++ /dev/null
@@ -1,520 +0,0 @@
-#!/usr/bin/env python
-# SPDX-License-Identifier: Apache-2.0
-# Copyright(c) 2019 Intel Corporation
-
-import argparse
-import signal
-import sys
-import time
-
-# for retrieving neighbor info
-from pyroute2 import IPDB, IPRoute
-
-from scapy.all import *
-
-try:
-    from pybess.bess import *
-except ImportError:
-    print('Cannot import the API module (pybess)')
-    raise
-
-MAX_RETRIES = 5
-SLEEP_S = 2
-
-
-class NeighborEntry:
-    def __init__(self):
-        self.neighbor_ip = None
-        self.iface = None
-        self.iprange = None
-        self.prefix_len = None
-        self.route_count = 0
-        self.gate_idx = 0
-        self.macstr = None
-
-    def __str__(self):
-        return ('{neigh: %s, iface: %s, ip-range: %s/%s}' %
-                (self.neighbor_ip, self.iface, self.iprange, self.prefix_len))
-
-
-def mac2hex(mac):
-    return int(mac.replace(':', ''), 16)
-
-
-def send_ping(neighbor_ip):
-    send(IP(dst=neighbor_ip) / ICMP())
-
-
-def send_arp(neighbor_ip, src_mac, iface):
-    pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=neighbor_ip, hwsrc=src_mac)
-    pkt.show()
-    hexdump(pkt)
-    sendp(pkt, iface=iface)
-
-
-def fetch_mac(dip):
-    ip = ''
-    _mac = ''
-    neighbors = ipr.get_neighbours(dst=dip)
-    for i in range(len(neighbors)):
-        for att in neighbors[i]['attrs']:
-            if 'NDA_DST' in att and dip == att[1]:
-                # ('NDA_DST', dip)
-                ip = att[1]
-            if 'NDA_LLADDR' in att:
-                # ('NDA_LLADDR', _mac)
-                _mac = att[1]
-                return _mac
-
-
-def link_modules(server, module, next_module, ogate=0, igate=0):
-    print('Linking {} module'.format(next_module))
-
-    # Pause bess first
-    bess.pause_all()
-    # Connect module to next_module
-    for _ in range(MAX_RETRIES):
-        try:
-            server.connect_modules(module, next_module, ogate, igate)
-        except BESS.Error as e:
-            bess.resume_all()
-            if e.code == errno.EBUSY:
-                break
-            else:
-                return  #raise
-        except Exception as e:
-            print(
-                'Error connecting module {}:{}->{}:{}: {}. Retrying in {} secs...'
-                .format(module, ogate, igate, next_module, e, SLEEP_S))
-            time.sleep(SLEEP_S)
-        else:
-            bess.resume_all()
-            break
-    else:
-        bess.resume_all()
-        print('BESS module connection ({}:{}->{}:{}) failure.'.format(
-            module, ogate, igate, next_module))
-        return
-        #raise Exception('BESS module connection ({}:{}->{}:{}) failure.'.
-        #                format(module, ogate, igate, next_module))
-
-
-def link_route_module(server, gateway_mac, item):
-    iprange = item.iprange
-    prefix_len = item.prefix_len
-    route_module = item.iface + 'Routes'
-    last_module = item.iface + 'Merge'
-    gateway_mac_str = '{:X}'.format(gateway_mac)
-    print('Adding route entry {}/{} for {}'.format(iprange, prefix_len,
-                                                   route_module))
-
-    print('Trying to retrieve neighbor entry {} from neighbor cache'.format(
-        item.neighbor_ip))
-    neighbor_exists = neighborcache.get(item.neighbor_ip)
-
-    # How many gates does this module have?
-    # If entry does not exist, then initialize it
-    if not modgatecnt.get(route_module):
-        modgatecnt[route_module] = 0
-
-    # Compute likely index
-    if neighbor_exists:
-        # No need to create a new Update module
-        gate_idx = neighbor_exists.gate_idx
-    else:
-        # Need to create a new Update module,
-        # so get gate_idx from gate count
-        gate_idx = modgatecnt[route_module]
-
-    # Pause bess first
-    bess.pause_all()
-    # Pass routing entry to bessd's route module
-    for _ in range(MAX_RETRIES):
-        try:
-            server.run_module_command(route_module, 'add',
-                                      'IPLookupCommandAddArg', {
-                                          'prefix': iprange,
-                                          'prefix_len': int(prefix_len),
-                                          'gate': gate_idx
-                                      })
-        except:
-            print('Error adding route entry {}/{} in {}. Retrying in {}sec...'.
-                  format(iprange, prefix_len, route_module, SLEEP_S))
-            time.sleep(SLEEP_S)
-        else:
-            bess.resume_all()
-            break
-    else:
-        bess.resume_all()
-        print('BESS route entry ({}/{}) insertion failure in module {}'.format(
-            iprange, prefix_len, route_module))
-        return
-        #raise Exception('BESS route entry ({}/{}) insertion failure in module {}'.
-        #                format(iprange, prefix_len, route_module))
-
-    if not neighbor_exists:
-        print('Neighbor does not exist')
-        # Create Update module
-        update_module = route_module + 'DstMAC' + gateway_mac_str
-
-        # Pause bess first
-        bess.pause_all()
-        for _ in range(MAX_RETRIES):
-            try:
-                server.create_module('Update', update_module, {
-                    'fields': [{
-                        'offset': 0,
-                        'size': 6,
-                        'value': gateway_mac
-                    }]
-                })
-            except BESS.Error as e:
-                bess.resume_all()
-                if e.code == errno.EEXIST:
-                    break
-                else:
-                    return  #raise
-            except Exception as e:
-                print(
-                    'Error creating update module {}: {}. Retrying in {} secs...'
-                    .format(update_module, e, SLEEP_S))
-                time.sleep(SLEEP_S)
-            else:
-                bess.resume_all()
-                break
-        else:
-            bess.resume_all()
-            print('BESS module {} creation failure.'.format(update_module))
-            return  #raise Exception('BESS module {} creation failure.'.
-            #        format(update_module))
-
-        print('Update module created')
-
-        # Connect Update module to route module
-        link_modules(server, route_module, update_module, gate_idx, 0)
-
-        # Connect Update module to dpdk_out module
-        link_modules(server, update_module, last_module, 0, 0)
-
-        # Add a new neighbor in neighbor cache
-        neighborcache[item.neighbor_ip] = item
-
-        # Add a record of the affliated gate id
-        item.gate_idx = gate_idx
-
-        # Set the mac str
-        item.macstr = gateway_mac_str
-
-        # Increment global gate count number
-        modgatecnt[route_module] += 1
-
-        neighbor_exists = item
-
-    else:
-        print('Neighbor already exists')
-
-    # Finally increment route count
-    neighborcache[item.neighbor_ip].route_count += 1
-
-
-def del_route_entry(server, item):
-    iprange = item.iprange
-    prefix_len = item.prefix_len
-    route_module = item.iface + 'Routes'
-    last_module = item.iface + 'Merge'
-
-    neighbor_exists = neighborcache.get(item.neighbor_ip)
-    if neighbor_exists:
-        # Pause bess first
-        bess.pause_all()
-        # Delete routing entry from bessd's route module
-        for i in range(MAX_RETRIES):
-            try:
-                server.run_module_command(route_module, 'delete',
-                                          'IPLookupCommandDeleteArg', {
-                                              'prefix': iprange,
-                                              'prefix_len': int(prefix_len)
-                                          })
-            except:
-                print(
-                    'Error while deleting route entry for {}. Retrying in {} sec...'
-                    .format(route_module, SLEEP_S))
-                time.sleep(SLEEP_S)
-            else:
-                bess.resume_all()
-                break
-        else:
-            bess.resume_all()
-            print('Route entry deletion failure.')
-            return
-            #raise Exception('Route entry deletion failure.')
-
-        print('Route entry {}/{} deleted from {}'.format(
-            iprange, prefix_len, route_module))
-
-        # Decrementing route count for the registered neighbor
-        neighbor_exists.route_count -= 1
-
-        # If route count is 0, then delete the whole module
-        if neighbor_exists.route_count == 0:
-            update_module = route_module + 'DstMAC' + neighbor_exists.macstr
-            # Pause bess first
-            bess.pause_all()
-            for i in range(MAX_RETRIES):
-                try:
-                    server.destroy_module(update_module)
-                except:
-                    print('Error destroying module {}. Retrying in {}sec...'.
-                          format(update_module, SLEEP_S))
-                    time.sleep(SLEEP_S)
-                else:
-                    bess.resume_all()
-                    break
-            else:
-                bess.resume_all()
-                print('Module {} deletion failure.'.format(update_module))
-                return
-                #raise Exception('Module {} deletion failure.'.
-                #                format(update_module))
-
-            print('Module {} destroyed'.format(update_module))
-
-            # Delete entry from the neighbor cache
-            del neighborcache[item.neighbor_ip]
-            print('Deleting item from neighborcache')
-            del neighbor_exists
-        else:
-            print('Route count for {}  decremented to {}'.format(
-                item.neighbor_ip, neighbor_exists.route_count))
-            neighborcache[item.neighbor_ip] = neighbor_exists
-    else:
-        print('Neighbor {} does not exist'.format(item.neighbor_ip))
-
-
-def probe_addr(item, src_mac):
-    # Store entry if entry does not exist in ARP cache
-    arpcache[item.neighbor_ip] = item
-    print('Adding entry {} in arp probe table'.format(item))
-
-    # Probe ARP request by sending ping
-    send_ping(item.neighbor_ip)
-
-    # Probe ARP request
-    ##send_arp(neighbor_ip, src_mac, item.iface)
-
-
-def parse_new_route(msg):
-    item = NeighborEntry()
-    # Fetch prefix_len
-    item.prefix_len = msg['dst_len']
-    # Default route
-    if item.prefix_len is 0:
-        item.iprange = '0.0.0.0'
-
-    for att in msg['attrs']:
-        if 'RTA_DST' in att:
-            # Fetch IP range
-            # ('RTA_DST', iprange)
-            item.iprange = att[1]
-        if 'RTA_GATEWAY' in att:
-            # Fetch gateway MAC address
-            # ('RTA_GATEWAY', neighbor_ip)
-            item.neighbor_ip = att[1]
-            _mac = fetch_mac(att[1])
-            if not _mac:
-                gateway_mac = 0
-            else:
-                gateway_mac = mac2hex(_mac)
-        if 'RTA_OIF' in att:
-            # Fetch interface name
-            # ('RTA_OIF', iface)
-            item.iface = ipdb.interfaces[int(att[1])].ifname
-
-    if not item.iface in args.i or not item.iprange or not item.neighbor_ip:
-        # Neighbor info is invalid
-        del item
-        return
-
-    # if mac is 0, send ARP request
-    if gateway_mac == 0:
-        print('Adding entry {} in arp probe table'.format(item.iface))
-        probe_addr(item, ipdb.interfaces[item.iface].address)
-
-    else:  # if gateway_mac is set
-        print('Linking module {}Routes with {}Merge (Dest MAC: {})'.format(
-            item.iface, item.iface, _mac))
-
-        link_route_module(bess, gateway_mac, item)
-
-
-def parse_new_neighbor(msg):
-    for att in msg['attrs']:
-        if 'NDA_DST' in att:
-            # ('NDA_DST', neighbor_ip)
-            neighbor_ip = att[1]
-        if 'NDA_LLADDR' in att:
-            # ('NDA_LLADDR', neighbor_mac)
-            gateway_mac = att[1]
-
-    item = arpcache.get(neighbor_ip)
-    if item:
-        print('Linking module {}Routes with {}Merge (Dest MAC: {})'.format(
-            item.iface, item.iface, gateway_mac))
-
-        # Add route entry, and add item in the registered neighbor cache
-        link_route_module(bess, mac2hex(gateway_mac), item)
-
-        # Remove entry from unresolved arp cache
-        del arpcache[neighbor_ip]
-
-
-def parse_del_route(msg):
-    item = NeighborEntry()
-    for att in msg['attrs']:
-        if 'RTA_DST' in att:
-            # Fetch IP range
-            # ('RTA_DST', iprange)
-            item.iprange = att[1]
-        if 'RTA_GATEWAY' in att:
-            # Fetch gateway MAC address
-            # ('RTA_GATEWAY', neighbor_ip)
-            item.neighbor_ip = att[1]
-        if 'RTA_OIF' in att:
-            # Fetch interface name
-            # ('RTA_OIF', iface)
-            item.iface = ipdb.interfaces[int(att[1])].ifname
-
-    if not item.iface in args.i or not item.iprange or not item.neighbor_ip:
-        # Neighbor info is invalid
-        del item
-        return
-
-    # Fetch prefix_len
-    item.prefix_len = msg['dst_len']
-
-    del_route_entry(bess, item)
-
-    # Delete item
-    del item
-
-
-def netlink_event_listener(ipdb, netlink_message, action):
-
-    # If you get a netlink message, parse it
-    msg = netlink_message
-
-    if action == 'RTM_NEWROUTE':
-        parse_new_route(msg)
-
-    if action == 'RTM_NEWNEIGH':
-        parse_new_neighbor(msg)
-
-    if action == 'RTM_DELROUTE':
-        parse_del_route(msg)
-
-
-def bootstrap_routes():
-    routes = ipr.get_routes()
-    for i in routes:
-        if i['event'] == 'RTM_NEWROUTE':
-            parse_new_route(i)
-
-
-def connect_bessd():
-    print('Connecting to BESS daemon...'),
-    # Connect to BESS (assuming host=localhost, port=10514 (default))
-    for i in range(MAX_RETRIES):
-        try:
-            if not bess.is_connected():
-                bess.connect(grpc_url=args.ip + ':' + args.port)
-        except BESS.RPCError:
-            print(
-                'Error connecting to BESS daemon. Retrying in {}sec...'.format(
-                    SLEEP_S))
-            time.sleep(SLEEP_S)
-        else:
-            break
-    else:
-        raise Exception('BESS connection failure.')
-
-    print('Done.')
-
-
-def reconfigure(number, frame):
-    print('Received: {} Reloading routes'.format(number))
-    # clear arpcache
-    for ip in list(arpcache):
-        item = arpcache.get(ip)
-        del item
-    arpcache.clear()
-    for ip in list(neighborcache):
-        item = neighborcache.get(ip)
-        del item
-    neighborcache.clear()
-    for modname in list(modgatecnt):
-        item = modgatecnt.get(modname)
-        del item
-    modgatecnt.clear()
-    bootstrap_routes()
-    signal.pause()
-
-
-def cleanup(number, frame):
-    ipdb.unregister_callback(event_callback)
-    print('Received: {} Exiting'.format(number))
-    sys.exit()
-
-
-def main():
-    global arpcache, neighborcache, modgatecnt, ipdb, event_callback, bess, ipr
-    # for holding unresolved ARP queries
-    arpcache = {}
-    # for holding list of registered neighbors
-    neighborcache = {}
-    # for holding gate count per route module
-    modgatecnt = {}
-    # for interacting with kernel
-    ipdb = IPDB()
-    ipr = IPRoute()
-    # for bess client
-    bess = BESS()
-
-    # connect to bessd
-    connect_bessd()
-
-    # program current routes
-    #bootstrap_routes()
-
-    # listen for netlink events
-    print('Registering netlink event listener callback...'),
-    event_callback = ipdb.register_callback(netlink_event_listener)
-    print('Done.')
-
-    signal.signal(signal.SIGHUP, reconfigure)
-    signal.signal(signal.SIGINT, cleanup)
-    signal.signal(signal.SIGTERM, cleanup)
-    signal.pause()
-
-
-if __name__ == '__main__':
-    parser = argparse.ArgumentParser(
-        description='Basic IPv4 Routing Controller')
-    parser.add_argument('-i',
-                        type=str,
-                        nargs='+',
-                        help='interface(s) to control')
-    parser.add_argument('--ip',
-                        type=str,
-                        default='localhost',
-                        help='BESSD address')
-    parser.add_argument('--port', type=str, default='10514', help='BESSD port')
-
-    # for holding command-line arguments
-    global args
-    args = parser.parse_args()
-
-    if args.i:
-        main()
-    # if interface list is empty, print help menu and quit
-    else:
-        print(parser.print_help())
diff --git a/omec/omec-user-plane/files/spgwu.bess b/omec/omec-user-plane/files/spgwu.bess
deleted file mode 100644
index 76e546d..0000000
--- a/omec/omec-user-plane/files/spgwu.bess
+++ /dev/null
@@ -1,374 +0,0 @@
-# vim: syntax=py
-# -*- mode: python -*-
-# SPDX-License-Identifier: Apache-2.0
-# Copyright(c) 2019 Intel Corporation
-
-# for errnos
-import errno
-from conf.utils import *
-
-
-# ====================================================
-#       Parameters
-# ====================================================
-
-
-conf_file = get_env('CONF_FILE', 'conf/spgwu.json')
-conf = get_json_conf(conf_file, False)
-
-# Maximum number of flows to manage ip frags for re-assembly
-max_ip_defrag_flows = None
-try:
-    max_ip_defrag_flows = int(conf["max_ip_defrag_flows"])
-except ValueError:
-    print('Invalid value for max_ip_defrag_flows. Not installing IPDefrag module.')
-except KeyError:
-    print('max_ip_defrag_flows value not set. Not installing IPDefrag module.')
-
-# ====================================================
-#       Port Helpers
-# ====================================================
-
-
-MAX_GATES = 8192
-dpdk_ports = {}
-
-
-def scan_dpdk_ports():
-    idx = 0
-    while True:
-        try:
-            intf = PMDPort(name="Port {}".format(idx), port_id=idx)
-            if intf:
-                # Need to declare mac so that we don't lose key during destroy_port
-                mac = intf.mac_addr
-                dpdk_ports[mac] = idx
-                bess.destroy_port(intf.name)
-        except bess.Error as e:
-            if e.code == errno.ENODEV:
-                break
-            else:
-                raise
-        idx += 1
-        # RTE_MAX_ETHPORTS is 32 and we need 2 for vdevs
-        if idx == 30:
-          break
-    return True if dpdk_ports else False
-
-
-class Port:
-    def __init__(self, name):
-        self.name = name
-        self.wid = None
-        self.fpi = None
-        self.fpo = None
-        self.bpf = None
-        self.bpfgate = 0
-        self.routes_table = None
-
-    def bpf_gate(self):
-        if self.bpfgate < MAX_GATES - 2:
-            self.bpfgate += 1
-            return self.bpfgate
-        else:
-            raise Exception('Port {}: Out of BPF gates to allocate'.format(self.name))
-
-    def detect_mode(self):
-        # default case
-        mode = "unselected"
-
-        try:
-            peer_by_interface(self.name)
-            mode = "dpdk"
-        except:
-            mode = "linux"
-        return mode
-
-    def init_fastpath(self, **kwargs):
-        # Initialize PMDPort and RX/TX modules
-        name = self.name
-        fast = PMDPort(name="{}Fast".format(name), **kwargs)
-        self.fpi = __bess_module__("{}FastPI".format(name), 'PortInc', port=fast.name)
-        self.fpo = __bess_module__("{}FastPO".format(name), 'PortOut', port=fast.name)
-
-        # Initialize BPF to classify incoming traffic to go to kernel and/or pipeline
-        self.bpf = __bess_module__("{}FastBPF".format(name), 'BPF')
-        self.bpf.clear()
-
-        # Reassemble IP4 fragments (if needed)
-        defrag = __bess_module__("{}IP4Defrag".format(name), 'IPDefrag', num_flows=max_ip_defrag_flows, numa=0)
-        # Default drop when no matches
-        self.fpi -> defrag:1 -> self.bpf:0 -> Sink()
-        defrag:0 -> Sink()
-
-        # Initialize route module
-        self.rtr = __bess_module__("{}Routes".format(name), 'IPLookup')
-
-        # Default route goes to Sink
-        self.rtr.add(prefix='0.0.0.0', prefix_len=0, gate=MAX_GATES-1)
-        self.rtr:(MAX_GATES-1) -> Sink()
-
-        # Attach fastpath to worker's root TC
-        self.fpi.attach_task(wid=self.wid)
-
-    def setup_port(self, idx, workers):
-        # Pick the worker handling this port
-        self.wid = idx % workers
-
-        name = self.name
-        wid = self.wid
-        print('Setting up port {} on worker {}'.format(name,wid))
-
-        # Detect the mode of this interface - DPDK/AF_XDP/AF_PACKET
-        mode = self.detect_mode()
-
-        if mode == 'linux':
-            try:
-                # Initialize kernel fastpath.
-                # AF_XDP requires that num_rx_qs == num_tx_qs
-                kwargs = {"vdev" : "net_af_xdp{},iface={},start_queue=0,queue_count={}"
-                          .format(idx, name, workers), "num_out_q": workers, "num_inc_q": workers}
-                self.init_fastpath(**kwargs)
-            except:
-                print('Failed to create AF_XDP socket for {}. Creating AF_PACKET socket instead.'.format(name))
-                kwargs = {"vdev" : "net_af_packet{},iface={},qpairs={}".format(idx, name, workers), "num_out_q": workers}
-                self.init_fastpath(**kwargs)
-
-        elif mode == 'dpdk':
-            # if port list is empty, scan for dpdk_ports first
-            if not dpdk_ports and scan_dpdk_ports() == False:
-                print('Registered dpdk ports do not exist.')
-                sys.exit()
-            # Initialize DPDK fastpath
-            fidx = dpdk_ports.get(mac_by_interface(name))
-            if fidx is None:
-                raise Exception('Registered port for {} not detected!'.format(name))
-            kwargs = {"port_id" : fidx, "num_out_q": workers}
-            self.init_fastpath( **kwargs)
-
-            # Initialize kernel slowpath port and RX/TX modules
-            try:
-                peer = peer_by_interface(name)
-                vdev = "net_af_packet{},iface={}".format(idx, peer)
-                slow = PMDPort(name="{}Slow".format(name), vdev=vdev)
-                spi = __bess_module__("{}SlowPI".format(name), 'PortInc', port=slow.name)
-                spo = __bess_module__("{}SlowPO".format(name), 'PortOut', port=slow.name)
-                qspo = __bess_module__("{}QSlowPO".format(name), 'Queue')
-
-                # host_ip_filter: tcpdump -i foo 'dst host 198.19.0.1 or 198.18.0.1' -d
-                # Should always be set to lowest priority
-                HostGate = MAX_GATES - 1
-                ips = ips_by_interface(name)
-                host_ip_filter = {"priority": -HostGate, "filter": "dst host "
-                                + " or ".join(str(x) for x in ips), "gate": HostGate}
-
-                self.bpf.add(filters=[host_ip_filter])
-
-                # Direct control traffic from DPDK to kernel
-                self.bpf:HostGate -> qspo -> spo
-
-                # Direct control traffic from kernel to DPDK
-                spi -> self.fpo
-
-                # Direct fast path traffic to Frag module
-                merge = __bess_module__("{}Merge".format(name), 'Merge')
-                frag = __bess_module__("{}IP4Frag".format(name), 'IPFrag')
-                merge -> frag:1 -> self.fpo
-                frag:0 -> Sink()
-
-                tc = 'slow{}'.format(wid)
-                try:
-                    bess.add_tc(tc, policy='round_robin', wid=wid)
-                except Exception as e:
-                    if e.errmsg == "Name '{}' already exists".format(tc):
-                        pass
-                    else:
-                        raise e
-                # Limit scheduling slow path RX/TX to 1000 times/second each
-                for mod in spi, qspo:
-                    bess.add_tc(mod.name,
-                            parent=tc,
-                            policy='rate_limit',
-                            resource='count',
-                            limit={'count': 1000})
-                    mod.attach_task(mod.name)
-            except Exception as e:
-                print('Mirror veth interface: {} misconfigured: {}'.format(name, e))
-        else:
-            raise Exception('Invalid mode selected.')
-
-
-# ====================================================
-#       Validate
-# ====================================================
-
-
-# CIDRs
-enb_cidr = conf["enb_cidr"]
-ue_cidr = conf["ue_cidr"]
-
-cidrs = [enb_cidr, ue_cidr]
-for cidr in cidrs:
-    if validate_cidr(cidr) is False:
-        exit(1, 'Invalid {}'.format(cidr))
-
-# ====================================================
-#       Core Setup
-# ====================================================
-
-
-# Initialize workers
-workers = 1
-try:
-    workers = int(conf["workers"])
-except ValueError:
-    print('Invalid workers value! Re-setting # of workers to 1.')
-
-cores = get_process_affinity()
-for wid in xrange(workers):
-    bess.add_worker(wid=wid, core=int(cores[wid % len(cores)]))
-
-# ====================================================
-#       Port Setup
-# ====================================================
-
-
-interfaces = ["s1u", "sgi"]
-ports = {}
-for idx, interface in enumerate(interfaces):
-    port = Port(conf[interface]["ifname"])
-    if port.name in ports:
-        continue
-    port.setup_port(idx, workers)
-    ports[port.name] = port
-
-s1u_ifname = conf["s1u"]["ifname"]
-sgi_ifname = conf["sgi"]["ifname"]
-
-# ====================================================
-#       Downlink Pipeline
-# ====================================================
-
-s1uRoutes = ports[s1u_ifname].rtr
-
-# Maximum number of sessions to manage
-try:
-    max_sessions = int(conf["max_sessions"])
-except ValueError:
-    print('Invalid max_sessions value!')
-
-# Setting filter to detect UE subnet
-sgiFastBPF = ports[sgi_ifname].bpf
-UEGate = ports[sgi_ifname].bpf_gate()
-ue_filter = {"priority": -UEGate,
-             "filter": "ip dst net {}".format(ue_cidr), "gate": UEGate}
-sgiFastBPF.add(filters=[ue_filter])
-
-sgiFastBPF:UEGate \
-    -> EtherTrim::GenericDecap(bytes=14) \
-    -> GTPUEncap::GtpuEncap(s1u_sgw_ip=ip2long(ips_by_interface(s1u_ifname)[0]), num_subscribers=max_sessions):1 \
-    -> S1UEtherAdd::GenericEncap(fields=[
-        {'size': 6, 'value': {'value_int': 0x0}},
-        {'size': 6, 'value': {'value_int': mac2hex(mac_by_interface(s1u_ifname))}},
-        {'size': 2, 'value': {'value_int': 0x0800}}]) \
-    -> OuterUDPCsum::L4Checksum() \
-    -> OuterIPCsum::IPChecksum() \
-    -> s1uRoutes
-
-# Drop unknown packets
-GTPUEncap:0 -> Sink()
-
-# ====================================================
-#       Uplink Pipeline
-# ====================================================
-
-
-# Setting filter to detect gtpu traffic
-# src net 11.1.1.0 mask 255.255.255.0           # check eNB subnet
-# and dst host 11.1.1.1                         # check S/PGWU IP
-# and udp dst port 2152                         # check GTPU port
-# and (udp[28:4] & 0xffffff00) = 0x10000000     # check UE subnet
-s1uFastBPF = ports[s1u_ifname].bpf
-check_enb_subnet = "src net {} ".format(enb_cidr)
-check_spgwu_ip = " and dst host " + \
-    " or ".join(str(x) for x in ips_by_interface(s1u_ifname))
-check_gtpu_port = " and udp dst port 2152"
-check_ue_subnet = " and (udp[28:4] & 0x{}) = 0x{}".format(
-    cidr2mask(ue_cidr), ip2hex(cidr2block(ue_cidr)[0]))
-check_gtpu_msg_echo = " and udp[9] = 0x1"
-
-GTPUEchoGate = ports[s1u_ifname].bpf_gate()
-uplink_echo_filter = {"priority": -GTPUEchoGate, "filter": check_enb_subnet +
-                      check_spgwu_ip + check_gtpu_port +
-                      check_gtpu_msg_echo, "gate": GTPUEchoGate}
-s1uFastBPF.add(filters=[uplink_echo_filter])
-
-GTPUGate = ports[s1u_ifname].bpf_gate()
-uplink_filter = {"priority": -GTPUGate, "filter": check_enb_subnet +
-               check_spgwu_ip + check_gtpu_port, "gate": GTPUGate}
-s1uFastBPF.add(filters=[uplink_filter])
-
-sgiRoutes = ports[sgi_ifname].rtr
-
-s1uFastBPF:GTPUGate \
-    -> EtherDecapTrim::GenericDecap(bytes=14) -> GTPUDecap::GtpuDecap(ename="GTPUEncap"):1 \
-    -> SGIEtherAdd::GenericEncap(fields=[
-        {'size': 6, 'value': {'value_int': 0x0}},
-        {'size': 6, 'value': {'value_int': mac2hex(mac_by_interface(sgi_ifname))}},
-        {'size': 2, 'value': {'value_int': 0x0800}}]) \
-    -> sgiRoutes
-
-s1uFastBPF:GTPUEchoGate \
-	-> GTPUEcho::GtpuEcho(s1u_sgw_ip=ip2long(ips_by_interface(s1u_ifname)[0])):1 \
-        -> EthSwap::MACSwap() \
-        -> 1:OuterUDPCsum
-
-# Drop unknown packets
-GTPUEcho:0 -> Sink()
-GTPUDecap:0 -> Sink()
-
-# ====================================================
-#       SIM_TEST
-# ====================================================
-
-import time
-
-def sim_start_test():
-    start_teid = 0xf0000000
-    start_ue_ip = 0x10000001
-    start_enb_ip = 0x0b010181
-    NG4T_MAX_UE_RAN = 500000
-    NG4T_MAX_ENB_RAN = 80
-
-    for i in range(max_sessions):
-
-        # NG4T-based formula to calculate enodeB IP address against a given UE IP address
-        # il_trafficgen also uses the same scheme
-        # See SimuCPEnbv4Teid(...) in ngic code for more details
-        ue_of_ran = i % NG4T_MAX_UE_RAN
-        ran = i / NG4T_MAX_UE_RAN
-        enb_of_ran = ue_of_ran % NG4T_MAX_ENB_RAN
-        enb_idx = ran * NG4T_MAX_ENB_RAN + enb_of_ran
-
-        GTPUEncap.add(teid=start_teid+i, eteid=i+1, ueaddr=start_ue_ip+i, enodeb_ip=start_enb_ip+enb_idx)
-
-def sim_end_test():
-    start_ue_ip = 0x10000001
-
-    for i in range(max_sessions):
-        GTPUEncap.remove(ueaddr=start_ue_ip+i)
-
-    GTPUEncap.show_records()
-
-### Uncomment the following lines to test with il_trafficgen ###
-# Start the test
-#sim_start_test()
-# Wait for 30 seconds before deleting the session info entries (optional)
-#time.sleep(30)
-#sim_end_test()
-
-# Finally send SIGHUP to route_control daemon on reload
-# TODO: behavior is unspecified if route_control.py pid is not found
-route_control_pid = getpythonpid('route_control.py')
-if route_control_pid:
-    os.kill(route_control_pid, signal.SIGHUP)
diff --git a/omec/omec-user-plane/files/utils.py b/omec/omec-user-plane/files/utils.py
deleted file mode 100644
index 5b060b6..0000000
--- a/omec/omec-user-plane/files/utils.py
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/env python
-# SPDX-License-Identifier: Apache-2.0
-# Copyright(c) 2019 Intel Corporation
-
-import os
-import signal
-import socket
-import sys
-
-import iptools
-import json
-import psutil
-from pyroute2 import IPDB
-
-
-def exit(code, msg):
-    print(msg)
-    sys.exit(code)
-
-
-def getpid(process_name):
-    for proc in psutil.process_iter(attrs=['pid', 'name']):
-        if process_name == proc.info['name']:
-            return proc.info['pid']
-
-
-def getpythonpid(process_name):
-    for proc in psutil.process_iter(attrs=['pid', 'cmdline']):
-        if len(proc.info['cmdline']) < 2:
-            continue
-        if process_name in proc.info['cmdline'][1] and 'python' in proc.info['cmdline'][0]:
-            return proc.info['pid']
-    return
-
-def get_json_conf(path, dump):
-    conf = json.loads(open(path).read())
-    if dump:
-        print(json.dumps(conf, indent=4, sort_keys=True))
-    return conf
-
-
-def get_env(varname, default=None):
-    try:
-        var = os.environ[varname]
-        return var
-    except KeyError:
-        if default is not None:
-            return '{}'.format(default)
-        else:
-            exit(1, 'Empty env var {}'.format(varname))
-
-
-def ips_by_interface(name):
-    ipdb = IPDB()
-    return [ipobj[0] for ipobj in ipdb.interfaces[name]['ipaddr'].ipv4]
-
-
-def mac_by_interface(name):
-    ipdb = IPDB()
-    return ipdb.interfaces[name]['address']
-
-
-def mac2hex(mac):
-    return int(mac.replace(':', ''), 16)
-
-
-def peer_by_interface(name):
-    ipdb = IPDB()
-    try:
-        peer_idx = ipdb.interfaces[name]['link']
-        peer_name = ipdb.interfaces[peer_idx]['ifname']
-    except:
-        raise Exception('veth interface {} does not exist'.format(name))
-    else:
-        return peer_name
-
-
-def aton(ip):
-    return socket.inet_aton(ip)
-
-
-def validate_cidr(cidr):
-    return iptools.ipv4.validate_cidr(cidr)
-
-
-def cidr2mask(cidr):
-    _, prefix = cidr.split('/')
-    return format(0xffffffff << (32 - int(prefix)), '08x')
-
-
-def cidr2block(cidr):
-    return iptools.ipv4.cidr2block(cidr)
-
-
-def ip2hex(ip):
-    return iptools.ipv4.ip2hex(ip)
-
-
-def ip2long(ip):
-    return iptools.ipv4.ip2long(ip)
-
-
-def get_process_affinity():
-    return psutil.Process().cpu_affinity()
diff --git a/omec/omec-user-plane/templates/bin/_bessd-poststart.sh.tpl b/omec/omec-user-plane/templates/bin/_bessd-poststart.sh.tpl
index 42db9b1..8c6b37a 100644
--- a/omec/omec-user-plane/templates/bin/_bessd-poststart.sh.tpl
+++ b/omec/omec-user-plane/templates/bin/_bessd-poststart.sh.tpl
@@ -16,7 +16,7 @@
 
 set -ex
 
-until bessctl run spgwu; do
+until bessctl run /opt/bess/bessctl/conf/spgwu; do
     sleep 2;
 done;
 
diff --git a/omec/omec-user-plane/templates/config/_spgwu.json.tpl b/omec/omec-user-plane/templates/config/_spgwu.json.tpl
index 3fec6b1..ba36cc7 100644
--- a/omec/omec-user-plane/templates/config/_spgwu.json.tpl
+++ b/omec/omec-user-plane/templates/config/_spgwu.json.tpl
@@ -8,6 +8,5 @@
     "ifname": {{ .Values.config.spgwu.sgi.device | quote }}
   },
   "workers": {{ .Values.config.spgwu.workers }},
-  "max_sessions": {{ .Values.config.spgwu.maxSessions }},
-  "max_ip_defrag_flows": {{ .Values.config.spgwu.maxIpDefragFlows }}
+  "max_sessions": {{ .Values.config.spgwu.maxSessions }}
 }
diff --git a/omec/omec-user-plane/templates/configmap-spgwu.yaml b/omec/omec-user-plane/templates/configmap-spgwu.yaml
index d002175..488cf64 100644
--- a/omec/omec-user-plane/templates/configmap-spgwu.yaml
+++ b/omec/omec-user-plane/templates/configmap-spgwu.yaml
@@ -24,13 +24,5 @@
 data:
   spgwu.json: |
 {{ tuple "config/_spgwu.json.tpl" . | include "omec-user-plane.template" | indent 4 }}
-  spgwu.bess: |
-{{ .Files.Get "files/spgwu.bess" | indent 4 }}
-  __init__.py: |
-{{ .Files.Get "files/__init__.py" | indent 4 }}
-  route_control.py: |
-{{ .Files.Get "files/route_control.py" | indent 4 }}
-  utils.py: |
-{{ .Files.Get "files/utils.py" | indent 4 }}
   bessd-poststart.sh: |
 {{ tuple "bin/_bessd-poststart.sh.tpl" . | include "omec-user-plane.template" | indent 4 }}
diff --git a/omec/omec-user-plane/templates/statefulset-spgwu.yaml b/omec/omec-user-plane/templates/statefulset-spgwu.yaml
index 64e123d..376b3d9 100644
--- a/omec/omec-user-plane/templates/statefulset-spgwu.yaml
+++ b/omec/omec-user-plane/templates/statefulset-spgwu.yaml
@@ -60,7 +60,7 @@
         env:
           - name: PYTHONUNBUFFERED
             value: "1"
-        command: ["/bin/conf/route_control.py"]
+        command: ["/opt/bess/bessctl/conf/route_control.py"]
         args:
           - -i
           - {{ .Values.config.spgwu.s1u.device }}
@@ -69,9 +69,6 @@
         resources:
 {{ toYaml .Values.resources.routectl | indent 10 }}
       {{- end }}
-        volumeMounts:
-          - name: scripts
-            mountPath: /bin/conf
       - name: bessd
         image: {{ .Values.images.tags.bess | quote }}
         imagePullPolicy: {{ .Values.images.pullPolicy | quote }}
@@ -87,7 +84,7 @@
         lifecycle:
           postStart:
             exec:
-              command: ["/bin/conf/bessd-poststart.sh"]
+              command: ["/etc/bess/conf/bessd-poststart.sh"]
         livenessProbe:
           tcpSocket:
             port: 10514
@@ -110,13 +107,14 @@
             intel.com/sriov_vfio_s1u_net: 1
             intel.com/sriov_vfio_sgi_net: 1
           {{- end }}
+        env:
+          - name: CONF_FILE
+            value: /etc/bess/conf/spgwu.json
         volumeMounts:
           - name: hugepages
             mountPath: /dev/hugepages
           - name: configs
-            mountPath: /opt/bess/bessctl/conf
-          - name: scripts
-            mountPath: /bin/conf
+            mountPath: /etc/bess/conf
         {{- if .Values.config.coreDump.enabled }}
           - name: coredump
             mountPath: /tmp/coredump
@@ -129,11 +127,6 @@
         resources:
 {{ toYaml .Values.resources.web | indent 10 }}
       {{- end }}
-        volumeMounts:
-          - name: configs
-            mountPath: /opt/bess/bessctl/conf
-          - name: scripts
-            mountPath: /bin/conf
       - name: cpiface
         image: {{ .Values.images.tags.cpiface | quote }}
         imagePullPolicy: {{ .Values.images.pullPolicy | quote }}
@@ -166,10 +159,6 @@
       - name: configs
         configMap:
           name: spgwu
-          defaultMode: 420
-      - name: scripts
-        configMap:
-          name: spgwu
           defaultMode: 493
       - name: hugepages
         emptyDir:
diff --git a/omec/omec-user-plane/values.yaml b/omec/omec-user-plane/values.yaml
index ebed5a2..66fd9b3 100644
--- a/omec/omec-user-plane/values.yaml
+++ b/omec/omec-user-plane/values.yaml
@@ -69,7 +69,6 @@
     name: "dp-staging"
     workers: 1
     maxSessions: 50000
-    maxIpDefragFlows: 1000
     # Provide the S1U and SGI networks facing device name and IP address
     s1u:
       device: s1u
