diff --git a/apps/xran/.gitignore b/apps/xran/.gitignore
new file mode 100644
index 0000000..e43b0f9
--- /dev/null
+++ b/apps/xran/.gitignore
@@ -0,0 +1 @@
+.DS_Store
diff --git a/BUCK b/apps/xran/BUCK
similarity index 81%
rename from BUCK
rename to apps/xran/BUCK
index 3cd9b30..0c41439 100644
--- a/BUCK
+++ b/apps/xran/BUCK
@@ -11,21 +11,31 @@
     '//lib:netty-transport',
     '//core/common:onos-core-common',
     ':netty-transport-sctp',
+    '//lib:swagger-annotations',
+    '//lib:JACKSON',
+    '//lib:NETTY'
 ]
 
 BUNDLES = [
     '//apps/xran:onos-apps-xran',
 ]
 
-EXCLUDED_BUNDLES = [
-    ':netty-transport-sctp',
+TEST_DEPS = [
+    '//lib:TEST',
+    '//lib:TEST_ADAPTERS',
 ]
 
-osgi_jar (
+EXCLUDED_BUNDLES = [
+    ':netty-transport-sctp',
+    '//lib:swagger-annotations'
+]
+
+osgi_jar_with_tests (
     deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
     web_context = '/onos/xran',
     api_title = 'XRAN REST API',
-    api_package = 'org.onosproject.xran.rest',
+    api_package = 'org.onosproject.xran.impl.rest',
     api_version = '1.0',
     api_description = 'XRAN REST API',
 )
diff --git a/apps/xran/apps_xran.iml b/apps/xran/apps_xran.iml
new file mode 100644
index 0000000..80f02c3
--- /dev/null
+++ b/apps/xran/apps_xran.iml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.git" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java/org.onosproject.xran" isTestSource="false"  packagePrefix="org.onosproject.xran"/>
+      <sourceFolder url="file://$MODULE_DIR$/src/main/webapp" isTestSource="false"  packagePrefix="apps.xran.src.main.webapp"/>
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java/org.onosproject.xran" isTestSource="true" />
+
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="cli" scope="COMPILE"  />
+    <orderEntry type="module" module-name="core_api" scope="COMPILE"  />
+    <orderEntry type="module" module-name="core_common" scope="COMPILE"  />
+    <orderEntry type="module" module-name="core_store_serializers" scope="COMPILE"  />
+    <orderEntry type="module" module-name="lib" scope="COMPILE"  />
+    <orderEntry type="module" module-name="utils_junit" scope="TEST"  />
+    <orderEntry type="module" module-name="utils_misc" scope="COMPILE"  />
+    <orderEntry type="module" module-name="utils_osgi" scope="COMPILE"  />
+    <orderEntry type="module" module-name="utils_rest" scope="COMPILE"  />
+    <orderEntry type="library" name="library_apps_xran_netty_transport_sctp" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_commons_collections" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_commons_configuration" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_commons_io" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_commons_lang" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_commons_lang3" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_commons_logging" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_commons_pool" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_easymock" scope="TEST" level="project"  />
+    <orderEntry type="library" name="library_lib_guava" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_guava_testlib" scope="TEST" level="project"  />
+    <orderEntry type="library" name="library_lib_hamcrest_all" scope="TEST" level="project"  />
+    <orderEntry type="library" name="library_lib_hamcrest_optional" scope="TEST" level="project"  />
+    <orderEntry type="library" name="library_lib_jackson_annotations" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_jackson_core" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_jackson_databind" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_javax_ws_rs_api" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_jsr305" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_junit" scope="TEST" level="project"  />
+    <orderEntry type="library" name="library_lib_netty_buffer" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_netty_common" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_netty_handler" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_netty_transport" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_org_apache_felix_scr" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_org_apache_felix_scr_annotations" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_org_apache_karaf_features_core" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_org_apache_karaf_shell_console" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_org_apache_karaf_system_core" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_org_apache_servicemix_bundles_dom4j" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_org_osgi_compendium" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_osgi_core" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_slf4j_api" scope="COMPILE" level="project"  />
+    <orderEntry type="library" name="library_lib_swagger_annotations" scope="COMPILE" level="project"  />
+
+  </component>
+</module>
diff --git a/src/main/java/org.onosproject.xran/controller/XranDeviceAgent.java b/apps/xran/src/main/java/org.onosproject.xran/XranDeviceAgent.java
similarity index 91%
rename from src/main/java/org.onosproject.xran/controller/XranDeviceAgent.java
rename to apps/xran/src/main/java/org.onosproject.xran/XranDeviceAgent.java
index a322c47..812d6fc 100644
--- a/src/main/java/org.onosproject.xran/controller/XranDeviceAgent.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/XranDeviceAgent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.controller;
+package org.onosproject.xran;
 
 import io.netty.channel.ChannelHandlerContext;
 
diff --git a/src/main/java/org.onosproject.xran/providers/XranDeviceListener.java b/apps/xran/src/main/java/org.onosproject.xran/XranDeviceListener.java
similarity index 86%
rename from src/main/java/org.onosproject.xran/providers/XranDeviceListener.java
rename to apps/xran/src/main/java/org.onosproject.xran/XranDeviceListener.java
index 10da57e..cfb4783 100644
--- a/src/main/java/org.onosproject.xran/providers/XranDeviceListener.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/XranDeviceListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.providers;
+package org.onosproject.xran;
 
 import org.onosproject.net.DeviceId;
-import org.onosproject.xran.entities.RnibCell;
+import org.onosproject.xran.impl.entities.RnibCell;
 
 /**
  * Xran Device Listener.
diff --git a/src/main/java/org.onosproject.xran/controller/XranHostAgent.java b/apps/xran/src/main/java/org.onosproject.xran/XranHostAgent.java
similarity index 85%
rename from src/main/java/org.onosproject.xran/controller/XranHostAgent.java
rename to apps/xran/src/main/java/org.onosproject.xran/XranHostAgent.java
index 9c335da..852ea6b 100644
--- a/src/main/java/org.onosproject.xran/controller/XranHostAgent.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/XranHostAgent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.controller;
+package org.onosproject.xran;
 
 import io.netty.channel.ChannelHandlerContext;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibUe;
+import org.onosproject.xran.impl.entities.RnibCell;
+import org.onosproject.xran.impl.entities.RnibUe;
 
 /**
  * Xran host agent interface.
diff --git a/src/main/java/org.onosproject.xran/providers/XranHostListener.java b/apps/xran/src/main/java/org.onosproject.xran/XranHostListener.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/providers/XranHostListener.java
rename to apps/xran/src/main/java/org.onosproject.xran/XranHostListener.java
index d545018..b33b17c 100644
--- a/src/main/java/org.onosproject.xran/providers/XranHostListener.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/XranHostListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.providers;
+package org.onosproject.xran;
 
 import org.onosproject.net.HostId;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.entities.RnibUe;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.impl.entities.RnibUe;
 
 import java.util.Set;
 
diff --git a/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java b/apps/xran/src/main/java/org.onosproject.xran/XranPacketProcessor.java
similarity index 87%
rename from src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java
rename to apps/xran/src/main/java/org.onosproject.xran/XranPacketProcessor.java
index 893b21d..e9f8cb0 100644
--- a/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/XranPacketProcessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.controller;
+package org.onosproject.xran;
 
 import io.netty.channel.ChannelHandlerContext;
-import org.onosproject.xran.codecs.pdu.XrancPdu;
+import org.onosproject.xran.asn1lib.pdu.XrancPdu;
 
 import java.io.IOException;
 
diff --git a/src/main/java/org.onosproject.xran/controller/XranController.java b/apps/xran/src/main/java/org.onosproject.xran/XranService.java
similarity index 74%
rename from src/main/java/org.onosproject.xran/controller/XranController.java
rename to apps/xran/src/main/java/org.onosproject.xran/XranService.java
index b08c714..c9b89fe 100644
--- a/src/main/java/org.onosproject.xran/controller/XranController.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/XranService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,19 +14,18 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.controller;
+package org.onosproject.xran;
 
-import org.onosproject.xran.codecs.pdu.RRMConfig;
-import org.onosproject.xran.entities.RnibLink;
-import org.onosproject.xran.providers.XranDeviceListener;
-import org.onosproject.xran.providers.XranHostListener;
+import org.onosproject.xran.asn1lib.pdu.RRMConfig;
+import org.onosproject.xran.impl.entities.RnibLink;
 
+import java.util.Optional;
 import java.util.concurrent.SynchronousQueue;
 
 /**
  * Created by dimitris on 7/27/17.
  */
-public interface XranController {
+public interface XranService {
 
     /**
      * Send a HandOff request from one link to another.
@@ -36,7 +35,7 @@
      * @return blocking queue for RESPONSE
      * @throws InterruptedException interrupted exception
      */
-    SynchronousQueue<String> sendHORequest(RnibLink newLink, RnibLink oldLink) throws InterruptedException;
+    Optional<SynchronousQueue<String>> sendHoRequest(RnibLink newLink, RnibLink oldLink);
 
     /**
      * Add a device listener for CELL connections.
@@ -67,13 +66,12 @@
     void removeListener(XranHostListener listener);
 
     /**
-     * Send modified RRM configuration or xICICConfing.
+     * Send modified RRM configuration.
      *
      * @param rrmConfig configuration fields to send
-     * @param xicic     if true sends xicic else it sends RRM
      * @return blocking queue for RESPONSE
      */
-    SynchronousQueue<String> sendmodifiedrrmconf(RRMConfig rrmConfig, boolean xicic);
+    Optional<SynchronousQueue<String>> sendModifiedRrm(RRMConfig rrmConfig);
 
     /**
      * Send scell add packet for specified LINK.
@@ -81,7 +79,7 @@
      * @param link LINK entity
      * @return blocking queue for RESPONSE
      */
-    SynchronousQueue<String> sendScellAdd(RnibLink link);
+    Optional<SynchronousQueue<String>> sendScellAdd(RnibLink link);
 
     /**
      * Send scell delete for specified LINK.
diff --git a/apps/xran/src/main/java/org.onosproject.xran/XranStore.java b/apps/xran/src/main/java/org.onosproject.xran/XranStore.java
new file mode 100644
index 0000000..6c9c8fc
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/XranStore.java
@@ -0,0 +1,396 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xran;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.BiMap;
+import io.netty.channel.ChannelHandlerContext;
+import org.onosproject.store.Store;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.PCIARFCN;
+import org.onosproject.xran.impl.entities.RnibCell;
+import org.onosproject.xran.impl.entities.RnibLink;
+import org.onosproject.xran.impl.entities.RnibSlice;
+import org.onosproject.xran.impl.entities.RnibUe;
+import org.onosproject.xran.impl.identifiers.EcgiCrntiPair;
+import org.onosproject.xran.impl.identifiers.LinkId;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by dimitris on 7/22/17.
+ */
+public interface XranStore extends Store {
+
+    // LINKS STORE
+
+    /**
+     * Get all active links.
+     *
+     * @return list of links
+     */
+    List<RnibLink> getLinks();
+
+    /**
+     * Get all links for that CELL based on ECGI.
+     *
+     * @param ecgi CELL ECGI
+     *
+     * @return list of links
+     */
+    List<RnibLink> getLinks(ECGI ecgi);
+
+    /**
+     * Get all links for that CELL based on ECI.
+     *
+     * @param eciHex HEX string of ECI
+     *
+     * @return list of links
+     */
+    List<RnibLink> getLinks(String eciHex);
+
+    /**
+     * Get all links for the UE based on UE ID.
+     *
+     * @param ueId UE ID
+     *
+     * @return list of links
+     */
+    List<RnibLink> getLinks(long ueId);
+
+    /**
+     * Get a link between a CELL and UE.
+     *
+     * @param cellId HEX string ECI
+     * @param ueId   UE id
+     *
+     * @return link
+     */
+    Optional<RnibLink> getLink(String cellId, long ueId);
+
+    /**
+     * Get a link between a CELL's ECGI and UE's id.
+     *
+     * @param ecgi CELL ECGI
+     * @param ueId UE id
+     *
+     * @return link
+     */
+    Optional<RnibLink> getLink(ECGI ecgi, Long ueId);
+
+    /**
+     * Get link based on ECGI and CRNTI.
+     *
+     * @param src CELL ECGI
+     * @param dst CELL unique CRNTI
+     * @return link if found
+     */
+    Optional<RnibLink> getLink(ECGI src, CRNTI dst);
+
+    /**
+     * Modify specified link's RRM Configuration.
+     *
+     * @param link    LINK entity
+     * @param rrmConf json node of RRM Configuration
+     */
+    void modifyLinkRrmConf(RnibLink link, JsonNode rrmConf);
+
+    /**
+     * Put new link to store.
+     *
+     * @param link LINK entity
+     */
+    void storeLink(RnibLink link);
+
+    /**
+     * Remove link from store.
+     *
+     * @param link LINK entity
+     *
+     * @return true if remove succeeded
+     */
+    boolean removeLink(LinkId link);
+
+    // NODES
+
+    /**
+     * Get all CELLs and UEs.
+     *
+     * @return list of UEs and CELLs
+     */
+    List<Object> getNodes();
+
+    /**
+     * Get all CELLs.
+     *
+     * @return list of CELLs
+     */
+    List<RnibCell> getCellNodes();
+
+    /**
+     * Get all UEs.
+     *
+     * @return list of UEs
+     */
+    List<RnibUe> getUeNodes();
+
+    /**
+     * Get node by node id.
+     *
+     * @param nodeId HEX string ECI or UE id
+     *
+     * @return CELL or UE
+     */
+    Optional<Object> getNode(String nodeId);
+
+    // CELL
+
+    /**
+     * Get cell based on HEX string ECI.
+     *
+     * @param eci HEX string ECI
+     *
+     * @return CELL if found
+     */
+    Optional<RnibCell> getCell(String eci);
+
+    /**
+     * Get cell based on ECGI.
+     *
+     * @param cellId CELL ECGI
+     *
+     * @return CELL if found
+     */
+    Optional<RnibCell> getCell(ECGI cellId);
+
+    /**
+     * Get cell based on PCI-ARFCN.
+     *
+     * @param id PCI-ARFCN
+     *
+     * @return CELL entity if found
+     */
+    Optional<RnibCell> getCell(PCIARFCN id);
+
+    /**
+     * Modify CELL's RRM Configuration.
+     *
+     * @param cell    CELL entity
+     * @param rrmConf json node of RRM Configuration
+     *
+     * @throws Exception exception
+     */
+    void modifyCellRrmConf(RnibCell cell, JsonNode rrmConf) throws Exception;
+
+    /**
+     * Put new CELL to the store.
+     *
+     * @param cell CELL entity
+     */
+    void storeCell(RnibCell cell);
+
+    /**
+     * Remove CELL from the store.
+     *
+     * @param ecgi CELL's ECGI
+     *
+     * @return ture if remove succeeded
+     */
+    boolean removeCell(ECGI ecgi);
+
+    /**
+     * Remove cell from three maps based on PCI-ARFCN.
+     *
+     * @param pciarfcn pci-arfcn of cell to remove
+     *
+     * @return true if remove succeeded
+     */
+    boolean removeCell(PCIARFCN pciarfcn);
+
+    // SLICE
+
+    /**
+     * Get SLICE based on SLICE id.
+     *
+     * @param sliceId SLICE id
+     * @return SLICE
+     */
+    Optional<RnibSlice> getSlice(long sliceId);
+
+    /**
+     * Put new SLICE to the store.
+     *
+     * @param attributes json node of SLICE attributes
+     *
+     * @return true if put succeeded
+     */
+    boolean createSlice(ObjectNode attributes);
+
+    /**
+     * Remove SLICE based on SLICE id.
+     *
+     * @param sliceId SLICE id
+     *
+     * @return true if remove succeeded
+     */
+    boolean removeCell(long sliceId);
+
+    // CONTROLLER
+
+    /**
+     * Get the xran xranServer instance.
+     *
+     * @return xran xranServer
+     */
+    Optional<XranService> getController();
+
+    /**
+     * Set the xran xranServer instance.
+     *
+     * @param controller xran xranServer
+     */
+    void setController(XranService controller);
+
+    // UE
+
+    /**
+     * Get UE based on UE id.
+     *
+     * @param euId UE id
+     *
+     * @return UE entity
+     */
+    Optional<RnibUe> getUe(long euId);
+
+    /**
+     * Get UE based on ECGI and CRNTI.
+     *
+     * @param ecgi  CELL ECGI
+     * @param crnti CELL unique CRNTI
+     *
+     * @return UE entity if found
+     */
+    Optional<RnibUe> getUe(ECGI ecgi, CRNTI crnti);
+
+    /**
+     * Put new UE to store.
+     *
+     * @param ue UE entity
+     */
+    void storeUe(RnibUe ue);
+
+    /**
+     * Put new UE to the store and update the ECGI, CRNTI pair.
+     *
+     * @param cell new primary CELL
+     * @param ue   UE
+     */
+    void storeUe(RnibCell cell, RnibUe ue);
+
+    /**
+     * Remove UE from store.
+     *
+     * @param ueId UE id
+     *
+     * @return true if remove succeeded
+     */
+    boolean removeUe(long ueId);
+
+    /**
+     * Put the PCI-ARFCN to ECGI map from new cell.
+     *
+     * @param value CELL entity
+     */
+    void storePciArfcn(RnibCell value);
+
+
+    /**
+     * Put inside ECGI to CTX map.
+     *
+     * @param value CELL entity to get ECGI from
+     * @param ctx   context channel
+     */
+    void storeCtx(RnibCell value, ChannelHandlerContext ctx);
+
+    /**
+     * Get context handler for specified ECGI.
+     *
+     * @param ecgi CELL ECGI
+     * @return context handler if found
+     */
+    Optional<ChannelHandlerContext> getCtx(ECGI ecgi);
+
+    /**
+     * Get the ECGI, CRNTI to UE bimap.
+     *
+     * @return BiMap of EcgiCrntiPair to Long
+     */
+    BiMap<EcgiCrntiPair, Long> getCrnti();
+
+    /**
+     * Put new ECGI, CRNTI pair of primary link to UE and remove old one.
+     *
+     * @param cell new primary CELL
+     * @param ue   UE
+     */
+    void storeCrnti(RnibCell cell, RnibUe ue);
+
+    /**
+     * Put a new primary link between a CELL and a UE.
+     *
+     * @param cell CELL entity
+     * @param ue   UE entity
+     */
+    void putPrimaryLink(RnibCell cell, RnibUe ue);
+
+    /**
+     * Put non-serving link based on CELL and CRNTI.
+     *
+     * @param cell  CELL entity
+     * @param crnti CRNTI
+     * @return new link after creation
+     */
+    Optional<RnibLink> putNonServingLink(RnibCell cell, CRNTI crnti);
+
+    /**
+     * Put non-serving link based on CELL and UE id.
+     *
+     * @param cell CELL entity
+     * @param ueId UE id
+     * @return new link after creation
+     */
+    Optional<RnibLink> putNonServingLink(RnibCell cell, Long ueId);
+
+    /**
+     * Get CRNTI based on UE id.
+     *
+     * @param ueId UE id
+     * @return UE if found
+     */
+    Optional<CRNTI> getCrnti(Long ueId);
+
+    /**
+     * Get primary CELL for specified UE.
+     *
+     * @param ue UE entity
+     * @return primary CELL if found
+     */
+    Optional<RnibCell> getPrimaryCell(RnibUe ue);
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A1Param.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A1Param.java
new file mode 100644
index 0000000..fbfbce8
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A1Param.java
@@ -0,0 +1,143 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class A1Param implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ThresholdEUTRA a1Threshold = null;
+
+    public A1Param() {
+    }
+
+    public A1Param(byte[] code) {
+        this.code = code;
+    }
+
+    public ThresholdEUTRA getA1Threshold() {
+        return a1Threshold;
+    }
+
+    public void setA1Threshold(ThresholdEUTRA a1Threshold) {
+        this.a1Threshold = a1Threshold;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        int sublength;
+
+        sublength = a1Threshold.encode(os);
+        codeLength += sublength;
+        codeLength += BerLength.encodeLength(os, sublength);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            subCodeLength += length.decode(is);
+            a1Threshold = new ThresholdEUTRA();
+            subCodeLength += a1Threshold.decode(is, null);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (a1Threshold != null) {
+            sb.append("a1Threshold: ");
+            a1Threshold.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("a1Threshold: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A2Param.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A2Param.java
new file mode 100644
index 0000000..4a269f7
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A2Param.java
@@ -0,0 +1,143 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class A2Param implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ThresholdEUTRA a2Threshold = null;
+
+    public A2Param() {
+    }
+
+    public A2Param(byte[] code) {
+        this.code = code;
+    }
+
+    public ThresholdEUTRA getA2Threshold() {
+        return a2Threshold;
+    }
+
+    public void setA2Threshold(ThresholdEUTRA a2Threshold) {
+        this.a2Threshold = a2Threshold;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        int sublength;
+
+        sublength = a2Threshold.encode(os);
+        codeLength += sublength;
+        codeLength += BerLength.encodeLength(os, sublength);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            subCodeLength += length.decode(is);
+            a2Threshold = new ThresholdEUTRA();
+            subCodeLength += a2Threshold.decode(is, null);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (a2Threshold != null) {
+            sb.append("a2Threshold: ");
+            a2Threshold.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("a2Threshold: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A3Param.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A3Param.java
new file mode 100644
index 0000000..4d1e9ea
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A3Param.java
@@ -0,0 +1,138 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class A3Param implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private BerInteger a3Offset = null;
+
+    public A3Param() {
+    }
+
+    public A3Param(byte[] code) {
+        this.code = code;
+    }
+
+    public BerInteger getA3Offset() {
+        return a3Offset;
+    }
+
+    public void setA3Offset(BerInteger a3Offset) {
+        this.a3Offset = a3Offset;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += a3Offset.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            a3Offset = new BerInteger();
+            subCodeLength += a3Offset.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (a3Offset != null) {
+            sb.append("a3Offset: ").append(a3Offset);
+        } else {
+            sb.append("a3Offset: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A4Param.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A4Param.java
new file mode 100644
index 0000000..fe514bc
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A4Param.java
@@ -0,0 +1,143 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class A4Param implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ThresholdEUTRA a4Threshold = null;
+
+    public A4Param() {
+    }
+
+    public A4Param(byte[] code) {
+        this.code = code;
+    }
+
+    public ThresholdEUTRA getA4Threshold() {
+        return a4Threshold;
+    }
+
+    public void setA4Threshold(ThresholdEUTRA a4Threshold) {
+        this.a4Threshold = a4Threshold;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        int sublength;
+
+        sublength = a4Threshold.encode(os);
+        codeLength += sublength;
+        codeLength += BerLength.encodeLength(os, sublength);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            subCodeLength += length.decode(is);
+            a4Threshold = new ThresholdEUTRA();
+            subCodeLength += a4Threshold.decode(is, null);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (a4Threshold != null) {
+            sb.append("a4Threshold: ");
+            a4Threshold.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("a4Threshold: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A5Param.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A5Param.java
new file mode 100644
index 0000000..878ae61
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A5Param.java
@@ -0,0 +1,179 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class A5Param implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ThresholdEUTRA a5Threshold1 = null;
+    private ThresholdEUTRA a5Threshold2 = null;
+
+    public A5Param() {
+    }
+
+    public A5Param(byte[] code) {
+        this.code = code;
+    }
+
+    public ThresholdEUTRA getA5Threshold1() {
+        return a5Threshold1;
+    }
+
+    public void setA5Threshold1(ThresholdEUTRA a5Threshold1) {
+        this.a5Threshold1 = a5Threshold1;
+    }
+
+    public ThresholdEUTRA getA5Threshold2() {
+        return a5Threshold2;
+    }
+
+    public void setA5Threshold2(ThresholdEUTRA a5Threshold2) {
+        this.a5Threshold2 = a5Threshold2;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        int sublength;
+
+        sublength = a5Threshold2.encode(os);
+        codeLength += sublength;
+        codeLength += BerLength.encodeLength(os, sublength);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        sublength = a5Threshold1.encode(os);
+        codeLength += sublength;
+        codeLength += BerLength.encodeLength(os, sublength);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            subCodeLength += length.decode(is);
+            a5Threshold1 = new ThresholdEUTRA();
+            subCodeLength += a5Threshold1.decode(is, null);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            subCodeLength += length.decode(is);
+            a5Threshold2 = new ThresholdEUTRA();
+            subCodeLength += a5Threshold2.decode(is, null);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (a5Threshold1 != null) {
+            sb.append("a5Threshold1: ");
+            a5Threshold1.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("a5Threshold1: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (a5Threshold2 != null) {
+            sb.append("a5Threshold2: ");
+            a5Threshold2.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("a5Threshold2: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A6Param.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A6Param.java
new file mode 100644
index 0000000..991a4bb
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/A6Param.java
@@ -0,0 +1,138 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class A6Param implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private BerInteger a6Offset = null;
+
+    public A6Param() {
+    }
+
+    public A6Param(byte[] code) {
+        this.code = code;
+    }
+
+    public BerInteger getA6Offset() {
+        return a6Offset;
+    }
+
+    public void setA6Offset(BerInteger a6Offset) {
+        this.a6Offset = a6Offset;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += a6Offset.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            a6Offset = new BerInteger();
+            subCodeLength += a6Offset.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (a6Offset != null) {
+            sb.append("a6Offset: ").append(a6Offset);
+        } else {
+            sb.append("a6Offset: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ARFCNValue.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ARFCNValue.java
similarity index 80%
rename from src/main/java/org.onosproject.xran/codecs/api/ARFCNValue.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ARFCNValue.java
index acdd791..1377785 100644
--- a/src/main/java/org.onosproject.xran/codecs/api/ARFCNValue.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ARFCNValue.java
@@ -1,10 +1,10 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.api;
+package org.onosproject.xran.asn1lib.api;
 
-import org.onosproject.xran.codecs.ber.types.BerInteger;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
 
 import java.math.BigInteger;
 
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstCause.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstCause.java
new file mode 100644
index 0000000..cd30cfa
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstCause.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class AdmEstCause extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public AdmEstCause() {
+    }
+
+    public AdmEstCause(byte[] code) {
+        super(code);
+    }
+
+    public AdmEstCause(BigInteger value) {
+        super(value);
+    }
+
+    public AdmEstCause(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstResponse.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstResponse.java
new file mode 100644
index 0000000..57a1ce7
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstResponse.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class AdmEstResponse extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public AdmEstResponse() {
+    }
+
+    public AdmEstResponse(byte[] code) {
+        super(code);
+    }
+
+    public AdmEstResponse(BigInteger value) {
+        super(value);
+    }
+
+    public AdmEstResponse(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstStatus.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstStatus.java
new file mode 100644
index 0000000..1d5ac19
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/AdmEstStatus.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class AdmEstStatus extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public AdmEstStatus() {
+    }
+
+    public AdmEstStatus(byte[] code) {
+        super(code);
+    }
+
+    public AdmEstStatus(BigInteger value) {
+        super(value);
+    }
+
+    public AdmEstStatus(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/BitRate.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/BitRate.java
new file mode 100644
index 0000000..1eea849
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/BitRate.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+
+
+public class BitRate extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public BitRate() {
+    }
+
+    public BitRate(byte[] code) {
+        super(code);
+    }
+
+    public BitRate(BigInteger value) {
+        super(value);
+    }
+
+    public BitRate(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CACap.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CACap.java
new file mode 100644
index 0000000..32a4eda
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CACap.java
@@ -0,0 +1,236 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerBoolean;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class CACap implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private BerInteger band = null;
+    private BerEnum caclassdl = null;
+    private BerEnum caclassul = null;
+    private BerBoolean crossCarrierSched = null;
+
+    public CACap() {
+    }
+
+    public CACap(byte[] code) {
+        this.code = code;
+    }
+
+    public BerInteger getBand() {
+        return band;
+    }
+
+    public void setBand(BerInteger band) {
+        this.band = band;
+    }
+
+    public BerEnum getCaclassdl() {
+        return caclassdl;
+    }
+
+    public void setCaclassdl(BerEnum caclassdl) {
+        this.caclassdl = caclassdl;
+    }
+
+    public BerEnum getCaclassul() {
+        return caclassul;
+    }
+
+    public void setCaclassul(BerEnum caclassul) {
+        this.caclassul = caclassul;
+    }
+
+    public BerBoolean getCrossCarrierSched() {
+        return crossCarrierSched;
+    }
+
+    public void setCrossCarrierSched(BerBoolean crossCarrierSched) {
+        this.crossCarrierSched = crossCarrierSched;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += crossCarrierSched.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += caclassul.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += caclassdl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
+        codeLength += 1;
+
+        codeLength += band.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            band = new BerInteger();
+            subCodeLength += band.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            caclassdl = new BerEnum();
+            subCodeLength += caclassdl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            caclassul = new BerEnum();
+            subCodeLength += caclassul.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            crossCarrierSched = new BerBoolean();
+            subCodeLength += crossCarrierSched.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (band != null) {
+            sb.append("band: ").append(band);
+        } else {
+            sb.append("band: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (caclassdl != null) {
+            sb.append("caclassdl: ").append(caclassdl);
+        } else {
+            sb.append("caclassdl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (caclassul != null) {
+            sb.append("caclassul: ").append(caclassul);
+        } else {
+            sb.append("caclassul: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crossCarrierSched != null) {
+            sb.append("crossCarrierSched: ").append(crossCarrierSched);
+        } else {
+            sb.append("crossCarrierSched: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CRNTI.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CRNTI.java
new file mode 100644
index 0000000..8b3245a
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CRNTI.java
@@ -0,0 +1,45 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerBitString;
+
+import javax.xml.bind.DatatypeConverter;
+import java.util.Arrays;
+
+
+public class CRNTI extends BerBitString {
+
+    private static final long serialVersionUID = 1L;
+
+    public CRNTI() {
+    }
+
+    public CRNTI(byte[] code) {
+        super(code);
+    }
+
+    public CRNTI(byte[] value, int numBits) {
+        super(value, numBits);
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof CRNTI) {
+            return Arrays.equals(value, ((CRNTI) obj).value);
+        }
+        return super.equals(obj);
+    }
+
+    @Override
+    public String toString() {
+        return "" + DatatypeConverter.printHexBinary(value) + "";
+    }
+}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CandScell.java
similarity index 79%
copy from src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CandScell.java
index 7a44283..7ce4c2c 100644
--- a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/CandScell.java
@@ -1,20 +1,20 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.api;
+package org.onosproject.xran.asn1lib.api;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
 
 
-public class PCIARFCN implements Serializable {
+public class CandScell implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
@@ -23,20 +23,13 @@
     private PhysCellId pci = null;
     private ARFCNValue earfcnDl = null;
 
-    public PCIARFCN() {
+    public CandScell() {
     }
 
-    public PCIARFCN(byte[] code) {
+    public CandScell(byte[] code) {
         this.code = code;
     }
 
-    public static PCIARFCN valueOf(PhysCellId pci, ARFCNValue arfcnValue) {
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setEarfcnDl(arfcnValue);
-        pciarfcn.setPci(pci);
-        return pciarfcn;
-    }
-
     public PhysCellId getPci() {
         return pci;
     }
@@ -151,6 +144,8 @@
         }
         if (pci != null) {
             sb.append("pci: ").append(pci);
+        } else {
+            sb.append("pci: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -159,6 +154,8 @@
         }
         if (earfcnDl != null) {
             sb.append("earfcnDl: ").append(earfcnDl);
+        } else {
+            sb.append("earfcnDl: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -168,20 +165,5 @@
         sb.append("}");
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (o instanceof PCIARFCN) {
-            return pci.equals(((PCIARFCN) o).getPci()) && earfcnDl.equals(((PCIARFCN) o).getEarfcnDl());
-        }
-
-        return super.equals(o);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = pci.hashCode();
-        result = 31 * result + earfcnDl.hashCode();
-        return result;
-    }
 }
 
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/DCCap.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/DCCap.java
new file mode 100644
index 0000000..8b7e75a
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/DCCap.java
@@ -0,0 +1,138 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class DCCap implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private BerEnum drbTypeSplit = null;
+
+    public DCCap() {
+    }
+
+    public DCCap(byte[] code) {
+        this.code = code;
+    }
+
+    public BerEnum getDrbTypeSplit() {
+        return drbTypeSplit;
+    }
+
+    public void setDrbTypeSplit(BerEnum drbTypeSplit) {
+        this.drbTypeSplit = drbTypeSplit;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += drbTypeSplit.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            drbTypeSplit = new BerEnum();
+            subCodeLength += drbTypeSplit.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (drbTypeSplit != null) {
+            sb.append("drbTypeSplit: ").append(drbTypeSplit);
+        } else {
+            sb.append("drbTypeSplit: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/DuplexMode.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/DuplexMode.java
new file mode 100644
index 0000000..6e3b7f0
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/DuplexMode.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class DuplexMode extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public DuplexMode() {
+    }
+
+    public DuplexMode(byte[] code) {
+        super(code);
+    }
+
+    public DuplexMode(BigInteger value) {
+        super(value);
+    }
+
+    public DuplexMode(long value) {
+        super(value);
+    }
+
+}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ECGI.java
similarity index 63%
copy from src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ECGI.java
index 7a44283..e7c5cbd 100644
--- a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ECGI.java
@@ -1,56 +1,49 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.api;
+package org.onosproject.xran.asn1lib.api;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
 
 
-public class PCIARFCN implements Serializable {
+public class ECGI implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
     @JsonIgnore
     public byte[] code = null;
-    private PhysCellId pci = null;
-    private ARFCNValue earfcnDl = null;
+    private PLMNIdentity pLMNIdentity = null;
+    private EUTRANCellIdentifier eUTRANcellIdentifier = null;
 
-    public PCIARFCN() {
+    public ECGI() {
     }
 
-    public PCIARFCN(byte[] code) {
+    public ECGI(byte[] code) {
         this.code = code;
     }
 
-    public static PCIARFCN valueOf(PhysCellId pci, ARFCNValue arfcnValue) {
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setEarfcnDl(arfcnValue);
-        pciarfcn.setPci(pci);
-        return pciarfcn;
+    public PLMNIdentity getPLMNIdentity() {
+        return pLMNIdentity;
     }
 
-    public PhysCellId getPci() {
-        return pci;
+    public void setPLMNIdentity(PLMNIdentity pLMNIdentity) {
+        this.pLMNIdentity = pLMNIdentity;
     }
 
-    public void setPci(PhysCellId pci) {
-        this.pci = pci;
+    public EUTRANCellIdentifier getEUTRANcellIdentifier() {
+        return eUTRANcellIdentifier;
     }
 
-    public ARFCNValue getEarfcnDl() {
-        return earfcnDl;
-    }
-
-    public void setEarfcnDl(ARFCNValue earfcnDl) {
-        this.earfcnDl = earfcnDl;
+    public void setEUTRANcellIdentifier(EUTRANCellIdentifier eUTRANcellIdentifier) {
+        this.eUTRANcellIdentifier = eUTRANcellIdentifier;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -70,12 +63,12 @@
         }
 
         int codeLength = 0;
-        codeLength += earfcnDl.encode(os, false);
+        codeLength += eUTRANcellIdentifier.encode(os, false);
         // write tag: CONTEXT_CLASS, PRIMITIVE, 1
         os.write(0x81);
         codeLength += 1;
 
-        codeLength += pci.encode(os, false);
+        codeLength += pLMNIdentity.encode(os, false);
         // write tag: CONTEXT_CLASS, PRIMITIVE, 0
         os.write(0x80);
         codeLength += 1;
@@ -111,16 +104,16 @@
 
         subCodeLength += berTag.decode(is);
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-            pci = new PhysCellId();
-            subCodeLength += pci.decode(is, false);
+            pLMNIdentity = new PLMNIdentity();
+            subCodeLength += pLMNIdentity.decode(is, false);
             subCodeLength += berTag.decode(is);
         } else {
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-            earfcnDl = new ARFCNValue();
-            subCodeLength += earfcnDl.decode(is, false);
+            eUTRANcellIdentifier = new EUTRANCellIdentifier();
+            subCodeLength += eUTRANcellIdentifier.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -149,16 +142,20 @@
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (pci != null) {
-            sb.append("pci: ").append(pci);
+        if (pLMNIdentity != null) {
+            sb.append("pLMNIdentity: ").append(pLMNIdentity);
+        } else {
+            sb.append("pLMNIdentity: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (earfcnDl != null) {
-            sb.append("earfcnDl: ").append(earfcnDl);
+        if (eUTRANcellIdentifier != null) {
+            sb.append("eUTRANcellIdentifier: ").append(eUTRANcellIdentifier);
+        } else {
+            sb.append("eUTRANcellIdentifier: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -170,18 +167,17 @@
 
     @Override
     public boolean equals(Object o) {
-        if (o instanceof PCIARFCN) {
-            return pci.equals(((PCIARFCN) o).getPci()) && earfcnDl.equals(((PCIARFCN) o).getEarfcnDl());
-        }
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
 
-        return super.equals(o);
+        ECGI ecgi = (ECGI) o;
+
+        return eUTRANcellIdentifier.equals(ecgi.eUTRANcellIdentifier);
     }
 
     @Override
     public int hashCode() {
-        int result = pci.hashCode();
-        result = 31 * result + earfcnDl.hashCode();
-        return result;
+        return eUTRANcellIdentifier.hashCode();
     }
 }
 
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ENBUES1APID.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ENBUES1APID.java
new file mode 100644
index 0000000..385e1c0
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ENBUES1APID.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+
+
+public class ENBUES1APID extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public ENBUES1APID() {
+    }
+
+    public ENBUES1APID(byte[] code) {
+        super(code);
+    }
+
+    public ENBUES1APID(BigInteger value) {
+        super(value);
+    }
+
+    public ENBUES1APID(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABDecision.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABDecision.java
new file mode 100644
index 0000000..ab2a7f0
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABDecision.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class ERABDecision extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public ERABDecision() {
+    }
+
+    public ERABDecision(byte[] code) {
+        super(code);
+    }
+
+    public ERABDecision(BigInteger value) {
+        super(value);
+    }
+
+    public ERABDecision(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABDirection.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABDirection.java
new file mode 100644
index 0000000..57314e5
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABDirection.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class ERABDirection extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public ERABDirection() {
+    }
+
+    public ERABDirection(byte[] code) {
+        super(code);
+    }
+
+    public ERABDirection(BigInteger value) {
+        super(value);
+    }
+
+    public ERABDirection(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABID.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABID.java
new file mode 100644
index 0000000..b585441
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABID.java
@@ -0,0 +1,43 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+
+
+public class ERABID extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public ERABID() {
+    }
+
+    public ERABID(byte[] code) {
+        super(code);
+    }
+
+    public ERABID(BigInteger value) {
+        super(value);
+    }
+
+    public ERABID(long value) {
+        super(value);
+    }
+
+    @Override
+    public int hashCode() {
+        return value.intValue();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof ERABID) {
+            return value.intValue() == ((ERABID) obj).intValue();
+        }
+        return super.equals(obj);
+    }
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABParams.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABParams.java
new file mode 100644
index 0000000..c7f6e14
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABParams.java
@@ -0,0 +1,146 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class ERABParams implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private List<ERABParamsItem> seqOf = null;
+
+    public ERABParams() {
+        seqOf = new ArrayList<ERABParamsItem>();
+    }
+
+    public ERABParams(byte[] code) {
+        this.code = code;
+    }
+
+    @JsonValue
+    public List<ERABParamsItem> getERABParamsItem() {
+        if (seqOf == null) {
+            seqOf = new ArrayList<ERABParamsItem>();
+        }
+        return seqOf;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        for (int i = (seqOf.size() - 1); i >= 0; i--) {
+            codeLength += seqOf.get(i).encode(os, true);
+        }
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+        int totalLength = length.val;
+
+        while (subCodeLength < totalLength) {
+            ERABParamsItem element = new ERABParamsItem();
+            subCodeLength += element.decode(is, true);
+            seqOf.add(element);
+        }
+        if (subCodeLength != totalLength) {
+            throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+        }
+        codeLength += subCodeLength;
+
+        return codeLength;
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (seqOf == null) {
+            sb.append("null");
+        } else {
+            Iterator<ERABParamsItem> it = seqOf.iterator();
+            if (it.hasNext()) {
+                it.next().appendAsString(sb, indentLevel + 1);
+                while (it.hasNext()) {
+                    sb.append(",\n");
+                    for (int i = 0; i < indentLevel + 1; i++) {
+                        sb.append("\t");
+                    }
+                    it.next().appendAsString(sb, indentLevel + 1);
+                }
+            }
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABParamsItem.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABParamsItem.java
new file mode 100644
index 0000000..09d646e
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABParamsItem.java
@@ -0,0 +1,394 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class ERABParamsItem implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ERABID id = null;
+    private ERABDirection direction = null;
+    private ERABType type = null;
+    private QCI qci = null;
+    private BerInteger arp = null;
+    private BitRate gbrDl = null;
+    private BitRate gbrUl = null;
+    private BitRate mbrDl = null;
+    private BitRate mbrUl = null;
+
+    public ERABParamsItem() {
+    }
+
+    public ERABParamsItem(byte[] code) {
+        this.code = code;
+    }
+
+    public ERABID getId() {
+        return id;
+    }
+
+    public void setId(ERABID id) {
+        this.id = id;
+    }
+
+    public ERABDirection getDirection() {
+        return direction;
+    }
+
+    public void setDirection(ERABDirection direction) {
+        this.direction = direction;
+    }
+
+    public ERABType getType() {
+        return type;
+    }
+
+    public void setType(ERABType type) {
+        this.type = type;
+    }
+
+    public QCI getQci() {
+        return qci;
+    }
+
+    public void setQci(QCI qci) {
+        this.qci = qci;
+    }
+
+    public BerInteger getArp() {
+        return arp;
+    }
+
+    public void setArp(BerInteger arp) {
+        this.arp = arp;
+    }
+
+    public BitRate getGbrDl() {
+        return gbrDl;
+    }
+
+    public void setGbrDl(BitRate gbrDl) {
+        this.gbrDl = gbrDl;
+    }
+
+    public BitRate getGbrUl() {
+        return gbrUl;
+    }
+
+    public void setGbrUl(BitRate gbrUl) {
+        this.gbrUl = gbrUl;
+    }
+
+    public BitRate getMbrDl() {
+        return mbrDl;
+    }
+
+    public void setMbrDl(BitRate mbrDl) {
+        this.mbrDl = mbrDl;
+    }
+
+    public BitRate getMbrUl() {
+        return mbrUl;
+    }
+
+    public void setMbrUl(BitRate mbrUl) {
+        this.mbrUl = mbrUl;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += mbrUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 8
+        os.write(0x88);
+        codeLength += 1;
+
+        codeLength += mbrDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 7
+        os.write(0x87);
+        codeLength += 1;
+
+        codeLength += gbrUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 6
+        os.write(0x86);
+        codeLength += 1;
+
+        codeLength += gbrDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 5
+        os.write(0x85);
+        codeLength += 1;
+
+        codeLength += arp.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 4
+        os.write(0x84);
+        codeLength += 1;
+
+        codeLength += qci.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += type.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += direction.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
+        codeLength += 1;
+
+        codeLength += id.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            id = new ERABID();
+            subCodeLength += id.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            direction = new ERABDirection();
+            subCodeLength += direction.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            type = new ERABType();
+            subCodeLength += type.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            qci = new QCI();
+            subCodeLength += qci.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
+            arp = new BerInteger();
+            subCodeLength += arp.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 5)) {
+            gbrDl = new BitRate();
+            subCodeLength += gbrDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 6)) {
+            gbrUl = new BitRate();
+            subCodeLength += gbrUl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 7)) {
+            mbrDl = new BitRate();
+            subCodeLength += mbrDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 8)) {
+            mbrUl = new BitRate();
+            subCodeLength += mbrUl.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (id != null) {
+            sb.append("id: ").append(id);
+        } else {
+            sb.append("id: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (direction != null) {
+            sb.append("direction: ").append(direction);
+        } else {
+            sb.append("direction: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (type != null) {
+            sb.append("type: ").append(type);
+        } else {
+            sb.append("type: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (qci != null) {
+            sb.append("qci: ").append(qci);
+        } else {
+            sb.append("qci: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (arp != null) {
+            sb.append("arp: ").append(arp);
+        } else {
+            sb.append("arp: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (gbrDl != null) {
+            sb.append("gbrDl: ").append(gbrDl);
+        } else {
+            sb.append("gbrDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (gbrUl != null) {
+            sb.append("gbrUl: ").append(gbrUl);
+        } else {
+            sb.append("gbrUl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (mbrDl != null) {
+            sb.append("mbrDl: ").append(mbrDl);
+        } else {
+            sb.append("mbrDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (mbrUl != null) {
+            sb.append("mbrUl: ").append(mbrUl);
+        } else {
+            sb.append("mbrUl: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABResponse.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABResponse.java
new file mode 100644
index 0000000..35b4fa6
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABResponse.java
@@ -0,0 +1,146 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class ERABResponse implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private List<ERABResponseItem> seqOf = null;
+
+    public ERABResponse() {
+        seqOf = new ArrayList<ERABResponseItem>();
+    }
+
+    public ERABResponse(byte[] code) {
+        this.code = code;
+    }
+
+    @JsonValue
+    public List<ERABResponseItem> getERABResponseItem() {
+        if (seqOf == null) {
+            seqOf = new ArrayList<ERABResponseItem>();
+        }
+        return seqOf;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        for (int i = (seqOf.size() - 1); i >= 0; i--) {
+            codeLength += seqOf.get(i).encode(os, true);
+        }
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+        int totalLength = length.val;
+
+        while (subCodeLength < totalLength) {
+            ERABResponseItem element = new ERABResponseItem();
+            subCodeLength += element.decode(is, true);
+            seqOf.add(element);
+        }
+        if (subCodeLength != totalLength) {
+            throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+        }
+        codeLength += subCodeLength;
+
+        return codeLength;
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (seqOf == null) {
+            sb.append("null");
+        } else {
+            Iterator<ERABResponseItem> it = seqOf.iterator();
+            if (it.hasNext()) {
+                it.next().appendAsString(sb, indentLevel + 1);
+                while (it.hasNext()) {
+                    sb.append(",\n");
+                    for (int i = 0; i < indentLevel + 1; i++) {
+                        sb.append("\t");
+                    }
+                    it.next().appendAsString(sb, indentLevel + 1);
+                }
+            }
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABResponseItem.java
similarity index 64%
copy from src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABResponseItem.java
index 7a44283..4fc7e48 100644
--- a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABResponseItem.java
@@ -1,56 +1,49 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.api;
+package org.onosproject.xran.asn1lib.api;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
 
 
-public class PCIARFCN implements Serializable {
+public class ERABResponseItem implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
     @JsonIgnore
     public byte[] code = null;
-    private PhysCellId pci = null;
-    private ARFCNValue earfcnDl = null;
+    private ERABID id = null;
+    private ERABDecision decision = null;
 
-    public PCIARFCN() {
+    public ERABResponseItem() {
     }
 
-    public PCIARFCN(byte[] code) {
+    public ERABResponseItem(byte[] code) {
         this.code = code;
     }
 
-    public static PCIARFCN valueOf(PhysCellId pci, ARFCNValue arfcnValue) {
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setEarfcnDl(arfcnValue);
-        pciarfcn.setPci(pci);
-        return pciarfcn;
+    public ERABID getId() {
+        return id;
     }
 
-    public PhysCellId getPci() {
-        return pci;
+    public void setId(ERABID id) {
+        this.id = id;
     }
 
-    public void setPci(PhysCellId pci) {
-        this.pci = pci;
+    public ERABDecision getDecision() {
+        return decision;
     }
 
-    public ARFCNValue getEarfcnDl() {
-        return earfcnDl;
-    }
-
-    public void setEarfcnDl(ARFCNValue earfcnDl) {
-        this.earfcnDl = earfcnDl;
+    public void setDecision(ERABDecision decision) {
+        this.decision = decision;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -70,12 +63,12 @@
         }
 
         int codeLength = 0;
-        codeLength += earfcnDl.encode(os, false);
+        codeLength += decision.encode(os, false);
         // write tag: CONTEXT_CLASS, PRIMITIVE, 1
         os.write(0x81);
         codeLength += 1;
 
-        codeLength += pci.encode(os, false);
+        codeLength += id.encode(os, false);
         // write tag: CONTEXT_CLASS, PRIMITIVE, 0
         os.write(0x80);
         codeLength += 1;
@@ -111,16 +104,16 @@
 
         subCodeLength += berTag.decode(is);
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-            pci = new PhysCellId();
-            subCodeLength += pci.decode(is, false);
+            id = new ERABID();
+            subCodeLength += id.decode(is, false);
             subCodeLength += berTag.decode(is);
         } else {
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-            earfcnDl = new ARFCNValue();
-            subCodeLength += earfcnDl.decode(is, false);
+            decision = new ERABDecision();
+            subCodeLength += decision.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -149,16 +142,20 @@
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (pci != null) {
-            sb.append("pci: ").append(pci);
+        if (id != null) {
+            sb.append("id: ").append(id);
+        } else {
+            sb.append("id: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (earfcnDl != null) {
-            sb.append("earfcnDl: ").append(earfcnDl);
+        if (decision != null) {
+            sb.append("decision: ").append(decision);
+        } else {
+            sb.append("decision: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -168,20 +165,5 @@
         sb.append("}");
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (o instanceof PCIARFCN) {
-            return pci.equals(((PCIARFCN) o).getPci()) && earfcnDl.equals(((PCIARFCN) o).getEarfcnDl());
-        }
-
-        return super.equals(o);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = pci.hashCode();
-        result = 31 * result + earfcnDl.hashCode();
-        return result;
-    }
 }
 
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABType.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABType.java
new file mode 100644
index 0000000..707eff5
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ERABType.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class ERABType extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public ERABType() {
+    }
+
+    public ERABType(byte[] code) {
+        super(code);
+    }
+
+    public ERABType(BigInteger value) {
+        super(value);
+    }
+
+    public ERABType(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/EUTRANCellIdentifier.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/EUTRANCellIdentifier.java
new file mode 100644
index 0000000..2f1394c
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/EUTRANCellIdentifier.java
@@ -0,0 +1,39 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerBitString;
+
+import java.util.Arrays;
+
+
+public class EUTRANCellIdentifier extends BerBitString {
+
+    private static final long serialVersionUID = 1L;
+
+    public EUTRANCellIdentifier() {
+    }
+
+    public EUTRANCellIdentifier(byte[] code) {
+        super(code);
+    }
+
+    public EUTRANCellIdentifier(byte[] value, int numBits) {
+        super(value, numBits);
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof EUTRANCellIdentifier) {
+            return Arrays.equals(value, ((EUTRANCellIdentifier) obj).value);
+        }
+        return super.equals(obj);
+    }
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/HOFailureCause.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/HOFailureCause.java
new file mode 100644
index 0000000..f37f200
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/HOFailureCause.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class HOFailureCause extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public HOFailureCause() {
+    }
+
+    public HOFailureCause(byte[] code) {
+        super(code);
+    }
+
+    public HOFailureCause(BigInteger value) {
+        super(value);
+    }
+
+    public HOFailureCause(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/Hysteresis.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/Hysteresis.java
new file mode 100644
index 0000000..53c614c
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/Hysteresis.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+
+
+public class Hysteresis extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public Hysteresis() {
+    }
+
+    public Hysteresis(byte[] code) {
+        super(code);
+    }
+
+    public Hysteresis(BigInteger value) {
+        super(value);
+    }
+
+    public Hysteresis(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/L2MeasReportInterval.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/L2MeasReportInterval.java
new file mode 100644
index 0000000..8d23563
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/L2MeasReportInterval.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class L2MeasReportInterval extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public L2MeasReportInterval() {
+    }
+
+    public L2MeasReportInterval(byte[] code) {
+        super(code);
+    }
+
+    public L2MeasReportInterval(BigInteger value) {
+        super(value);
+    }
+
+    public L2MeasReportInterval(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/L2ReportInterval.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/L2ReportInterval.java
new file mode 100644
index 0000000..e3febdb
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/L2ReportInterval.java
@@ -0,0 +1,265 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class L2ReportInterval implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private L2MeasReportInterval tRadioMeasReportPerUe = null;
+    private L2MeasReportInterval tRadioMeasReportPerCell = null;
+    private L2MeasReportInterval tRadioSchedReportPerUe = null;
+    private L2MeasReportInterval tRadioSchedReportPerCell = null;
+    private L2MeasReportInterval tPdcpMeasReportPerUe = null;
+
+    public L2ReportInterval() {
+    }
+
+    public L2ReportInterval(byte[] code) {
+        this.code = code;
+    }
+
+    public L2MeasReportInterval getTRadioMeasReportPerUe() {
+        return tRadioMeasReportPerUe;
+    }
+
+    public void setTRadioMeasReportPerUe(L2MeasReportInterval tRadioMeasReportPerUe) {
+        this.tRadioMeasReportPerUe = tRadioMeasReportPerUe;
+    }
+
+    public L2MeasReportInterval getTRadioMeasReportPerCell() {
+        return tRadioMeasReportPerCell;
+    }
+
+    public void setTRadioMeasReportPerCell(L2MeasReportInterval tRadioMeasReportPerCell) {
+        this.tRadioMeasReportPerCell = tRadioMeasReportPerCell;
+    }
+
+    public L2MeasReportInterval getTRadioSchedReportPerUe() {
+        return tRadioSchedReportPerUe;
+    }
+
+    public void setTRadioSchedReportPerUe(L2MeasReportInterval tRadioSchedReportPerUe) {
+        this.tRadioSchedReportPerUe = tRadioSchedReportPerUe;
+    }
+
+    public L2MeasReportInterval getTRadioSchedReportPerCell() {
+        return tRadioSchedReportPerCell;
+    }
+
+    public void setTRadioSchedReportPerCell(L2MeasReportInterval tRadioSchedReportPerCell) {
+        this.tRadioSchedReportPerCell = tRadioSchedReportPerCell;
+    }
+
+    public L2MeasReportInterval getTPdcpMeasReportPerUe() {
+        return tPdcpMeasReportPerUe;
+    }
+
+    public void setTPdcpMeasReportPerUe(L2MeasReportInterval tPdcpMeasReportPerUe) {
+        this.tPdcpMeasReportPerUe = tPdcpMeasReportPerUe;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += tPdcpMeasReportPerUe.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 4
+        os.write(0x84);
+        codeLength += 1;
+
+        codeLength += tRadioSchedReportPerCell.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += tRadioSchedReportPerUe.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += tRadioMeasReportPerCell.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
+        codeLength += 1;
+
+        codeLength += tRadioMeasReportPerUe.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            tRadioMeasReportPerUe = new L2MeasReportInterval();
+            subCodeLength += tRadioMeasReportPerUe.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            tRadioMeasReportPerCell = new L2MeasReportInterval();
+            subCodeLength += tRadioMeasReportPerCell.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            tRadioSchedReportPerUe = new L2MeasReportInterval();
+            subCodeLength += tRadioSchedReportPerUe.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            tRadioSchedReportPerCell = new L2MeasReportInterval();
+            subCodeLength += tRadioSchedReportPerCell.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
+            tPdcpMeasReportPerUe = new L2MeasReportInterval();
+            subCodeLength += tPdcpMeasReportPerUe.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (tRadioMeasReportPerUe != null) {
+            sb.append("tRadioMeasReportPerUe: ").append(tRadioMeasReportPerUe);
+        } else {
+            sb.append("tRadioMeasReportPerUe: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (tRadioMeasReportPerCell != null) {
+            sb.append("tRadioMeasReportPerCell: ").append(tRadioMeasReportPerCell);
+        } else {
+            sb.append("tRadioMeasReportPerCell: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (tRadioSchedReportPerUe != null) {
+            sb.append("tRadioSchedReportPerUe: ").append(tRadioSchedReportPerUe);
+        } else {
+            sb.append("tRadioSchedReportPerUe: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (tRadioSchedReportPerCell != null) {
+            sb.append("tRadioSchedReportPerCell: ").append(tRadioSchedReportPerCell);
+        } else {
+            sb.append("tRadioSchedReportPerCell: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (tPdcpMeasReportPerUe != null) {
+            sb.append("tPdcpMeasReportPerUe: ").append(tPdcpMeasReportPerUe);
+        } else {
+            sb.append("tPdcpMeasReportPerUe: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MMEUES1APID.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MMEUES1APID.java
new file mode 100644
index 0000000..d8876bc
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MMEUES1APID.java
@@ -0,0 +1,44 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+import java.util.Objects;
+
+
+public class MMEUES1APID extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public MMEUES1APID() {
+    }
+
+    public MMEUES1APID(byte[] code) {
+        super(code);
+    }
+
+    public MMEUES1APID(BigInteger value) {
+        super(value);
+    }
+
+    public MMEUES1APID(long value) {
+        super(value);
+    }
+
+    @Override
+    public int hashCode() {
+        return value.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof MMEUES1APID) {
+            return Objects.equals(value, ((MMEUES1APID) obj).value);
+        }
+        return super.equals(obj);
+    }
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MeasID.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MeasID.java
new file mode 100644
index 0000000..e2f1be7
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MeasID.java
@@ -0,0 +1,615 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerBoolean;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class MeasID implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private BerInteger measobjectId = null;
+    private BerInteger reportconfigId = null;
+    private Action action = null;
+    public MeasID() {
+    }
+
+    public MeasID(byte[] code) {
+        this.code = code;
+    }
+
+    public BerInteger getMeasobjectId() {
+        return measobjectId;
+    }
+
+    public void setMeasobjectId(BerInteger measobjectId) {
+        this.measobjectId = measobjectId;
+    }
+
+    public BerInteger getReportconfigId() {
+        return reportconfigId;
+    }
+
+    public void setReportconfigId(BerInteger reportconfigId) {
+        this.reportconfigId = reportconfigId;
+    }
+
+    public Action getAction() {
+        return action;
+    }
+
+    public void setAction(Action action) {
+        this.action = action;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        int sublength;
+
+        sublength = action.encode(os);
+        codeLength += sublength;
+        codeLength += BerLength.encodeLength(os, sublength);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += reportconfigId.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
+        codeLength += 1;
+
+        codeLength += measobjectId.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            measobjectId = new BerInteger();
+            subCodeLength += measobjectId.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            reportconfigId = new BerInteger();
+            subCodeLength += reportconfigId.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            subCodeLength += length.decode(is);
+            action = new Action();
+            subCodeLength += action.decode(is, null);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (measobjectId != null) {
+            sb.append("measobjectId: ").append(measobjectId);
+        } else {
+            sb.append("measobjectId: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (reportconfigId != null) {
+            sb.append("reportconfigId: ").append(reportconfigId);
+        } else {
+            sb.append("reportconfigId: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (action != null) {
+            sb.append("action: ");
+            action.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("action: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class Action implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        @JsonIgnore
+        public byte[] code = null;
+        private Addmeasid addmeasid = null;
+        private Delmeasid delmeasid = null;
+        private BerBoolean hototarget = null;
+        public Action() {
+        }
+        public Action(byte[] code) {
+            this.code = code;
+        }
+
+        public Addmeasid getAddmeasid() {
+            return addmeasid;
+        }
+
+        public void setAddmeasid(Addmeasid addmeasid) {
+            this.addmeasid = addmeasid;
+        }
+
+        public Delmeasid getDelmeasid() {
+            return delmeasid;
+        }
+
+        public void setDelmeasid(Delmeasid delmeasid) {
+            this.delmeasid = delmeasid;
+        }
+
+        public BerBoolean getHototarget() {
+            return hototarget;
+        }
+
+        public void setHototarget(BerBoolean hototarget) {
+            this.hototarget = hototarget;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            if (hototarget != null) {
+                codeLength += hototarget.encode(os, false);
+                // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+                os.write(0x82);
+                codeLength += 1;
+                return codeLength;
+            }
+
+            if (delmeasid != null) {
+                codeLength += delmeasid.encode(os, false);
+                // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+                os.write(0xA1);
+                codeLength += 1;
+                return codeLength;
+            }
+
+            if (addmeasid != null) {
+                codeLength += addmeasid.encode(os, false);
+                // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+                os.write(0xA0);
+                codeLength += 1;
+                return codeLength;
+            }
+
+            throw new IOException("Error encoding CHOICE: No element of CHOICE was selected.");
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, null);
+        }
+
+        public int decode(InputStream is, BerTag berTag) throws IOException {
+
+            int codeLength = 0;
+            BerTag passedTag = berTag;
+
+            if (berTag == null) {
+                berTag = new BerTag();
+                codeLength += berTag.decode(is);
+            }
+
+            if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+                addmeasid = new Addmeasid();
+                codeLength += addmeasid.decode(is, false);
+                return codeLength;
+            }
+
+            if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+                delmeasid = new Delmeasid();
+                codeLength += delmeasid.decode(is, false);
+                return codeLength;
+            }
+
+            if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+                hototarget = new BerBoolean();
+                codeLength += hototarget.decode(is, false);
+                return codeLength;
+            }
+
+            if (passedTag != null) {
+                return 0;
+            }
+
+            throw new IOException("Error decoding CHOICE: Tag " + berTag + " matched to no item.");
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            if (addmeasid != null) {
+                sb.append("addmeasid: ");
+                addmeasid.appendAsString(sb, indentLevel + 1);
+                return;
+            }
+
+            if (delmeasid != null) {
+                sb.append("delmeasid: ");
+                delmeasid.appendAsString(sb, indentLevel + 1);
+                return;
+            }
+
+            if (hototarget != null) {
+                sb.append("hototarget: ").append(hototarget);
+                return;
+            }
+
+            sb.append("<none>");
+        }
+
+        public static class Addmeasid implements Serializable {
+
+            public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+            private static final long serialVersionUID = 1L;
+            @JsonIgnore
+            public byte[] code = null;
+            private List<BerInteger> seqOf = null;
+
+            public Addmeasid() {
+                seqOf = new ArrayList<BerInteger>();
+            }
+
+            public Addmeasid(byte[] code) {
+                this.code = code;
+            }
+
+            @JsonValue
+            public List<BerInteger> getBerInteger() {
+                if (seqOf == null) {
+                    seqOf = new ArrayList<BerInteger>();
+                }
+                return seqOf;
+            }
+
+            public int encode(BerByteArrayOutputStream os) throws IOException {
+                return encode(os, true);
+            }
+
+            public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+                if (code != null) {
+                    for (int i = code.length - 1; i >= 0; i--) {
+                        os.write(code[i]);
+                    }
+                    if (withTag) {
+                        return tag.encode(os) + code.length;
+                    }
+                    return code.length;
+                }
+
+                int codeLength = 0;
+                for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                    codeLength += seqOf.get(i).encode(os, true);
+                }
+
+                codeLength += BerLength.encodeLength(os, codeLength);
+
+                if (withTag) {
+                    codeLength += tag.encode(os);
+                }
+
+                return codeLength;
+            }
+
+            public int decode(InputStream is) throws IOException {
+                return decode(is, true);
+            }
+
+            public int decode(InputStream is, boolean withTag) throws IOException {
+                int codeLength = 0;
+                int subCodeLength = 0;
+                if (withTag) {
+                    codeLength += tag.decodeAndCheck(is);
+                }
+
+                BerLength length = new BerLength();
+                codeLength += length.decode(is);
+                int totalLength = length.val;
+
+                while (subCodeLength < totalLength) {
+                    BerInteger element = new BerInteger();
+                    subCodeLength += element.decode(is, true);
+                    seqOf.add(element);
+                }
+                if (subCodeLength != totalLength) {
+                    throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+                }
+                codeLength += subCodeLength;
+
+                return codeLength;
+            }
+
+            public void encodeAndSave(int encodingSizeGuess) throws IOException {
+                BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+                encode(os, false);
+                code = os.getArray();
+            }
+
+            public String toString() {
+                StringBuilder sb = new StringBuilder();
+                appendAsString(sb, 0);
+                return sb.toString();
+            }
+
+            public void appendAsString(StringBuilder sb, int indentLevel) {
+
+                sb.append("{\n");
+                for (int i = 0; i < indentLevel + 1; i++) {
+                    sb.append("\t");
+                }
+                if (seqOf == null) {
+                    sb.append("null");
+                } else {
+                    Iterator<BerInteger> it = seqOf.iterator();
+                    if (it.hasNext()) {
+                        sb.append(it.next());
+                        while (it.hasNext()) {
+                            sb.append(",\n");
+                            for (int i = 0; i < indentLevel + 1; i++) {
+                                sb.append("\t");
+                            }
+                            sb.append(it.next());
+                        }
+                    }
+                }
+
+                sb.append("\n");
+                for (int i = 0; i < indentLevel; i++) {
+                    sb.append("\t");
+                }
+                sb.append("}");
+            }
+
+        }
+
+        public static class Delmeasid implements Serializable {
+
+            public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+            private static final long serialVersionUID = 1L;
+            @JsonIgnore
+            public byte[] code = null;
+            private List<BerInteger> seqOf = null;
+
+            public Delmeasid() {
+                seqOf = new ArrayList<BerInteger>();
+            }
+
+            public Delmeasid(byte[] code) {
+                this.code = code;
+            }
+
+            @JsonValue
+            public List<BerInteger> getBerInteger() {
+                if (seqOf == null) {
+                    seqOf = new ArrayList<BerInteger>();
+                }
+                return seqOf;
+            }
+
+            public int encode(BerByteArrayOutputStream os) throws IOException {
+                return encode(os, true);
+            }
+
+            public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+                if (code != null) {
+                    for (int i = code.length - 1; i >= 0; i--) {
+                        os.write(code[i]);
+                    }
+                    if (withTag) {
+                        return tag.encode(os) + code.length;
+                    }
+                    return code.length;
+                }
+
+                int codeLength = 0;
+                for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                    codeLength += seqOf.get(i).encode(os, true);
+                }
+
+                codeLength += BerLength.encodeLength(os, codeLength);
+
+                if (withTag) {
+                    codeLength += tag.encode(os);
+                }
+
+                return codeLength;
+            }
+
+            public int decode(InputStream is) throws IOException {
+                return decode(is, true);
+            }
+
+            public int decode(InputStream is, boolean withTag) throws IOException {
+                int codeLength = 0;
+                int subCodeLength = 0;
+                if (withTag) {
+                    codeLength += tag.decodeAndCheck(is);
+                }
+
+                BerLength length = new BerLength();
+                codeLength += length.decode(is);
+                int totalLength = length.val;
+
+                while (subCodeLength < totalLength) {
+                    BerInteger element = new BerInteger();
+                    subCodeLength += element.decode(is, true);
+                    seqOf.add(element);
+                }
+                if (subCodeLength != totalLength) {
+                    throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+                }
+                codeLength += subCodeLength;
+
+                return codeLength;
+            }
+
+            public void encodeAndSave(int encodingSizeGuess) throws IOException {
+                BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+                encode(os, false);
+                code = os.getArray();
+            }
+
+            public String toString() {
+                StringBuilder sb = new StringBuilder();
+                appendAsString(sb, 0);
+                return sb.toString();
+            }
+
+            public void appendAsString(StringBuilder sb, int indentLevel) {
+
+                sb.append("{\n");
+                for (int i = 0; i < indentLevel + 1; i++) {
+                    sb.append("\t");
+                }
+                if (seqOf == null) {
+                    sb.append("null");
+                } else {
+                    Iterator<BerInteger> it = seqOf.iterator();
+                    if (it.hasNext()) {
+                        sb.append(it.next());
+                        while (it.hasNext()) {
+                            sb.append(",\n");
+                            for (int i = 0; i < indentLevel + 1; i++) {
+                                sb.append("\t");
+                            }
+                            sb.append(it.next());
+                        }
+                    }
+                }
+
+                sb.append("\n");
+                for (int i = 0; i < indentLevel; i++) {
+                    sb.append("\t");
+                }
+                sb.append("}");
+            }
+
+        }
+
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MeasObject.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MeasObject.java
new file mode 100644
index 0000000..7c9f73f
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/MeasObject.java
@@ -0,0 +1,328 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class MeasObject implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ARFCNValue dlFreq = null;
+    private MeasCells measCells = null;
+    public MeasObject() {
+    }
+
+    public MeasObject(byte[] code) {
+        this.code = code;
+    }
+
+    public ARFCNValue getDlFreq() {
+        return dlFreq;
+    }
+
+    public void setDlFreq(ARFCNValue dlFreq) {
+        this.dlFreq = dlFreq;
+    }
+
+    public MeasCells getMeasCells() {
+        return measCells;
+    }
+
+    public void setMeasCells(MeasCells measCells) {
+        this.measCells = measCells;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        if (measCells != null) {
+            codeLength += measCells.encode(os, false);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+            os.write(0xA1);
+            codeLength += 1;
+        }
+
+        codeLength += dlFreq.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            dlFreq = new ARFCNValue();
+            subCodeLength += dlFreq.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            measCells = new MeasCells();
+            subCodeLength += measCells.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (dlFreq != null) {
+            sb.append("dlFreq: ").append(dlFreq);
+        } else {
+            sb.append("dlFreq: <empty-required-field>");
+        }
+
+        if (measCells != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("measCells: ");
+            measCells.appendAsString(sb, indentLevel + 1);
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class MeasCells implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private PhysCellId pci = null;
+        private QOffsetRange cellIndividualOffset = null;
+
+        public MeasCells() {
+        }
+
+        public MeasCells(byte[] code) {
+            this.code = code;
+        }
+
+        public PhysCellId getPci() {
+            return pci;
+        }
+
+        public void setPci(PhysCellId pci) {
+            this.pci = pci;
+        }
+
+        public QOffsetRange getCellIndividualOffset() {
+            return cellIndividualOffset;
+        }
+
+        public void setCellIndividualOffset(QOffsetRange cellIndividualOffset) {
+            this.cellIndividualOffset = cellIndividualOffset;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            if (cellIndividualOffset != null) {
+                codeLength += cellIndividualOffset.encode(os, false);
+                // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+                os.write(0x81);
+                codeLength += 1;
+            }
+
+            codeLength += pci.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+            os.write(0x80);
+            codeLength += 1;
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            BerTag berTag = new BerTag();
+
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+
+            int totalLength = length.val;
+            codeLength += totalLength;
+
+            subCodeLength += berTag.decode(is);
+            if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+                pci = new PhysCellId();
+                subCodeLength += pci.decode(is, false);
+                if (subCodeLength == totalLength) {
+                    return codeLength;
+                }
+                subCodeLength += berTag.decode(is);
+            } else {
+                throw new IOException("Tag does not match the mandatory sequence element tag.");
+            }
+
+            if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+                cellIndividualOffset = new QOffsetRange();
+                subCodeLength += cellIndividualOffset.decode(is, false);
+                if (subCodeLength == totalLength) {
+                    return codeLength;
+                }
+            }
+            throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{");
+            sb.append("\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (pci != null) {
+                sb.append("pci: ").append(pci);
+            } else {
+                sb.append("pci: <empty-required-field>");
+            }
+
+            if (cellIndividualOffset != null) {
+                sb.append(",\n");
+                for (int i = 0; i < indentLevel + 1; i++) {
+                    sb.append("\t");
+                }
+                sb.append("cellIndividualOffset: ").append(cellIndividualOffset);
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PCIARFCN.java
similarity index 89%
rename from src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PCIARFCN.java
index 7a44283..5d50d9e 100644
--- a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PCIARFCN.java
@@ -1,13 +1,13 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.api;
+package org.onosproject.xran.asn1lib.api;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -30,13 +30,6 @@
         this.code = code;
     }
 
-    public static PCIARFCN valueOf(PhysCellId pci, ARFCNValue arfcnValue) {
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setEarfcnDl(arfcnValue);
-        pciarfcn.setPci(pci);
-        return pciarfcn;
-    }
-
     public PhysCellId getPci() {
         return pci;
     }
@@ -151,6 +144,8 @@
         }
         if (pci != null) {
             sb.append("pci: ").append(pci);
+        } else {
+            sb.append("pci: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -159,6 +154,8 @@
         }
         if (earfcnDl != null) {
             sb.append("earfcnDl: ").append(earfcnDl);
+        } else {
+            sb.append("earfcnDl: <empty-required-field>");
         }
 
         sb.append("\n");
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PLMNIdentity.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PLMNIdentity.java
similarity index 77%
rename from src/main/java/org.onosproject.xran/codecs/api/PLMNIdentity.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PLMNIdentity.java
index 39f0ec9..0d3a8c6 100644
--- a/src/main/java/org.onosproject.xran/codecs/api/PLMNIdentity.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PLMNIdentity.java
@@ -1,10 +1,10 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.api;
+package org.onosproject.xran.asn1lib.api;
 
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.util.Arrays;
 
@@ -32,5 +32,4 @@
         }
         return super.equals(obj);
     }
-
 }
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PRBUsage.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PRBUsage.java
new file mode 100644
index 0000000..c7d846a
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PRBUsage.java
@@ -0,0 +1,426 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class PRBUsage implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private PrbUsageDl prbUsageDl = null;
+    private PrbUsageUl prbUsageUl = null;
+    public PRBUsage() {
+    }
+    public PRBUsage(byte[] code) {
+        this.code = code;
+    }
+
+    public PrbUsageDl getPrbUsageDl() {
+        return prbUsageDl;
+    }
+
+    public void setPrbUsageDl(PrbUsageDl prbUsageDl) {
+        this.prbUsageDl = prbUsageDl;
+    }
+
+    public PrbUsageUl getPrbUsageUl() {
+        return prbUsageUl;
+    }
+
+    public void setPrbUsageUl(PrbUsageUl prbUsageUl) {
+        this.prbUsageUl = prbUsageUl;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += prbUsageUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += prbUsageDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            prbUsageDl = new PrbUsageDl();
+            subCodeLength += prbUsageDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            prbUsageUl = new PrbUsageUl();
+            subCodeLength += prbUsageUl.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (prbUsageDl != null) {
+            sb.append("prbUsageDl: ");
+            prbUsageDl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("prbUsageDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (prbUsageUl != null) {
+            sb.append("prbUsageUl: ");
+            prbUsageUl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("prbUsageUl: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class PrbUsageDl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public PrbUsageDl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public PrbUsageDl(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class PrbUsageUl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public PrbUsageUl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public PrbUsageUl(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PerParam.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PerParam.java
new file mode 100644
index 0000000..c287c2e
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PerParam.java
@@ -0,0 +1,138 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class PerParam implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private BerEnum reportIntervalMs = null;
+
+    public PerParam() {
+    }
+
+    public PerParam(byte[] code) {
+        this.code = code;
+    }
+
+    public BerEnum getReportIntervalMs() {
+        return reportIntervalMs;
+    }
+
+    public void setReportIntervalMs(BerEnum reportIntervalMs) {
+        this.reportIntervalMs = reportIntervalMs;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += reportIntervalMs.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            reportIntervalMs = new BerEnum();
+            subCodeLength += reportIntervalMs.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (reportIntervalMs != null) {
+            sb.append("reportIntervalMs: ").append(reportIntervalMs);
+        } else {
+            sb.append("reportIntervalMs: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PhysCellId.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PhysCellId.java
new file mode 100644
index 0000000..f875fee
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PhysCellId.java
@@ -0,0 +1,43 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+
+
+public class PhysCellId extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public PhysCellId() {
+    }
+
+    public PhysCellId(byte[] code) {
+        super(code);
+    }
+
+    public PhysCellId(BigInteger value) {
+        super(value);
+    }
+
+    public PhysCellId(long value) {
+        super(value);
+    }
+
+    @Override
+    public int hashCode() {
+        return value.intValue();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof PhysCellId) {
+            return value.intValue() == ((PhysCellId) obj).value.intValue();
+        }
+        return super.equals(obj);
+    }
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PropScell.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PropScell.java
new file mode 100644
index 0000000..7f84337
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/PropScell.java
@@ -0,0 +1,237 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerBoolean;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class PropScell implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private PCIARFCN pciArfcn = null;
+    private BerBoolean crossCarrierSchedEnable = null;
+    private BerEnum caDirection = null;
+    private BerInteger deactTimer = null;
+
+    public PropScell() {
+    }
+
+    public PropScell(byte[] code) {
+        this.code = code;
+    }
+
+    public PCIARFCN getPciArfcn() {
+        return pciArfcn;
+    }
+
+    public void setPciArfcn(PCIARFCN pciArfcn) {
+        this.pciArfcn = pciArfcn;
+    }
+
+    public BerBoolean getCrossCarrierSchedEnable() {
+        return crossCarrierSchedEnable;
+    }
+
+    public void setCrossCarrierSchedEnable(BerBoolean crossCarrierSchedEnable) {
+        this.crossCarrierSchedEnable = crossCarrierSchedEnable;
+    }
+
+    public BerEnum getCaDirection() {
+        return caDirection;
+    }
+
+    public void setCaDirection(BerEnum caDirection) {
+        this.caDirection = caDirection;
+    }
+
+    public BerInteger getDeactTimer() {
+        return deactTimer;
+    }
+
+    public void setDeactTimer(BerInteger deactTimer) {
+        this.deactTimer = deactTimer;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += deactTimer.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += caDirection.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += crossCarrierSchedEnable.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
+        codeLength += 1;
+
+        codeLength += pciArfcn.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            pciArfcn = new PCIARFCN();
+            subCodeLength += pciArfcn.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            crossCarrierSchedEnable = new BerBoolean();
+            subCodeLength += crossCarrierSchedEnable.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            caDirection = new BerEnum();
+            subCodeLength += caDirection.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            deactTimer = new BerInteger();
+            subCodeLength += deactTimer.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pciArfcn != null) {
+            sb.append("pciArfcn: ");
+            pciArfcn.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pciArfcn: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crossCarrierSchedEnable != null) {
+            sb.append("crossCarrierSchedEnable: ").append(crossCarrierSchedEnable);
+        } else {
+            sb.append("crossCarrierSchedEnable: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (caDirection != null) {
+            sb.append("caDirection: ").append(caDirection);
+        } else {
+            sb.append("caDirection: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (deactTimer != null) {
+            sb.append("deactTimer: ").append(deactTimer);
+        } else {
+            sb.append("deactTimer: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/QCI.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/QCI.java
new file mode 100644
index 0000000..e8b2bee
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/QCI.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+
+
+public class QCI extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public QCI() {
+    }
+
+    public QCI(byte[] code) {
+        super(code);
+    }
+
+    public QCI(BigInteger value) {
+        super(value);
+    }
+
+    public QCI(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/QOffsetRange.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/QOffsetRange.java
new file mode 100644
index 0000000..4eb2577
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/QOffsetRange.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class QOffsetRange extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public QOffsetRange() {
+    }
+
+    public QOffsetRange(byte[] code) {
+        super(code);
+    }
+
+    public QOffsetRange(BigInteger value) {
+        super(value);
+    }
+
+    public QOffsetRange(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RSRPRange.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RSRPRange.java
new file mode 100644
index 0000000..836d36b
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RSRPRange.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+
+
+public class RSRPRange extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public RSRPRange() {
+    }
+
+    public RSRPRange(byte[] code) {
+        super(code);
+    }
+
+    public RSRPRange(BigInteger value) {
+        super(value);
+    }
+
+    public RSRPRange(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RSRQRange.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RSRQRange.java
new file mode 100644
index 0000000..f34b201
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RSRQRange.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.math.BigInteger;
+
+
+public class RSRQRange extends BerInteger {
+
+    private static final long serialVersionUID = 1L;
+
+    public RSRQRange() {
+    }
+
+    public RSRQRange(byte[] code) {
+        super(code);
+    }
+
+    public RSRQRange(BigInteger value) {
+        super(value);
+    }
+
+    public RSRQRange(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RXSigReport.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RXSigReport.java
new file mode 100644
index 0000000..afd630a
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RXSigReport.java
@@ -0,0 +1,240 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class RXSigReport implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private PCIARFCN pciArfcn = null;
+    private ECGI ecgi = null;
+    private RSRPRange rsrp = null;
+    private RSRQRange rsrq = null;
+
+    public RXSigReport() {
+    }
+
+    public RXSigReport(byte[] code) {
+        this.code = code;
+    }
+
+    public PCIARFCN getPciArfcn() {
+        return pciArfcn;
+    }
+
+    public void setPciArfcn(PCIARFCN pciArfcn) {
+        this.pciArfcn = pciArfcn;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public RSRPRange getRsrp() {
+        return rsrp;
+    }
+
+    public void setRsrp(RSRPRange rsrp) {
+        this.rsrp = rsrp;
+    }
+
+    public RSRQRange getRsrq() {
+        return rsrq;
+    }
+
+    public void setRsrq(RSRQRange rsrq) {
+        this.rsrq = rsrq;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        if (rsrq != null) {
+            codeLength += rsrq.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+            os.write(0x83);
+            codeLength += 1;
+        }
+
+        if (rsrp != null) {
+            codeLength += rsrp.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+            os.write(0x82);
+            codeLength += 1;
+        }
+
+        if (ecgi != null) {
+            codeLength += ecgi.encode(os, false);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+            os.write(0xA1);
+            codeLength += 1;
+        }
+
+        codeLength += pciArfcn.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            pciArfcn = new PCIARFCN();
+            subCodeLength += pciArfcn.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            rsrp = new RSRPRange();
+            subCodeLength += rsrp.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            rsrq = new RSRQRange();
+            subCodeLength += rsrq.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pciArfcn != null) {
+            sb.append("pciArfcn: ");
+            pciArfcn.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pciArfcn: <empty-required-field>");
+        }
+
+        if (ecgi != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        }
+
+        if (rsrp != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("rsrp: ").append(rsrp);
+        }
+
+        if (rsrq != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("rsrq: ").append(rsrq);
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RadioRepPerServCell.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RadioRepPerServCell.java
new file mode 100644
index 0000000..e6607cf
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RadioRepPerServCell.java
@@ -0,0 +1,777 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class RadioRepPerServCell implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgi = null;
+    private CqiHist cqiHist = null;
+    private RiHist riHist = null;
+    private PuschSinrHist puschSinrHist = null;
+    private PucchSinrHist pucchSinrHist = null;
+    public RadioRepPerServCell() {
+    }
+    public RadioRepPerServCell(byte[] code) {
+        this.code = code;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public CqiHist getCqiHist() {
+        return cqiHist;
+    }
+
+    public void setCqiHist(CqiHist cqiHist) {
+        this.cqiHist = cqiHist;
+    }
+
+    public RiHist getRiHist() {
+        return riHist;
+    }
+
+    public void setRiHist(RiHist riHist) {
+        this.riHist = riHist;
+    }
+
+    public PuschSinrHist getPuschSinrHist() {
+        return puschSinrHist;
+    }
+
+    public void setPuschSinrHist(PuschSinrHist puschSinrHist) {
+        this.puschSinrHist = puschSinrHist;
+    }
+
+    public PucchSinrHist getPucchSinrHist() {
+        return pucchSinrHist;
+    }
+
+    public void setPucchSinrHist(PucchSinrHist pucchSinrHist) {
+        this.pucchSinrHist = pucchSinrHist;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += pucchSinrHist.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
+        os.write(0xA4);
+        codeLength += 1;
+
+        codeLength += puschSinrHist.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
+        codeLength += riHist.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += cqiHist.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            cqiHist = new CqiHist();
+            subCodeLength += cqiHist.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            riHist = new RiHist();
+            subCodeLength += riHist.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            puschSinrHist = new PuschSinrHist();
+            subCodeLength += puschSinrHist.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
+            pucchSinrHist = new PucchSinrHist();
+            subCodeLength += pucchSinrHist.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (cqiHist != null) {
+            sb.append("cqiHist: ");
+            cqiHist.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("cqiHist: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (riHist != null) {
+            sb.append("riHist: ");
+            riHist.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("riHist: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (puschSinrHist != null) {
+            sb.append("puschSinrHist: ");
+            puschSinrHist.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("puschSinrHist: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pucchSinrHist != null) {
+            sb.append("pucchSinrHist: ");
+            pucchSinrHist.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pucchSinrHist: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class CqiHist implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public CqiHist() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public CqiHist(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class RiHist implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public RiHist() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public RiHist(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class PuschSinrHist implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public PuschSinrHist() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public PuschSinrHist(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class PucchSinrHist implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public PucchSinrHist() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public PucchSinrHist(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ReconfIndReason.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ReconfIndReason.java
new file mode 100644
index 0000000..54ebc11
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ReconfIndReason.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class ReconfIndReason extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public ReconfIndReason() {
+    }
+
+    public ReconfIndReason(byte[] code) {
+        super(code);
+    }
+
+    public ReconfIndReason(BigInteger value) {
+        super(value);
+    }
+
+    public ReconfIndReason(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RelCause.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RelCause.java
new file mode 100644
index 0000000..eb4b62e
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/RelCause.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class RelCause extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public RelCause() {
+    }
+
+    public RelCause(byte[] code) {
+        super(code);
+    }
+
+    public RelCause(BigInteger value) {
+        super(value);
+    }
+
+    public RelCause(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ReportConfig.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ReportConfig.java
new file mode 100644
index 0000000..c7314a6
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ReportConfig.java
@@ -0,0 +1,662 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class ReportConfig implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ReportParams reportParams = null;
+    private BerEnum triggerQuantity = null;
+    private BerEnum reportQuantity = null;
+    public ReportConfig() {
+    }
+
+    public ReportConfig(byte[] code) {
+        this.code = code;
+    }
+
+    public ReportParams getReportParams() {
+        return reportParams;
+    }
+
+    public void setReportParams(ReportParams reportParams) {
+        this.reportParams = reportParams;
+    }
+
+    public BerEnum getTriggerQuantity() {
+        return triggerQuantity;
+    }
+
+    public void setTriggerQuantity(BerEnum triggerQuantity) {
+        this.triggerQuantity = triggerQuantity;
+    }
+
+    public BerEnum getReportQuantity() {
+        return reportQuantity;
+    }
+
+    public void setReportQuantity(BerEnum reportQuantity) {
+        this.reportQuantity = reportQuantity;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += reportQuantity.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += triggerQuantity.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
+        codeLength += 1;
+
+        codeLength += reportParams.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            reportParams = new ReportParams();
+            subCodeLength += reportParams.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            triggerQuantity = new BerEnum();
+            subCodeLength += triggerQuantity.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            reportQuantity = new BerEnum();
+            subCodeLength += reportQuantity.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (reportParams != null) {
+            sb.append("reportParams: ");
+            reportParams.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("reportParams: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (triggerQuantity != null) {
+            sb.append("triggerQuantity: ").append(triggerQuantity);
+        } else {
+            sb.append("triggerQuantity: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (reportQuantity != null) {
+            sb.append("reportQuantity: ").append(reportQuantity);
+        } else {
+            sb.append("reportQuantity: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class ReportParams implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private Params params = null;
+        private Hysteresis hysteresis = null;
+        private TimeToTrigger timetotrigger = null;
+        public ReportParams() {
+        }
+
+        public ReportParams(byte[] code) {
+            this.code = code;
+        }
+
+        public Params getParams() {
+            return params;
+        }
+
+        public void setParams(Params params) {
+            this.params = params;
+        }
+
+        public Hysteresis getHysteresis() {
+            return hysteresis;
+        }
+
+        public void setHysteresis(Hysteresis hysteresis) {
+            this.hysteresis = hysteresis;
+        }
+
+        public TimeToTrigger getTimetotrigger() {
+            return timetotrigger;
+        }
+
+        public void setTimetotrigger(TimeToTrigger timetotrigger) {
+            this.timetotrigger = timetotrigger;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            int sublength;
+
+            codeLength += timetotrigger.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+            os.write(0x82);
+            codeLength += 1;
+
+            codeLength += hysteresis.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+            os.write(0x81);
+            codeLength += 1;
+
+            sublength = params.encode(os);
+            codeLength += sublength;
+            codeLength += BerLength.encodeLength(os, sublength);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+            os.write(0xA0);
+            codeLength += 1;
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            BerTag berTag = new BerTag();
+
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+
+            int totalLength = length.val;
+            codeLength += totalLength;
+
+            subCodeLength += berTag.decode(is);
+            if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+                subCodeLength += length.decode(is);
+                params = new Params();
+                subCodeLength += params.decode(is, null);
+                subCodeLength += berTag.decode(is);
+            } else {
+                throw new IOException("Tag does not match the mandatory sequence element tag.");
+            }
+
+            if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+                hysteresis = new Hysteresis();
+                subCodeLength += hysteresis.decode(is, false);
+                subCodeLength += berTag.decode(is);
+            } else {
+                throw new IOException("Tag does not match the mandatory sequence element tag.");
+            }
+
+            if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+                timetotrigger = new TimeToTrigger();
+                subCodeLength += timetotrigger.decode(is, false);
+                if (subCodeLength == totalLength) {
+                    return codeLength;
+                }
+            }
+            throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{");
+            sb.append("\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (params != null) {
+                sb.append("params: ");
+                params.appendAsString(sb, indentLevel + 1);
+            } else {
+                sb.append("params: <empty-required-field>");
+            }
+
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (hysteresis != null) {
+                sb.append("hysteresis: ").append(hysteresis);
+            } else {
+                sb.append("hysteresis: <empty-required-field>");
+            }
+
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (timetotrigger != null) {
+                sb.append("timetotrigger: ").append(timetotrigger);
+            } else {
+                sb.append("timetotrigger: <empty-required-field>");
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+        public static class Params implements Serializable {
+
+            private static final long serialVersionUID = 1L;
+
+            @JsonIgnore
+            public byte[] code = null;
+            private PerParam perParam = null;
+            private A1Param a1param = null;
+            private A2Param a2param = null;
+            private A3Param a3param = null;
+            private A4Param a4param = null;
+            private A5Param a5param = null;
+            private A6Param a6param = null;
+
+            public Params() {
+            }
+
+            public Params(byte[] code) {
+                this.code = code;
+            }
+
+            public PerParam getPerParam() {
+                return perParam;
+            }
+
+            public void setPerParam(PerParam perParam) {
+                this.perParam = perParam;
+            }
+
+            public A1Param getA1param() {
+                return a1param;
+            }
+
+            public void setA1param(A1Param a1param) {
+                this.a1param = a1param;
+            }
+
+            public A2Param getA2param() {
+                return a2param;
+            }
+
+            public void setA2param(A2Param a2param) {
+                this.a2param = a2param;
+            }
+
+            public A3Param getA3param() {
+                return a3param;
+            }
+
+            public void setA3param(A3Param a3param) {
+                this.a3param = a3param;
+            }
+
+            public A4Param getA4param() {
+                return a4param;
+            }
+
+            public void setA4param(A4Param a4param) {
+                this.a4param = a4param;
+            }
+
+            public A5Param getA5param() {
+                return a5param;
+            }
+
+            public void setA5param(A5Param a5param) {
+                this.a5param = a5param;
+            }
+
+            public A6Param getA6param() {
+                return a6param;
+            }
+
+            public void setA6param(A6Param a6param) {
+                this.a6param = a6param;
+            }
+
+            public int encode(BerByteArrayOutputStream os) throws IOException {
+
+                if (code != null) {
+                    for (int i = code.length - 1; i >= 0; i--) {
+                        os.write(code[i]);
+                    }
+                    return code.length;
+                }
+
+                int codeLength = 0;
+                if (a6param != null) {
+                    codeLength += a6param.encode(os, false);
+                    // write tag: CONTEXT_CLASS, CONSTRUCTED, 6
+                    os.write(0xA6);
+                    codeLength += 1;
+                    return codeLength;
+                }
+
+                if (a5param != null) {
+                    codeLength += a5param.encode(os, false);
+                    // write tag: CONTEXT_CLASS, CONSTRUCTED, 5
+                    os.write(0xA5);
+                    codeLength += 1;
+                    return codeLength;
+                }
+
+                if (a4param != null) {
+                    codeLength += a4param.encode(os, false);
+                    // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
+                    os.write(0xA4);
+                    codeLength += 1;
+                    return codeLength;
+                }
+
+                if (a3param != null) {
+                    codeLength += a3param.encode(os, false);
+                    // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+                    os.write(0xA3);
+                    codeLength += 1;
+                    return codeLength;
+                }
+
+                if (a2param != null) {
+                    codeLength += a2param.encode(os, false);
+                    // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+                    os.write(0xA2);
+                    codeLength += 1;
+                    return codeLength;
+                }
+
+                if (a1param != null) {
+                    codeLength += a1param.encode(os, false);
+                    // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+                    os.write(0xA1);
+                    codeLength += 1;
+                    return codeLength;
+                }
+
+                if (perParam != null) {
+                    codeLength += perParam.encode(os, false);
+                    // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+                    os.write(0xA0);
+                    codeLength += 1;
+                    return codeLength;
+                }
+
+                throw new IOException("Error encoding CHOICE: No element of CHOICE was selected.");
+            }
+
+            public int decode(InputStream is) throws IOException {
+                return decode(is, null);
+            }
+
+            public int decode(InputStream is, BerTag berTag) throws IOException {
+
+                int codeLength = 0;
+                BerTag passedTag = berTag;
+
+                if (berTag == null) {
+                    berTag = new BerTag();
+                    codeLength += berTag.decode(is);
+                }
+
+                if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+                    perParam = new PerParam();
+                    codeLength += perParam.decode(is, false);
+                    return codeLength;
+                }
+
+                if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+                    a1param = new A1Param();
+                    codeLength += a1param.decode(is, false);
+                    return codeLength;
+                }
+
+                if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+                    a2param = new A2Param();
+                    codeLength += a2param.decode(is, false);
+                    return codeLength;
+                }
+
+                if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+                    a3param = new A3Param();
+                    codeLength += a3param.decode(is, false);
+                    return codeLength;
+                }
+
+                if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
+                    a4param = new A4Param();
+                    codeLength += a4param.decode(is, false);
+                    return codeLength;
+                }
+
+                if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 5)) {
+                    a5param = new A5Param();
+                    codeLength += a5param.decode(is, false);
+                    return codeLength;
+                }
+
+                if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 6)) {
+                    a6param = new A6Param();
+                    codeLength += a6param.decode(is, false);
+                    return codeLength;
+                }
+
+                if (passedTag != null) {
+                    return 0;
+                }
+
+                throw new IOException("Error decoding CHOICE: Tag " + berTag + " matched to no item.");
+            }
+
+            public void encodeAndSave(int encodingSizeGuess) throws IOException {
+                BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+                encode(os);
+                code = os.getArray();
+            }
+
+            public String toString() {
+                StringBuilder sb = new StringBuilder();
+                appendAsString(sb, 0);
+                return sb.toString();
+            }
+
+            public void appendAsString(StringBuilder sb, int indentLevel) {
+
+                if (perParam != null) {
+                    sb.append("perParam: ");
+                    perParam.appendAsString(sb, indentLevel + 1);
+                    return;
+                }
+
+                if (a1param != null) {
+                    sb.append("a1param: ");
+                    a1param.appendAsString(sb, indentLevel + 1);
+                    return;
+                }
+
+                if (a2param != null) {
+                    sb.append("a2param: ");
+                    a2param.appendAsString(sb, indentLevel + 1);
+                    return;
+                }
+
+                if (a3param != null) {
+                    sb.append("a3param: ");
+                    a3param.appendAsString(sb, indentLevel + 1);
+                    return;
+                }
+
+                if (a4param != null) {
+                    sb.append("a4param: ");
+                    a4param.appendAsString(sb, indentLevel + 1);
+                    return;
+                }
+
+                if (a5param != null) {
+                    sb.append("a5param: ");
+                    a5param.appendAsString(sb, indentLevel + 1);
+                    return;
+                }
+
+                if (a6param != null) {
+                    sb.append("a6param: ");
+                    a6param.appendAsString(sb, indentLevel + 1);
+                    return;
+                }
+
+                sb.append("<none>");
+            }
+
+        }
+
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/SchedMeasRepPerServCell.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/SchedMeasRepPerServCell.java
new file mode 100644
index 0000000..a367b9b
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/SchedMeasRepPerServCell.java
@@ -0,0 +1,1287 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class SchedMeasRepPerServCell implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgi = null;
+    private QciVals qciVals = null;
+    private PRBUsage prbUsage = null;
+    private McsDl mcsDl = null;
+    private NumSchedTtisDl numSchedTtisDl = null;
+    private McsUl mcsUl = null;
+    private NumSchedTtisUl numSchedTtisUl = null;
+    private RankDl1 rankDl1 = null;
+    private RankDl2 rankDl2 = null;
+    public SchedMeasRepPerServCell() {
+    }
+    public SchedMeasRepPerServCell(byte[] code) {
+        this.code = code;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public QciVals getQciVals() {
+        return qciVals;
+    }
+
+    public void setQciVals(QciVals qciVals) {
+        this.qciVals = qciVals;
+    }
+
+    public PRBUsage getPrbUsage() {
+        return prbUsage;
+    }
+
+    public void setPrbUsage(PRBUsage prbUsage) {
+        this.prbUsage = prbUsage;
+    }
+
+    public McsDl getMcsDl() {
+        return mcsDl;
+    }
+
+    public void setMcsDl(McsDl mcsDl) {
+        this.mcsDl = mcsDl;
+    }
+
+    public NumSchedTtisDl getNumSchedTtisDl() {
+        return numSchedTtisDl;
+    }
+
+    public void setNumSchedTtisDl(NumSchedTtisDl numSchedTtisDl) {
+        this.numSchedTtisDl = numSchedTtisDl;
+    }
+
+    public McsUl getMcsUl() {
+        return mcsUl;
+    }
+
+    public void setMcsUl(McsUl mcsUl) {
+        this.mcsUl = mcsUl;
+    }
+
+    public NumSchedTtisUl getNumSchedTtisUl() {
+        return numSchedTtisUl;
+    }
+
+    public void setNumSchedTtisUl(NumSchedTtisUl numSchedTtisUl) {
+        this.numSchedTtisUl = numSchedTtisUl;
+    }
+
+    public RankDl1 getRankDl1() {
+        return rankDl1;
+    }
+
+    public void setRankDl1(RankDl1 rankDl1) {
+        this.rankDl1 = rankDl1;
+    }
+
+    public RankDl2 getRankDl2() {
+        return rankDl2;
+    }
+
+    public void setRankDl2(RankDl2 rankDl2) {
+        this.rankDl2 = rankDl2;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += rankDl2.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 8
+        os.write(0xA8);
+        codeLength += 1;
+
+        codeLength += rankDl1.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 7
+        os.write(0xA7);
+        codeLength += 1;
+
+        codeLength += numSchedTtisUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 6
+        os.write(0xA6);
+        codeLength += 1;
+
+        codeLength += mcsUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 5
+        os.write(0xA5);
+        codeLength += 1;
+
+        codeLength += numSchedTtisDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
+        os.write(0xA4);
+        codeLength += 1;
+
+        codeLength += mcsDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
+        codeLength += prbUsage.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += qciVals.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            qciVals = new QciVals();
+            subCodeLength += qciVals.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            prbUsage = new PRBUsage();
+            subCodeLength += prbUsage.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            mcsDl = new McsDl();
+            subCodeLength += mcsDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
+            numSchedTtisDl = new NumSchedTtisDl();
+            subCodeLength += numSchedTtisDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 5)) {
+            mcsUl = new McsUl();
+            subCodeLength += mcsUl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 6)) {
+            numSchedTtisUl = new NumSchedTtisUl();
+            subCodeLength += numSchedTtisUl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 7)) {
+            rankDl1 = new RankDl1();
+            subCodeLength += rankDl1.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 8)) {
+            rankDl2 = new RankDl2();
+            subCodeLength += rankDl2.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (qciVals != null) {
+            sb.append("qciVals: ");
+            qciVals.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("qciVals: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (prbUsage != null) {
+            sb.append("prbUsage: ");
+            prbUsage.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("prbUsage: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (mcsDl != null) {
+            sb.append("mcsDl: ");
+            mcsDl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("mcsDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (numSchedTtisDl != null) {
+            sb.append("numSchedTtisDl: ");
+            numSchedTtisDl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("numSchedTtisDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (mcsUl != null) {
+            sb.append("mcsUl: ");
+            mcsUl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("mcsUl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (numSchedTtisUl != null) {
+            sb.append("numSchedTtisUl: ");
+            numSchedTtisUl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("numSchedTtisUl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (rankDl1 != null) {
+            sb.append("rankDl1: ");
+            rankDl1.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("rankDl1: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (rankDl2 != null) {
+            sb.append("rankDl2: ");
+            rankDl2.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("rankDl2: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class QciVals implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<QCI> seqOf = null;
+
+        public QciVals() {
+            seqOf = new ArrayList<QCI>();
+        }
+
+        public QciVals(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<QCI> getQCI() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<QCI>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                QCI element = new QCI();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<QCI> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class McsDl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public McsDl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public McsDl(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class NumSchedTtisDl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public NumSchedTtisDl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public NumSchedTtisDl(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class McsUl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public McsUl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public McsUl(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class NumSchedTtisUl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public NumSchedTtisUl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public NumSchedTtisUl(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class RankDl1 implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public RankDl1() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public RankDl1(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class RankDl2 implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public RankDl2() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public RankDl2(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ThresholdEUTRA.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ThresholdEUTRA.java
new file mode 100644
index 0000000..18f8f0c
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/ThresholdEUTRA.java
@@ -0,0 +1,138 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class ThresholdEUTRA implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @JsonIgnore
+    public byte[] code = null;
+    private RSRPRange thresholdRSRP = null;
+    private RSRQRange thresholdRSRQ = null;
+
+    public ThresholdEUTRA() {
+    }
+
+    public ThresholdEUTRA(byte[] code) {
+        this.code = code;
+    }
+
+    public RSRPRange getThresholdRSRP() {
+        return thresholdRSRP;
+    }
+
+    public void setThresholdRSRP(RSRPRange thresholdRSRP) {
+        this.thresholdRSRP = thresholdRSRP;
+    }
+
+    public RSRQRange getThresholdRSRQ() {
+        return thresholdRSRQ;
+    }
+
+    public void setThresholdRSRQ(RSRQRange thresholdRSRQ) {
+        this.thresholdRSRQ = thresholdRSRQ;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        if (thresholdRSRQ != null) {
+            codeLength += thresholdRSRQ.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+            os.write(0x81);
+            codeLength += 1;
+            return codeLength;
+        }
+
+        if (thresholdRSRP != null) {
+            codeLength += thresholdRSRP.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+            os.write(0x80);
+            codeLength += 1;
+            return codeLength;
+        }
+
+        throw new IOException("Error encoding CHOICE: No element of CHOICE was selected.");
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, null);
+    }
+
+    public int decode(InputStream is, BerTag berTag) throws IOException {
+
+        int codeLength = 0;
+        BerTag passedTag = berTag;
+
+        if (berTag == null) {
+            berTag = new BerTag();
+            codeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            thresholdRSRP = new RSRPRange();
+            codeLength += thresholdRSRP.decode(is, false);
+            return codeLength;
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            thresholdRSRQ = new RSRQRange();
+            codeLength += thresholdRSRQ.decode(is, false);
+            return codeLength;
+        }
+
+        if (passedTag != null) {
+            return 0;
+        }
+
+        throw new IOException("Error decoding CHOICE: Tag " + berTag + " matched to no item.");
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        if (thresholdRSRP != null) {
+            sb.append("thresholdRSRP: ").append(thresholdRSRP);
+            return;
+        }
+
+        if (thresholdRSRQ != null) {
+            sb.append("thresholdRSRQ: ").append(thresholdRSRQ);
+            return;
+        }
+
+        sb.append("<none>");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/TimeToTrigger.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/TimeToTrigger.java
new file mode 100644
index 0000000..fe042ec
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/TimeToTrigger.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class TimeToTrigger extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public TimeToTrigger() {
+    }
+
+    public TimeToTrigger(byte[] code) {
+        super(code);
+    }
+
+    public TimeToTrigger(BigInteger value) {
+        super(value);
+    }
+
+    public TimeToTrigger(long value) {
+        super(value);
+    }
+
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/TrafficSplitPercentage.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/TrafficSplitPercentage.java
new file mode 100644
index 0000000..e0599c0
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/TrafficSplitPercentage.java
@@ -0,0 +1,207 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class TrafficSplitPercentage implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgi = null;
+    private BerInteger trafficPercentDl = null;
+    private BerInteger trafficPercentUl = null;
+
+    public TrafficSplitPercentage() {
+    }
+
+    public TrafficSplitPercentage(byte[] code) {
+        this.code = code;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public BerInteger getTrafficPercentDl() {
+        return trafficPercentDl;
+    }
+
+    public void setTrafficPercentDl(BerInteger trafficPercentDl) {
+        this.trafficPercentDl = trafficPercentDl;
+    }
+
+    public BerInteger getTrafficPercentUl() {
+        return trafficPercentUl;
+    }
+
+    public void setTrafficPercentUl(BerInteger trafficPercentUl) {
+        this.trafficPercentUl = trafficPercentUl;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        if (trafficPercentUl != null) {
+            codeLength += trafficPercentUl.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+            os.write(0x82);
+            codeLength += 1;
+        }
+
+        if (trafficPercentDl != null) {
+            codeLength += trafficPercentDl.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+            os.write(0x81);
+            codeLength += 1;
+        }
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            trafficPercentDl = new BerInteger();
+            subCodeLength += trafficPercentDl.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            trafficPercentUl = new BerInteger();
+            subCodeLength += trafficPercentUl.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        if (trafficPercentDl != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("trafficPercentDl: ").append(trafficPercentDl);
+        }
+
+        if (trafficPercentUl != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("trafficPercentUl: ").append(trafficPercentUl);
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/UEAMBR.java
similarity index 64%
copy from src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/UEAMBR.java
index 7a44283..3590d09 100644
--- a/src/main/java/org.onosproject.xran/codecs/api/PCIARFCN.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/UEAMBR.java
@@ -1,56 +1,49 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.api;
+package org.onosproject.xran.asn1lib.api;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
 
 
-public class PCIARFCN implements Serializable {
+public class UEAMBR implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
     @JsonIgnore
     public byte[] code = null;
-    private PhysCellId pci = null;
-    private ARFCNValue earfcnDl = null;
+    private BitRate ambrDl = null;
+    private BitRate ambrUl = null;
 
-    public PCIARFCN() {
+    public UEAMBR() {
     }
 
-    public PCIARFCN(byte[] code) {
+    public UEAMBR(byte[] code) {
         this.code = code;
     }
 
-    public static PCIARFCN valueOf(PhysCellId pci, ARFCNValue arfcnValue) {
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setEarfcnDl(arfcnValue);
-        pciarfcn.setPci(pci);
-        return pciarfcn;
+    public BitRate getAmbrDl() {
+        return ambrDl;
     }
 
-    public PhysCellId getPci() {
-        return pci;
+    public void setAmbrDl(BitRate ambrDl) {
+        this.ambrDl = ambrDl;
     }
 
-    public void setPci(PhysCellId pci) {
-        this.pci = pci;
+    public BitRate getAmbrUl() {
+        return ambrUl;
     }
 
-    public ARFCNValue getEarfcnDl() {
-        return earfcnDl;
-    }
-
-    public void setEarfcnDl(ARFCNValue earfcnDl) {
-        this.earfcnDl = earfcnDl;
+    public void setAmbrUl(BitRate ambrUl) {
+        this.ambrUl = ambrUl;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -70,12 +63,12 @@
         }
 
         int codeLength = 0;
-        codeLength += earfcnDl.encode(os, false);
+        codeLength += ambrUl.encode(os, false);
         // write tag: CONTEXT_CLASS, PRIMITIVE, 1
         os.write(0x81);
         codeLength += 1;
 
-        codeLength += pci.encode(os, false);
+        codeLength += ambrDl.encode(os, false);
         // write tag: CONTEXT_CLASS, PRIMITIVE, 0
         os.write(0x80);
         codeLength += 1;
@@ -111,16 +104,16 @@
 
         subCodeLength += berTag.decode(is);
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-            pci = new PhysCellId();
-            subCodeLength += pci.decode(is, false);
+            ambrDl = new BitRate();
+            subCodeLength += ambrDl.decode(is, false);
             subCodeLength += berTag.decode(is);
         } else {
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-            earfcnDl = new ARFCNValue();
-            subCodeLength += earfcnDl.decode(is, false);
+            ambrUl = new BitRate();
+            subCodeLength += ambrUl.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -149,16 +142,20 @@
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (pci != null) {
-            sb.append("pci: ").append(pci);
+        if (ambrDl != null) {
+            sb.append("ambrDl: ").append(ambrDl);
+        } else {
+            sb.append("ambrDl: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (earfcnDl != null) {
-            sb.append("earfcnDl: ").append(earfcnDl);
+        if (ambrUl != null) {
+            sb.append("ambrUl: ").append(ambrUl);
+        } else {
+            sb.append("ambrUl: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -168,20 +165,5 @@
         sb.append("}");
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (o instanceof PCIARFCN) {
-            return pci.equals(((PCIARFCN) o).getPci()) && earfcnDl.equals(((PCIARFCN) o).getEarfcnDl());
-        }
-
-        return super.equals(o);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = pci.hashCode();
-        result = 31 * result + earfcnDl.hashCode();
-        return result;
-    }
 }
 
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/XICICPA.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/XICICPA.java
new file mode 100644
index 0000000..431a1c9
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/api/XICICPA.java
@@ -0,0 +1,31 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.api;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.math.BigInteger;
+
+
+public class XICICPA extends BerEnum {
+
+    private static final long serialVersionUID = 1L;
+
+    public XICICPA() {
+    }
+
+    public XICICPA(byte[] code) {
+        super(code);
+    }
+
+    public XICICPA(BigInteger value) {
+        super(value);
+    }
+
+    public XICICPA(long value) {
+        super(value);
+    }
+
+}
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/BerByteArrayOutputStream.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerByteArrayOutputStream.java
similarity index 98%
rename from src/main/java/org.onosproject.xran/codecs/ber/BerByteArrayOutputStream.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerByteArrayOutputStream.java
index e32f381..a77e51d 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/BerByteArrayOutputStream.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerByteArrayOutputStream.java
@@ -1,7 +1,7 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber;
+package org.onosproject.xran.asn1lib.ber;
 
 import java.io.IOException;
 import java.io.OutputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/BerLength.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerLength.java
similarity index 98%
rename from src/main/java/org.onosproject.xran/codecs/ber/BerLength.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerLength.java
index 8057a58..5bb87b9 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/BerLength.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerLength.java
@@ -1,7 +1,7 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber;
+package org.onosproject.xran.asn1lib.ber;
 
 import java.io.EOFException;
 import java.io.IOException;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/BerTag.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerTag.java
similarity index 98%
rename from src/main/java/org.onosproject.xran/codecs/ber/BerTag.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerTag.java
index 5d5df85..4e9bc12 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/BerTag.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/BerTag.java
@@ -1,7 +1,7 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber;
+package org.onosproject.xran.asn1lib.ber;
 
 import java.io.EOFException;
 import java.io.IOException;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/internal/Util.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/internal/Util.java
similarity index 93%
rename from src/main/java/org.onosproject.xran/codecs/ber/internal/Util.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/internal/Util.java
index c2d64cc..b85b6ac 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/internal/Util.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/internal/Util.java
@@ -1,7 +1,7 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.internal;
+package org.onosproject.xran.asn1lib.ber.internal;
 
 import java.io.EOFException;
 import java.io.IOException;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerAny.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerAny.java
similarity index 85%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerAny.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerAny.java
index db5daee..6445862 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerAny.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerAny.java
@@ -1,14 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.internal.Util;
-import org.onosproject.xran.codecs.util.HexConverter;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.internal.Util;
 
 import javax.xml.bind.DatatypeConverter;
 import java.io.IOException;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerBitString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerBitString.java
similarity index 89%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerBitString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerBitString.java
index 9ebfe14..65b1e48 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerBitString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerBitString.java
@@ -1,15 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.internal.Util;
-import org.onosproject.xran.codecs.util.HexConverter;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.internal.Util;
 
 import javax.xml.bind.DatatypeConverter;
 import java.io.EOFException;
@@ -21,11 +20,11 @@
 
     public final static BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.PRIMITIVE, BerTag.BIT_STRING_TAG);
     private static final long serialVersionUID = 1L;
-    @JsonIgnore
-    public byte[] code = null;
+    
+    @JsonIgnore public byte[] code = null;
 
     public byte[] value;
-    public int numBits;
+    @JsonIgnore public int numBits;
 
     public BerBitString() {
     }
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerBoolean.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerBoolean.java
similarity index 90%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerBoolean.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerBoolean.java
index 14e4e5b..34a26af 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerBoolean.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerBoolean.java
@@ -1,13 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.EOFException;
 import java.io.IOException;
@@ -18,8 +18,8 @@
 
     public final static BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.PRIMITIVE, BerTag.BOOLEAN_TAG);
     private static final long serialVersionUID = 1L;
-    @JsonIgnore
-    public byte[] code = null;
+    
+    @JsonIgnore public byte[] code = null;
 
     public boolean value;
 
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerDate.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDate.java
similarity index 88%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerDate.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDate.java
index e6c3362..e0548cb 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerDate.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDate.java
@@ -1,10 +1,10 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerDateTime.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDateTime.java
similarity index 88%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerDateTime.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDateTime.java
index 7196707..cab9d98 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerDateTime.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDateTime.java
@@ -1,10 +1,10 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerDuration.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDuration.java
similarity index 88%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerDuration.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDuration.java
index 6203472..1362547 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerDuration.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerDuration.java
@@ -1,10 +1,10 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerEmbeddedPdv.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerEmbeddedPdv.java
similarity index 97%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerEmbeddedPdv.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerEmbeddedPdv.java
index e9bc9af..6156edc 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerEmbeddedPdv.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerEmbeddedPdv.java
@@ -2,14 +2,14 @@
  * This class file was automatically generated by jASN1 v1.7.2-SNAPSHOT (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerObjectDescriptor;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerObjectDescriptor;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -19,7 +19,7 @@
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 11);
     private static final long serialVersionUID = 1L;
-    @JsonIgnore public byte[] code = null;
+     @JsonIgnore public byte[] code = null;
     private Identification identification = null;
     private BerObjectDescriptor dataValueDescriptor = null;
     private BerOctetString dataValue = null;
@@ -155,7 +155,7 @@
         code = os.getArray();
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -206,8 +206,8 @@
 
         private static final long serialVersionUID = 1L;
 
-        @JsonIgnore
-        public byte[] code = null;
+        
+        @JsonIgnore public byte[] code = null;
         private Syntaxes syntaxes = null;
         private BerObjectIdentifier syntax = null;
         private BerInteger presentationContextId = null;
@@ -440,7 +440,7 @@
 
             public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
             private static final long serialVersionUID = 1L;
-            @JsonIgnore public byte[] code = null;
+             @JsonIgnore public byte[] code = null;
             private BerObjectIdentifier abstract_ = null;
             private BerObjectIdentifier transfer = null;
 
@@ -593,7 +593,7 @@
 
             public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
             private static final long serialVersionUID = 1L;
-            @JsonIgnore public byte[] code = null;
+             @JsonIgnore public byte[] code = null;
             private BerInteger presentationContextId = null;
             private BerObjectIdentifier transferSyntax = null;
 
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerEnum.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerEnum.java
similarity index 88%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerEnum.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerEnum.java
index ea97be5..8c5acaa 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerEnum.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerEnum.java
@@ -1,10 +1,10 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerGeneralizedTime.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerGeneralizedTime.java
similarity index 94%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerGeneralizedTime.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerGeneralizedTime.java
index 00f3340..b4df6fc 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerGeneralizedTime.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerGeneralizedTime.java
@@ -1,11 +1,11 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerVisibleString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerVisibleString;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerInteger.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerInteger.java
similarity index 90%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerInteger.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerInteger.java
index c22cd4d..0c80fbb 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerInteger.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerInteger.java
@@ -1,14 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.internal.Util;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.internal.Util;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -19,8 +19,8 @@
 
     public final static BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.PRIMITIVE, BerTag.INTEGER_TAG);
     private static final long serialVersionUID = 1L;
-    @JsonIgnore
-    public byte[] code = null;
+    
+    @JsonIgnore public byte[] code = null;
 
     public BigInteger value;
 
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerNull.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerNull.java
similarity index 85%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerNull.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerNull.java
index 6437d0b..b342632 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerNull.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerNull.java
@@ -1,13 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -17,8 +17,8 @@
 
     public final static BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.PRIMITIVE, BerTag.NULL_TAG);
     private static final long serialVersionUID = 1L;
-    @JsonIgnore
-    public byte[] code = null;
+    
+    @JsonIgnore public byte[] code = null;
 
     public BerNull() {
     }
@@ -63,7 +63,7 @@
         return codeLength;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return "ASN1_NULL";
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerObjectIdentifier.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerObjectIdentifier.java
similarity index 94%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerObjectIdentifier.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerObjectIdentifier.java
index d1cf4ba..b4f3e29 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerObjectIdentifier.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerObjectIdentifier.java
@@ -1,14 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.internal.Util;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.internal.Util;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -20,8 +20,8 @@
 
     public final static BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.PRIMITIVE, BerTag.OBJECT_IDENTIFIER_TAG);
     private static final long serialVersionUID = 1L;
-    @JsonIgnore
-    public byte[] code = null;
+    
+    @JsonIgnore public byte[] code = null;
 
     public int[] value;
 
@@ -179,7 +179,7 @@
 
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         if (value == null || value.length == 0) {
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerOctetString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerOctetString.java
similarity index 85%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerOctetString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerOctetString.java
index 906e060..16a085a 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerOctetString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerOctetString.java
@@ -1,14 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.internal.Util;
-import org.onosproject.xran.codecs.util.HexConverter;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.internal.Util;
 
 import javax.xml.bind.DatatypeConverter;
 import java.io.IOException;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerReal.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerReal.java
similarity index 94%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerReal.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerReal.java
index 08f8d06..2581e78 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerReal.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerReal.java
@@ -1,14 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.internal.Util;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.internal.Util;
 
 import java.io.EOFException;
 import java.io.IOException;
@@ -20,8 +20,8 @@
 
     public final static BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.PRIMITIVE, BerTag.REAL_TAG);
     private static final long serialVersionUID = 1L;
-    @JsonIgnore
-    public byte[] code = null;
+    
+    @JsonIgnore public byte[] code = null;
 
     public double value;
 
@@ -225,7 +225,7 @@
         code = os.getArray();
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return "" + value;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerTime.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerTime.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerTime.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerTime.java
index cfd8d65..6dad2af 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerTime.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerTime.java
@@ -1,11 +1,11 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerVisibleString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerVisibleString;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerTimeOfDay.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerTimeOfDay.java
similarity index 88%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerTimeOfDay.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerTimeOfDay.java
index d592a72..2507525 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerTimeOfDay.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerTimeOfDay.java
@@ -1,10 +1,10 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/BerUtcTime.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerUtcTime.java
similarity index 93%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/BerUtcTime.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerUtcTime.java
index 2cfc6b5..e292aa5 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/BerUtcTime.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/BerUtcTime.java
@@ -1,11 +1,11 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types;
+package org.onosproject.xran.asn1lib.ber.types;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerVisibleString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerVisibleString;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerBMPString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerBMPString.java
similarity index 83%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerBMPString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerBMPString.java
index 5f36c5a..682fafa 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerBMPString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerBMPString.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerGeneralString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerGeneralString.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerGeneralString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerGeneralString.java
index 1c89db5..0608d43 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerGeneralString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerGeneralString.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerGraphicString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerGraphicString.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerGraphicString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerGraphicString.java
index ef70e72..1efedb6 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerGraphicString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerGraphicString.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerIA5String.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerIA5String.java
similarity index 83%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerIA5String.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerIA5String.java
index a56240e..e38f3df 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerIA5String.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerIA5String.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerNumericString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerNumericString.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerNumericString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerNumericString.java
index 944b66d..141f3ed 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerNumericString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerNumericString.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerObjectDescriptor.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerObjectDescriptor.java
similarity index 87%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerObjectDescriptor.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerObjectDescriptor.java
index 2b80cb0..bcf4829 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerObjectDescriptor.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerObjectDescriptor.java
@@ -1,10 +1,10 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerPrintableString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerPrintableString.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerPrintableString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerPrintableString.java
index d865dcb..e6313bf 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerPrintableString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerPrintableString.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerTeletexString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerTeletexString.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerTeletexString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerTeletexString.java
index 78e483b..ca56059 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerTeletexString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerTeletexString.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerUTF8String.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerUTF8String.java
similarity index 86%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerUTF8String.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerUTF8String.java
index 7b107a4..b27b82c 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerUTF8String.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerUTF8String.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -28,7 +28,7 @@
         value = valueAsString.getBytes("UTF-8");
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         try {
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerUniversalString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerUniversalString.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerUniversalString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerUniversalString.java
index 06be21c..41e0a89 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerUniversalString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerUniversalString.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerVideotexString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerVideotexString.java
similarity index 84%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerVideotexString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerVideotexString.java
index e67d8ca..5d88179 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerVideotexString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerVideotexString.java
@@ -1,12 +1,12 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerOctetString;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerOctetString;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,7 +23,7 @@
         this.value = value;
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerVisibleString.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerVisibleString.java
similarity index 86%
rename from src/main/java/org.onosproject.xran/codecs/ber/types/string/BerVisibleString.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerVisibleString.java
index ca7bfb3..14a8665 100644
--- a/src/main/java/org.onosproject.xran/codecs/ber/types/string/BerVisibleString.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/ber/types/string/BerVisibleString.java
@@ -1,13 +1,13 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-package org.onosproject.xran.codecs.ber.types.string;
+package org.onosproject.xran.asn1lib.ber.types.string;
 
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.internal.Util;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.internal.Util;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -74,7 +74,7 @@
 
     }
 
-    @JsonValue
+    
     @Override
     public String toString() {
         return new String(value);
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/package-info.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/package-info.java
new file mode 100644
index 0000000..17384cd
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/package-info.java
@@ -0,0 +1 @@
+package org.onosproject.xran.asn1lib;
\ No newline at end of file
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionRequest.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionRequest.java
new file mode 100644
index 0000000..3f31a27
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionRequest.java
@@ -0,0 +1,272 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.ERABParams;
+import org.onosproject.xran.asn1lib.api.UEAMBR;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class BearerAdmissionRequest implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private UEAMBR ueAmbr = null;
+    private BerInteger numErabs = null;
+    private ERABParams erabParams = null;
+
+    public BearerAdmissionRequest() {
+    }
+
+    public BearerAdmissionRequest(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public UEAMBR getUeAmbr() {
+        return ueAmbr;
+    }
+
+    public void setUeAmbr(UEAMBR ueAmbr) {
+        this.ueAmbr = ueAmbr;
+    }
+
+    public BerInteger getNumErabs() {
+        return numErabs;
+    }
+
+    public void setNumErabs(BerInteger numErabs) {
+        this.numErabs = numErabs;
+    }
+
+    public ERABParams getErabParams() {
+        return erabParams;
+    }
+
+    public void setErabParams(ERABParams erabParams) {
+        this.erabParams = erabParams;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += erabParams.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
+        os.write(0xA4);
+        codeLength += 1;
+
+        codeLength += numErabs.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += ueAmbr.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            ueAmbr = new UEAMBR();
+            subCodeLength += ueAmbr.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            numErabs = new BerInteger();
+            subCodeLength += numErabs.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
+            erabParams = new ERABParams();
+            subCodeLength += erabParams.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ueAmbr != null) {
+            sb.append("ueAmbr: ");
+            ueAmbr.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ueAmbr: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (numErabs != null) {
+            sb.append("numErabs: ").append(numErabs);
+        } else {
+            sb.append("numErabs: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (erabParams != null) {
+            sb.append("erabParams: ");
+            erabParams.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("erabParams: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionResponse.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionResponse.java
new file mode 100644
index 0000000..333aca1
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionResponse.java
@@ -0,0 +1,281 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.*;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+
+public class BearerAdmissionResponse implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private BerInteger numErabList = null;
+    private ERABResponse erabResponse = null;
+
+    public BearerAdmissionResponse() {
+    }
+
+    public BearerAdmissionResponse(byte[] code) {
+        this.code = code;
+    }
+
+    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, ERABParams erabParams, BerInteger numParams, boolean b) {
+        ERABResponse erabResponse = new ERABResponse();
+
+        for (int i = 0; i < numParams.intValue(); i++) {
+            ERABParamsItem erabParamsItem = erabParams.getERABParamsItem().get(i);
+
+            ERABResponseItem responseItem = new ERABResponseItem();
+            responseItem.setId(erabParamsItem.getId());
+
+            // FIXME: add logic
+            responseItem.setDecision(new ERABDecision(b ? 0 : 1));
+
+            erabResponse.getERABResponseItem().add(responseItem);
+        }
+
+
+        BearerAdmissionResponse bearerAdmissionResponse = new BearerAdmissionResponse();
+        bearerAdmissionResponse.setCrnti(crnti);
+        bearerAdmissionResponse.setEcgi(ecgi);
+        bearerAdmissionResponse.setErabResponse(erabResponse);
+        bearerAdmissionResponse.setNumErabList(numParams);
+
+        XrancPduBody body = new XrancPduBody();
+        body.setBearerAdmissionResponse(bearerAdmissionResponse);
+
+        BerUTF8String ver = null;
+        try {
+            ver = new BerUTF8String("5");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        XrancApiID apiID = new XrancApiID(9);
+        XrancPduHdr hdr = new XrancPduHdr();
+        hdr.setVer(ver);
+        hdr.setApiId(apiID);
+
+        XrancPdu pdu = new XrancPdu();
+        pdu.setHdr(hdr);
+        pdu.setBody(body);
+
+        return pdu;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public BerInteger getNumErabList() {
+        return numErabList;
+    }
+
+    public void setNumErabList(BerInteger numErabList) {
+        this.numErabList = numErabList;
+    }
+
+    public ERABResponse getErabResponse() {
+        return erabResponse;
+    }
+
+    public void setErabResponse(ERABResponse erabResponse) {
+        this.erabResponse = erabResponse;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += erabResponse.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
+        codeLength += numErabList.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            numErabList = new BerInteger();
+            subCodeLength += numErabList.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            erabResponse = new ERABResponse();
+            subCodeLength += erabResponse.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (numErabList != null) {
+            sb.append("numErabList: ").append(numErabList);
+        } else {
+            sb.append("numErabList: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (erabResponse != null) {
+            sb.append("erabResponse: ");
+            erabResponse.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("erabResponse: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionStatus.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionStatus.java
new file mode 100644
index 0000000..aa5fdea
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerAdmissionStatus.java
@@ -0,0 +1,238 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.ERABResponse;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class BearerAdmissionStatus implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private BerInteger numErabs = null;
+    private ERABResponse erabStatus = null;
+
+    public BearerAdmissionStatus() {
+    }
+
+    public BearerAdmissionStatus(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public BerInteger getNumErabs() {
+        return numErabs;
+    }
+
+    public void setNumErabs(BerInteger numErabs) {
+        this.numErabs = numErabs;
+    }
+
+    public ERABResponse getErabStatus() {
+        return erabStatus;
+    }
+
+    public void setErabStatus(ERABResponse erabStatus) {
+        this.erabStatus = erabStatus;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += erabStatus.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
+        codeLength += numErabs.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            numErabs = new BerInteger();
+            subCodeLength += numErabs.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            erabStatus = new ERABResponse();
+            subCodeLength += erabStatus.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (numErabs != null) {
+            sb.append("numErabs: ").append(numErabs);
+        } else {
+            sb.append("numErabs: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (erabStatus != null) {
+            sb.append("erabStatus: ");
+            erabStatus.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("erabStatus: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerReleaseInd.java
similarity index 72%
copy from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerReleaseInd.java
index 6080f69..7b4e15c 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/BearerReleaseInd.java
@@ -1,28 +1,28 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
+
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.ERABID;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class ScellDelete implements Serializable {
+public class BearerReleaseInd implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
@@ -30,44 +30,15 @@
     public byte[] code = null;
     private CRNTI crnti = null;
     private ECGI ecgi = null;
-    private ScellsInd scellsInd = null;
-    public ScellDelete() {
+    private BerInteger numErabs = null;
+    private ErabIds erabIds = null;
+    public BearerReleaseInd() {
     }
-    public ScellDelete(byte[] code) {
+
+    public BearerReleaseInd(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
-        ScellDelete scellDelete = new ScellDelete();
-        scellDelete.setEcgi(ecgi);
-        scellDelete.setCrnti(crnti);
-        ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
-        scellDelete.setScellsInd(scellsInd);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("3");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(28);
-        XrancPduBody body = new XrancPduBody();
-        body.setScellDelete(scellDelete);
-
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setBody(body);
-        pdu.setHdr(hdr);
-
-        return pdu;
-
-    }
-
     public CRNTI getCrnti() {
         return crnti;
     }
@@ -84,12 +55,20 @@
         this.ecgi = ecgi;
     }
 
-    public ScellsInd getScellsInd() {
-        return scellsInd;
+    public BerInteger getNumErabs() {
+        return numErabs;
     }
 
-    public void setScellsInd(ScellsInd scellsInd) {
-        this.scellsInd = scellsInd;
+    public void setNumErabs(BerInteger numErabs) {
+        this.numErabs = numErabs;
+    }
+
+    public ErabIds getErabIds() {
+        return erabIds;
+    }
+
+    public void setErabIds(ErabIds erabIds) {
+        this.erabIds = erabIds;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -109,9 +88,14 @@
         }
 
         int codeLength = 0;
-        codeLength += scellsInd.encode(os, false);
-        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-        os.write(0xA2);
+        codeLength += erabIds.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
+        codeLength += numErabs.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
         codeLength += 1;
 
         codeLength += ecgi.encode(os, false);
@@ -170,9 +154,17 @@
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-            scellsInd = new ScellsInd();
-            subCodeLength += scellsInd.decode(is, false);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            numErabs = new BerInteger();
+            subCodeLength += numErabs.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            erabIds = new ErabIds();
+            subCodeLength += erabIds.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -203,6 +195,8 @@
         }
         if (crnti != null) {
             sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -212,15 +206,29 @@
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (scellsInd != null) {
-            sb.append("scellsInd: ");
-            scellsInd.appendAsString(sb, indentLevel + 1);
+        if (numErabs != null) {
+            sb.append("numErabs: ").append(numErabs);
+        } else {
+            sb.append("numErabs: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (erabIds != null) {
+            sb.append("erabIds: ");
+            erabIds.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("erabIds: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -230,25 +238,27 @@
         sb.append("}");
     }
 
-    public static class ScellsInd implements Serializable {
+    public static class ErabIds implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
-        private List<PCIARFCN> seqOf = null;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<ERABID> seqOf = null;
 
-        public ScellsInd() {
-            seqOf = new ArrayList<PCIARFCN>();
+        public ErabIds() {
+            seqOf = new ArrayList<ERABID>();
         }
 
-        public ScellsInd(byte[] code) {
+        public ErabIds(byte[] code) {
             this.code = code;
         }
 
+
         @JsonValue
-        public List<PCIARFCN> getPCIARFCN() {
+        public List<ERABID> getERABID() {
             if (seqOf == null) {
-                seqOf = new ArrayList<PCIARFCN>();
+                seqOf = new ArrayList<ERABID>();
             }
             return seqOf;
         }
@@ -299,7 +309,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                PCIARFCN element = new PCIARFCN();
+                ERABID element = new ERABID();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -326,22 +336,22 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<PCIARFCN> it = seqOf.iterator();
+                Iterator<ERABID> it = seqOf.iterator();
                 if (it.hasNext()) {
-                    it.next().appendAsString(sb, indentLevel + 1);
+                    sb.append(it.next());
                     while (it.hasNext()) {
                         sb.append(",\n");
                         for (int i = 0; i < indentLevel + 1; i++) {
                             sb.append("\t");
                         }
-                        it.next().appendAsString(sb, indentLevel + 1);
+                        sb.append(it.next());
                     }
                 }
             }
@@ -350,12 +360,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
-        }
     }
 
 }
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/CellConfigReport.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/CellConfigReport.java
new file mode 100644
index 0000000..896461a
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/CellConfigReport.java
@@ -0,0 +1,783 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.api.*;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerBitString;
+import org.onosproject.xran.asn1lib.ber.types.BerBoolean;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class CellConfigReport implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgi = null;
+    private PhysCellId pci = null;
+    private CandScells candScells = null;
+    private ARFCNValue earfcnDl = null;
+    private ARFCNValue earfcnUl = null;
+    private BerInteger rbsPerTtiDl = null;
+    private BerInteger rbsPerTtiUl = null;
+    private BerInteger numTxAntenna = null;
+    private DuplexMode duplexMode = null;
+    private BerInteger tddConfig = null;
+    private BerInteger tddSplSfConfig = null;
+    private BerInteger maxNumConnectedUes = null;
+    private BerInteger maxNumConnectedBearers = null;
+    private BerInteger maxNumUesSchedPerTtiDl = null;
+    private BerInteger maxNumUesSchedPerTtiUl = null;
+    private BerBoolean dlfsSchedEnable = null;
+    private BerBitString featureSupportList = null;
+    public CellConfigReport() {
+    }
+
+    public CellConfigReport(byte[] code) {
+        this.code = code;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public PhysCellId getPci() {
+        return pci;
+    }
+
+    public void setPci(PhysCellId pci) {
+        this.pci = pci;
+    }
+
+    public CandScells getCandScells() {
+        return candScells;
+    }
+
+    public void setCandScells(CandScells candScells) {
+        this.candScells = candScells;
+    }
+
+    public ARFCNValue getEarfcnDl() {
+        return earfcnDl;
+    }
+
+    public void setEarfcnDl(ARFCNValue earfcnDl) {
+        this.earfcnDl = earfcnDl;
+    }
+
+    public ARFCNValue getEarfcnUl() {
+        return earfcnUl;
+    }
+
+    public void setEarfcnUl(ARFCNValue earfcnUl) {
+        this.earfcnUl = earfcnUl;
+    }
+
+    public BerInteger getRbsPerTtiDl() {
+        return rbsPerTtiDl;
+    }
+
+    public void setRbsPerTtiDl(BerInteger rbsPerTtiDl) {
+        this.rbsPerTtiDl = rbsPerTtiDl;
+    }
+
+    public BerInteger getRbsPerTtiUl() {
+        return rbsPerTtiUl;
+    }
+
+    public void setRbsPerTtiUl(BerInteger rbsPerTtiUl) {
+        this.rbsPerTtiUl = rbsPerTtiUl;
+    }
+
+    public BerInteger getNumTxAntenna() {
+        return numTxAntenna;
+    }
+
+    public void setNumTxAntenna(BerInteger numTxAntenna) {
+        this.numTxAntenna = numTxAntenna;
+    }
+
+    public DuplexMode getDuplexMode() {
+        return duplexMode;
+    }
+
+    public void setDuplexMode(DuplexMode duplexMode) {
+        this.duplexMode = duplexMode;
+    }
+
+    public BerInteger getTddConfig() {
+        return tddConfig;
+    }
+
+    public void setTddConfig(BerInteger tddConfig) {
+        this.tddConfig = tddConfig;
+    }
+
+    public BerInteger getTddSplSfConfig() {
+        return tddSplSfConfig;
+    }
+
+    public void setTddSplSfConfig(BerInteger tddSplSfConfig) {
+        this.tddSplSfConfig = tddSplSfConfig;
+    }
+
+    public BerInteger getMaxNumConnectedUes() {
+        return maxNumConnectedUes;
+    }
+
+    public void setMaxNumConnectedUes(BerInteger maxNumConnectedUes) {
+        this.maxNumConnectedUes = maxNumConnectedUes;
+    }
+
+    public BerInteger getMaxNumConnectedBearers() {
+        return maxNumConnectedBearers;
+    }
+
+    public void setMaxNumConnectedBearers(BerInteger maxNumConnectedBearers) {
+        this.maxNumConnectedBearers = maxNumConnectedBearers;
+    }
+
+    public BerInteger getMaxNumUesSchedPerTtiDl() {
+        return maxNumUesSchedPerTtiDl;
+    }
+
+    public void setMaxNumUesSchedPerTtiDl(BerInteger maxNumUesSchedPerTtiDl) {
+        this.maxNumUesSchedPerTtiDl = maxNumUesSchedPerTtiDl;
+    }
+
+    public BerInteger getMaxNumUesSchedPerTtiUl() {
+        return maxNumUesSchedPerTtiUl;
+    }
+
+    public void setMaxNumUesSchedPerTtiUl(BerInteger maxNumUesSchedPerTtiUl) {
+        this.maxNumUesSchedPerTtiUl = maxNumUesSchedPerTtiUl;
+    }
+
+    public BerBoolean getDlfsSchedEnable() {
+        return dlfsSchedEnable;
+    }
+
+    public void setDlfsSchedEnable(BerBoolean dlfsSchedEnable) {
+        this.dlfsSchedEnable = dlfsSchedEnable;
+    }
+
+    public BerBitString getFeatureSupportList() {
+        return featureSupportList;
+    }
+
+    public void setFeatureSupportList(BerBitString featureSupportList) {
+        this.featureSupportList = featureSupportList;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        if (featureSupportList != null) {
+            codeLength += featureSupportList.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 16
+            os.write(0x90);
+            codeLength += 1;
+        }
+
+        codeLength += dlfsSchedEnable.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 15
+        os.write(0x8F);
+        codeLength += 1;
+
+        codeLength += maxNumUesSchedPerTtiUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 14
+        os.write(0x8E);
+        codeLength += 1;
+
+        codeLength += maxNumUesSchedPerTtiDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 13
+        os.write(0x8D);
+        codeLength += 1;
+
+        codeLength += maxNumConnectedBearers.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 12
+        os.write(0x8C);
+        codeLength += 1;
+
+        codeLength += maxNumConnectedUes.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 11
+        os.write(0x8B);
+        codeLength += 1;
+
+        if (tddSplSfConfig != null) {
+            codeLength += tddSplSfConfig.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 10
+            os.write(0x8A);
+            codeLength += 1;
+        }
+
+        if (tddConfig != null) {
+            codeLength += tddConfig.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 9
+            os.write(0x89);
+            codeLength += 1;
+        }
+
+        codeLength += duplexMode.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 8
+        os.write(0x88);
+        codeLength += 1;
+
+        codeLength += numTxAntenna.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 7
+        os.write(0x87);
+        codeLength += 1;
+
+        codeLength += rbsPerTtiUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 6
+        os.write(0x86);
+        codeLength += 1;
+
+        codeLength += rbsPerTtiDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 5
+        os.write(0x85);
+        codeLength += 1;
+
+        codeLength += earfcnUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 4
+        os.write(0x84);
+        codeLength += 1;
+
+        codeLength += earfcnDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += candScells.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += pci.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            pci = new PhysCellId();
+            subCodeLength += pci.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            candScells = new CandScells();
+            subCodeLength += candScells.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            earfcnDl = new ARFCNValue();
+            subCodeLength += earfcnDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
+            earfcnUl = new ARFCNValue();
+            subCodeLength += earfcnUl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 5)) {
+            rbsPerTtiDl = new BerInteger();
+            subCodeLength += rbsPerTtiDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 6)) {
+            rbsPerTtiUl = new BerInteger();
+            subCodeLength += rbsPerTtiUl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 7)) {
+            numTxAntenna = new BerInteger();
+            subCodeLength += numTxAntenna.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 8)) {
+            duplexMode = new DuplexMode();
+            subCodeLength += duplexMode.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 9)) {
+            tddConfig = new BerInteger();
+            subCodeLength += tddConfig.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 10)) {
+            tddSplSfConfig = new BerInteger();
+            subCodeLength += tddSplSfConfig.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 11)) {
+            maxNumConnectedUes = new BerInteger();
+            subCodeLength += maxNumConnectedUes.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 12)) {
+            maxNumConnectedBearers = new BerInteger();
+            subCodeLength += maxNumConnectedBearers.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 13)) {
+            maxNumUesSchedPerTtiDl = new BerInteger();
+            subCodeLength += maxNumUesSchedPerTtiDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 14)) {
+            maxNumUesSchedPerTtiUl = new BerInteger();
+            subCodeLength += maxNumUesSchedPerTtiUl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 15)) {
+            dlfsSchedEnable = new BerBoolean();
+            subCodeLength += dlfsSchedEnable.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 16)) {
+            featureSupportList = new BerBitString();
+            subCodeLength += featureSupportList.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pci != null) {
+            sb.append("pci: ").append(pci);
+        } else {
+            sb.append("pci: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (candScells != null) {
+            sb.append("candScells: ");
+            candScells.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("candScells: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (earfcnDl != null) {
+            sb.append("earfcnDl: ").append(earfcnDl);
+        } else {
+            sb.append("earfcnDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (earfcnUl != null) {
+            sb.append("earfcnUl: ").append(earfcnUl);
+        } else {
+            sb.append("earfcnUl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (rbsPerTtiDl != null) {
+            sb.append("rbsPerTtiDl: ").append(rbsPerTtiDl);
+        } else {
+            sb.append("rbsPerTtiDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (rbsPerTtiUl != null) {
+            sb.append("rbsPerTtiUl: ").append(rbsPerTtiUl);
+        } else {
+            sb.append("rbsPerTtiUl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (numTxAntenna != null) {
+            sb.append("numTxAntenna: ").append(numTxAntenna);
+        } else {
+            sb.append("numTxAntenna: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (duplexMode != null) {
+            sb.append("duplexMode: ").append(duplexMode);
+        } else {
+            sb.append("duplexMode: <empty-required-field>");
+        }
+
+        if (tddConfig != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("tddConfig: ").append(tddConfig);
+        }
+
+        if (tddSplSfConfig != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("tddSplSfConfig: ").append(tddSplSfConfig);
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (maxNumConnectedUes != null) {
+            sb.append("maxNumConnectedUes: ").append(maxNumConnectedUes);
+        } else {
+            sb.append("maxNumConnectedUes: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (maxNumConnectedBearers != null) {
+            sb.append("maxNumConnectedBearers: ").append(maxNumConnectedBearers);
+        } else {
+            sb.append("maxNumConnectedBearers: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (maxNumUesSchedPerTtiDl != null) {
+            sb.append("maxNumUesSchedPerTtiDl: ").append(maxNumUesSchedPerTtiDl);
+        } else {
+            sb.append("maxNumUesSchedPerTtiDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (maxNumUesSchedPerTtiUl != null) {
+            sb.append("maxNumUesSchedPerTtiUl: ").append(maxNumUesSchedPerTtiUl);
+        } else {
+            sb.append("maxNumUesSchedPerTtiUl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (dlfsSchedEnable != null) {
+            sb.append("dlfsSchedEnable: ").append(dlfsSchedEnable);
+        } else {
+            sb.append("dlfsSchedEnable: <empty-required-field>");
+        }
+
+        if (featureSupportList != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("featureSupportList: ").append(featureSupportList);
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class CandScells implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<CandScell> seqOf = null;
+
+        public CandScells() {
+            seqOf = new ArrayList<CandScell>();
+        }
+
+        public CandScells(byte[] code) {
+            this.code = code;
+        }
+
+
+        @JsonValue
+        public List<CandScell> getCandScell() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<CandScell>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                CandScell element = new CandScell();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<CandScell> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    it.next().appendAsString(sb, indentLevel + 1);
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        it.next().appendAsString(sb, indentLevel + 1);
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/CellConfigRequest.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/CellConfigRequest.java
new file mode 100644
index 0000000..7de2dd1
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/CellConfigRequest.java
@@ -0,0 +1,163 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class CellConfigRequest implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgi = null;
+
+    public CellConfigRequest() {
+    }
+
+    public CellConfigRequest(byte[] code) {
+        this.code = code;
+    }
+
+    public static XrancPdu constructPacket(ECGI ecgi) {
+        CellConfigRequest cellConfigRequest = new CellConfigRequest();
+        cellConfigRequest.setEcgi(ecgi);
+        BerUTF8String ver = null;
+        try {
+            ver = new BerUTF8String("5");
+        } catch (Exception ignored) {
+        }
+
+        XrancApiID apiID = new XrancApiID(0);
+        XrancPduBody body = new XrancPduBody();
+        body.setCellConfigRequest(cellConfigRequest);
+
+        XrancPduHdr hdr = new XrancPduHdr();
+        hdr.setVer(ver);
+        hdr.setApiId(apiID);
+
+        XrancPdu pdu = new XrancPdu();
+        pdu.setBody(body);
+        pdu.setHdr(hdr);
+
+        return pdu;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOCause.java
similarity index 64%
copy from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOCause.java
index 6080f69..140b234 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOCause.java
@@ -1,73 +1,45 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
+
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.RXSigReport;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerBitString;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class ScellDelete implements Serializable {
+public class HOCause implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
     @JsonIgnore
     public byte[] code = null;
     private CRNTI crnti = null;
-    private ECGI ecgi = null;
-    private ScellsInd scellsInd = null;
-    public ScellDelete() {
+    private ECGI ecgiS = null;
+    private ECGI ecgiT = null;
+    private BerBitString hoCause = null;
+    private HoTrigger hoTrigger = null;
+    public HOCause() {
     }
-    public ScellDelete(byte[] code) {
+
+    public HOCause(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
-        ScellDelete scellDelete = new ScellDelete();
-        scellDelete.setEcgi(ecgi);
-        scellDelete.setCrnti(crnti);
-        ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
-        scellDelete.setScellsInd(scellsInd);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("3");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(28);
-        XrancPduBody body = new XrancPduBody();
-        body.setScellDelete(scellDelete);
-
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setBody(body);
-        pdu.setHdr(hdr);
-
-        return pdu;
-
-    }
-
     public CRNTI getCrnti() {
         return crnti;
     }
@@ -76,20 +48,36 @@
         this.crnti = crnti;
     }
 
-    public ECGI getEcgi() {
-        return ecgi;
+    public ECGI getEcgiS() {
+        return ecgiS;
     }
 
-    public void setEcgi(ECGI ecgi) {
-        this.ecgi = ecgi;
+    public void setEcgiS(ECGI ecgiS) {
+        this.ecgiS = ecgiS;
     }
 
-    public ScellsInd getScellsInd() {
-        return scellsInd;
+    public ECGI getEcgiT() {
+        return ecgiT;
     }
 
-    public void setScellsInd(ScellsInd scellsInd) {
-        this.scellsInd = scellsInd;
+    public void setEcgiT(ECGI ecgiT) {
+        this.ecgiT = ecgiT;
+    }
+
+    public BerBitString getHoCause() {
+        return hoCause;
+    }
+
+    public void setHoCause(BerBitString hoCause) {
+        this.hoCause = hoCause;
+    }
+
+    public HoTrigger getHoTrigger() {
+        return hoTrigger;
+    }
+
+    public void setHoTrigger(HoTrigger hoTrigger) {
+        this.hoTrigger = hoTrigger;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -109,12 +97,22 @@
         }
 
         int codeLength = 0;
-        codeLength += scellsInd.encode(os, false);
+        codeLength += hoTrigger.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
+        os.write(0xA4);
+        codeLength += 1;
+
+        codeLength += hoCause.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += ecgiT.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
         os.write(0xA2);
         codeLength += 1;
 
-        codeLength += ecgi.encode(os, false);
+        codeLength += ecgiS.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
         os.write(0xA1);
         codeLength += 1;
@@ -163,16 +161,32 @@
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-            ecgi = new ECGI();
-            subCodeLength += ecgi.decode(is, false);
+            ecgiS = new ECGI();
+            subCodeLength += ecgiS.decode(is, false);
             subCodeLength += berTag.decode(is);
         } else {
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-            scellsInd = new ScellsInd();
-            subCodeLength += scellsInd.decode(is, false);
+            ecgiT = new ECGI();
+            subCodeLength += ecgiT.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            hoCause = new BerBitString();
+            subCodeLength += hoCause.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
+            hoTrigger = new HoTrigger();
+            subCodeLength += hoTrigger.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -203,24 +217,51 @@
         }
         if (crnti != null) {
             sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (ecgi != null) {
-            sb.append("ecgi: ");
-            ecgi.appendAsString(sb, indentLevel + 1);
+        if (ecgiS != null) {
+            sb.append("ecgiS: ");
+            ecgiS.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgiS: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (scellsInd != null) {
-            sb.append("scellsInd: ");
-            scellsInd.appendAsString(sb, indentLevel + 1);
+        if (ecgiT != null) {
+            sb.append("ecgiT: ");
+            ecgiT.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgiT: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (hoCause != null) {
+            sb.append("hoCause: ").append(hoCause);
+        } else {
+            sb.append("hoCause: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (hoTrigger != null) {
+            sb.append("hoTrigger: ");
+            hoTrigger.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("hoTrigger: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -230,25 +271,27 @@
         sb.append("}");
     }
 
-    public static class ScellsInd implements Serializable {
+    public static class HoTrigger implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
-        private List<PCIARFCN> seqOf = null;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<RXSigReport> seqOf = null;
 
-        public ScellsInd() {
-            seqOf = new ArrayList<PCIARFCN>();
+        public HoTrigger() {
+            seqOf = new ArrayList<RXSigReport>();
         }
 
-        public ScellsInd(byte[] code) {
+        public HoTrigger(byte[] code) {
             this.code = code;
         }
 
+
         @JsonValue
-        public List<PCIARFCN> getPCIARFCN() {
+        public List<RXSigReport> getRXSigReport() {
             if (seqOf == null) {
-                seqOf = new ArrayList<PCIARFCN>();
+                seqOf = new ArrayList<RXSigReport>();
             }
             return seqOf;
         }
@@ -299,7 +342,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                PCIARFCN element = new PCIARFCN();
+                RXSigReport element = new RXSigReport();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -326,14 +369,14 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<PCIARFCN> it = seqOf.iterator();
+                Iterator<RXSigReport> it = seqOf.iterator();
                 if (it.hasNext()) {
                     it.next().appendAsString(sb, indentLevel + 1);
                     while (it.hasNext()) {
@@ -350,12 +393,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
-        }
     }
 
 }
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOComplete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOComplete.java
new file mode 100644
index 0000000..8094bab
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOComplete.java
@@ -0,0 +1,205 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class HOComplete implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgiT = null;
+    private ECGI ecgiS = null;
+    private CRNTI crntiNew = null;
+
+    public HOComplete() {
+    }
+
+    public HOComplete(byte[] code) {
+        this.code = code;
+    }
+
+    public ECGI getEcgiT() {
+        return ecgiT;
+    }
+
+    public void setEcgiT(ECGI ecgiT) {
+        this.ecgiT = ecgiT;
+    }
+
+    public ECGI getEcgiS() {
+        return ecgiS;
+    }
+
+    public void setEcgiS(ECGI ecgiS) {
+        this.ecgiS = ecgiS;
+    }
+
+    public CRNTI getCrntiNew() {
+        return crntiNew;
+    }
+
+    public void setCrntiNew(CRNTI crntiNew) {
+        this.crntiNew = crntiNew;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += crntiNew.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgiS.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += ecgiT.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgiT = new ECGI();
+            subCodeLength += ecgiT.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgiS = new ECGI();
+            subCodeLength += ecgiS.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            crntiNew = new CRNTI();
+            subCodeLength += crntiNew.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgiT != null) {
+            sb.append("ecgiT: ");
+            ecgiT.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgiT: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgiS != null) {
+            sb.append("ecgiS: ");
+            ecgiS.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgiS: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crntiNew != null) {
+            sb.append("crntiNew: ").append(crntiNew);
+        } else {
+            sb.append("crntiNew: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOFailure.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOFailure.java
new file mode 100644
index 0000000..9b96818
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HOFailure.java
@@ -0,0 +1,205 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.HOFailureCause;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class HOFailure implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private HOFailureCause cause = null;
+
+    public HOFailure() {
+    }
+
+    public HOFailure(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public HOFailureCause getCause() {
+        return cause;
+    }
+
+    public void setCause(HOFailureCause cause) {
+        this.cause = cause;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += cause.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            cause = new HOFailureCause();
+            subCodeLength += cause.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (cause != null) {
+            sb.append("cause: ").append(cause);
+        } else {
+            sb.append("cause: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HORequest.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HORequest.java
new file mode 100644
index 0000000..2618f0b
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/HORequest.java
@@ -0,0 +1,234 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class HORequest implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgiS = null;
+    private ECGI ecgiT = null;
+
+    public HORequest() {
+    }
+
+    public HORequest(byte[] code) {
+        this.code = code;
+    }
+
+    public static XrancPdu constructPacket(CRNTI crnti, ECGI ecgis, ECGI ecgit) {
+        HORequest hoRequest = new HORequest();
+
+        hoRequest.setCrnti(crnti);
+        hoRequest.setEcgiS(ecgis);
+        hoRequest.setEcgiT(ecgit);
+
+        BerUTF8String ver = null;
+        try {
+            ver = new BerUTF8String("5");
+        } catch (Exception ignored) {
+        }
+
+        XrancApiID apiID = new XrancApiID(12);
+        XrancPduBody body = new XrancPduBody();
+        body.setHORequest(hoRequest);
+
+        XrancPduHdr hdr = new XrancPduHdr();
+        hdr.setVer(ver);
+        hdr.setApiId(apiID);
+
+        XrancPdu pdu = new XrancPdu();
+        pdu.setBody(body);
+        pdu.setHdr(hdr);
+
+        return pdu;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgiS() {
+        return ecgiS;
+    }
+
+    public void setEcgiS(ECGI ecgiS) {
+        this.ecgiS = ecgiS;
+    }
+
+    public ECGI getEcgiT() {
+        return ecgiT;
+    }
+
+    public void setEcgiT(ECGI ecgiT) {
+        this.ecgiT = ecgiT;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += ecgiT.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += ecgiS.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgiS = new ECGI();
+            subCodeLength += ecgiS.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            ecgiT = new ECGI();
+            subCodeLength += ecgiT.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgiS != null) {
+            sb.append("ecgiS: ");
+            ecgiS.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgiS: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgiT != null) {
+            sb.append("ecgiT: ");
+            ecgiT.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgiT: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/L2MeasConfig.java
similarity index 67%
copy from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/L2MeasConfig.java
index 6080f69..16f00d0 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/L2MeasConfig.java
@@ -1,18 +1,20 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
+
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.L2MeasReportInterval;
+import org.onosproject.xran.asn1lib.api.L2ReportInterval;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -22,39 +24,47 @@
 import java.util.Iterator;
 import java.util.List;
 
-public class ScellDelete implements Serializable {
+public class L2MeasConfig implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
     @JsonIgnore
     public byte[] code = null;
-    private CRNTI crnti = null;
     private ECGI ecgi = null;
-    private ScellsInd scellsInd = null;
-    public ScellDelete() {
+    private Crnti crnti = null;
+    private L2ReportInterval reportIntervals = null;
+
+    public L2MeasConfig() {
     }
-    public ScellDelete(byte[] code) {
+
+    public L2MeasConfig(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
-        ScellDelete scellDelete = new ScellDelete();
-        scellDelete.setEcgi(ecgi);
-        scellDelete.setCrnti(crnti);
-        ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
-        scellDelete.setScellsInd(scellsInd);
+    public static XrancPdu constructPacket(ECGI ecgi, int l2MeasInterval) {
+        L2MeasConfig measConfig = new L2MeasConfig();
+        measConfig.setEcgi(ecgi);
+
+        L2ReportInterval l2ReportInterval = new L2ReportInterval();
+        L2MeasReportInterval l2MeasReportInterval = new L2MeasReportInterval(l2MeasInterval);
+        l2ReportInterval.setTPdcpMeasReportPerUe(l2MeasReportInterval);
+        l2ReportInterval.setTRadioMeasReportPerCell(l2MeasReportInterval);
+        l2ReportInterval.setTRadioMeasReportPerUe(l2MeasReportInterval);
+        l2ReportInterval.setTRadioSchedReportPerUe(l2MeasReportInterval);
+        l2ReportInterval.setTRadioSchedReportPerCell(l2MeasReportInterval);
+
+        measConfig.setReportIntervals(l2ReportInterval);
 
         BerUTF8String ver = null;
         try {
-            ver = new BerUTF8String("3");
+            ver = new BerUTF8String("5");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
 
-        XrancApiID apiID = new XrancApiID(28);
+        XrancApiID apiID = new XrancApiID(16);
         XrancPduBody body = new XrancPduBody();
-        body.setScellDelete(scellDelete);
+        body.setL2MeasConfig(measConfig);
 
         XrancPduHdr hdr = new XrancPduHdr();
         hdr.setVer(ver);
@@ -68,14 +78,6 @@
 
     }
 
-    public CRNTI getCrnti() {
-        return crnti;
-    }
-
-    public void setCrnti(CRNTI crnti) {
-        this.crnti = crnti;
-    }
-
     public ECGI getEcgi() {
         return ecgi;
     }
@@ -84,12 +86,20 @@
         this.ecgi = ecgi;
     }
 
-    public ScellsInd getScellsInd() {
-        return scellsInd;
+    public Crnti getCrnti() {
+        return crnti;
     }
 
-    public void setScellsInd(ScellsInd scellsInd) {
-        this.scellsInd = scellsInd;
+    public void setCrnti(Crnti crnti) {
+        this.crnti = crnti;
+    }
+
+    public L2ReportInterval getReportIntervals() {
+        return reportIntervals;
+    }
+
+    public void setReportIntervals(L2ReportInterval reportIntervals) {
+        this.reportIntervals = reportIntervals;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -109,19 +119,21 @@
         }
 
         int codeLength = 0;
-        codeLength += scellsInd.encode(os, false);
+        codeLength += reportIntervals.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
         os.write(0xA2);
         codeLength += 1;
 
-        codeLength += ecgi.encode(os, false);
-        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-        os.write(0xA1);
-        codeLength += 1;
+        if (crnti != null) {
+            codeLength += crnti.encode(os, false);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+            os.write(0xA1);
+            codeLength += 1;
+        }
 
-        codeLength += crnti.encode(os, false);
-        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
-        os.write(0x80);
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
         codeLength += 1;
 
         codeLength += BerLength.encodeLength(os, codeLength);
@@ -154,15 +166,7 @@
         codeLength += totalLength;
 
         subCodeLength += berTag.decode(is);
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-            crnti = new CRNTI();
-            subCodeLength += crnti.decode(is, false);
-            subCodeLength += berTag.decode(is);
-        } else {
-            throw new IOException("Tag does not match the mandatory sequence element tag.");
-        }
-
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
             ecgi = new ECGI();
             subCodeLength += ecgi.decode(is, false);
             subCodeLength += berTag.decode(is);
@@ -170,9 +174,15 @@
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            crnti = new Crnti();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        }
+
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-            scellsInd = new ScellsInd();
-            subCodeLength += scellsInd.decode(is, false);
+            reportIntervals = new L2ReportInterval();
+            subCodeLength += reportIntervals.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -201,26 +211,31 @@
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (crnti != null) {
-            sb.append("crnti: ").append(crnti);
-        }
-
-        sb.append(",\n");
-        for (int i = 0; i < indentLevel + 1; i++) {
-            sb.append("\t");
-        }
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        if (crnti != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("crnti: ");
+            crnti.appendAsString(sb, indentLevel + 1);
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (scellsInd != null) {
-            sb.append("scellsInd: ");
-            scellsInd.appendAsString(sb, indentLevel + 1);
+        if (reportIntervals != null) {
+            sb.append("reportIntervals: ");
+            reportIntervals.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("reportIntervals: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -230,25 +245,27 @@
         sb.append("}");
     }
 
-    public static class ScellsInd implements Serializable {
+    public static class Crnti implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
-        private List<PCIARFCN> seqOf = null;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<CRNTI> seqOf = null;
 
-        public ScellsInd() {
-            seqOf = new ArrayList<PCIARFCN>();
+        public Crnti() {
+            seqOf = new ArrayList<CRNTI>();
         }
 
-        public ScellsInd(byte[] code) {
+        public Crnti(byte[] code) {
             this.code = code;
         }
 
+
         @JsonValue
-        public List<PCIARFCN> getPCIARFCN() {
+        public List<CRNTI> getCRNTI() {
             if (seqOf == null) {
-                seqOf = new ArrayList<PCIARFCN>();
+                seqOf = new ArrayList<CRNTI>();
             }
             return seqOf;
         }
@@ -299,7 +316,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                PCIARFCN element = new PCIARFCN();
+                CRNTI element = new CRNTI();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -326,22 +343,22 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<PCIARFCN> it = seqOf.iterator();
+                Iterator<CRNTI> it = seqOf.iterator();
                 if (it.hasNext()) {
-                    it.next().appendAsString(sb, indentLevel + 1);
+                    sb.append(it.next());
                     while (it.hasNext()) {
                         sb.append(",\n");
                         for (int i = 0; i < indentLevel + 1; i++) {
                             sb.append("\t");
                         }
-                        it.next().appendAsString(sb, indentLevel + 1);
+                        sb.append(it.next());
                     }
                 }
             }
@@ -350,12 +367,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
-        }
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/PDCPMeasReportPerUe.java
similarity index 67%
copy from src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/PDCPMeasReportPerUe.java
index 7cd1606..8765da9 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/PDCPMeasReportPerUe.java
@@ -1,75 +1,53 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.XICICPA;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerBitString;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.QCI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class RRMConfig implements Serializable {
+public class PDCPMeasReportPerUe implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
+
     @JsonIgnore
     public byte[] code = null;
     private ECGI ecgi = null;
-    private Crnti crnti = null;
-    private Pa pa = null;
-    private StartPrbDl startPrbDl = null;
-    private EndPrbDl endPrbDl = null;
-    private SubframeBitmaskDl subframeBitmaskDl = null;
-    private P0UePusch p0UePusch = null;
-    private StartPrbUl startPrbUl = null;
-    private EndPrbUl endPrbUl = null;
-    private SubframeBitmaskUl subframeBitmaskUl = null;
+    private CRNTI crnti = null;
+    private QciVals qciVals = null;
+    private DataVolDl dataVolDl = null;
+    private DataVolUl dataVolUl = null;
+    private PktDelayDl pktDelayDl = null;
+    private PktDelayUl pktDelayUl = null;
+    private PktDiscardRateDl pktDiscardRateDl = null;
+    private PktLossRateDl pktLossRateDl = null;
+    private PktLossRateUl pktLossRateUl = null;
+    private ThroughputDl throughputDl = null;
+    private ThroughputUl throughputUl = null;
 
-    public RRMConfig() {
+    public PDCPMeasReportPerUe() {
     }
 
-    public RRMConfig(byte[] code) {
+    public PDCPMeasReportPerUe(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(RRMConfig config) {
-        XrancPduBody body = new XrancPduBody();
-        body.setRRMConfig(config);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("3");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(29);
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setHdr(hdr);
-        pdu.setBody(body);
-        return pdu;
-    }
-
     public ECGI getEcgi() {
         return ecgi;
     }
@@ -78,76 +56,92 @@
         this.ecgi = ecgi;
     }
 
-    public Crnti getCrnti() {
+    public CRNTI getCrnti() {
         return crnti;
     }
 
-    public void setCrnti(Crnti crnti) {
+    public void setCrnti(CRNTI crnti) {
         this.crnti = crnti;
     }
 
-    public Pa getPa() {
-        return pa;
+    public QciVals getQciVals() {
+        return qciVals;
     }
 
-    public void setPa(Pa pa) {
-        this.pa = pa;
+    public void setQciVals(QciVals qciVals) {
+        this.qciVals = qciVals;
     }
 
-    public StartPrbDl getStartPrbDl() {
-        return startPrbDl;
+    public DataVolDl getDataVolDl() {
+        return dataVolDl;
     }
 
-    public void setStartPrbDl(StartPrbDl startPrbDl) {
-        this.startPrbDl = startPrbDl;
+    public void setDataVolDl(DataVolDl dataVolDl) {
+        this.dataVolDl = dataVolDl;
     }
 
-    public EndPrbDl getEndPrbDl() {
-        return endPrbDl;
+    public DataVolUl getDataVolUl() {
+        return dataVolUl;
     }
 
-    public void setEndPrbDl(EndPrbDl endPrbDl) {
-        this.endPrbDl = endPrbDl;
+    public void setDataVolUl(DataVolUl dataVolUl) {
+        this.dataVolUl = dataVolUl;
     }
 
-    public SubframeBitmaskDl getSubframeBitmaskDl() {
-        return subframeBitmaskDl;
+    public PktDelayDl getPktDelayDl() {
+        return pktDelayDl;
     }
 
-    public void setSubframeBitmaskDl(SubframeBitmaskDl subframeBitmaskDl) {
-        this.subframeBitmaskDl = subframeBitmaskDl;
+    public void setPktDelayDl(PktDelayDl pktDelayDl) {
+        this.pktDelayDl = pktDelayDl;
     }
 
-    public P0UePusch getP0UePusch() {
-        return p0UePusch;
+    public PktDelayUl getPktDelayUl() {
+        return pktDelayUl;
     }
 
-    public void setP0UePusch(P0UePusch p0UePusch) {
-        this.p0UePusch = p0UePusch;
+    public void setPktDelayUl(PktDelayUl pktDelayUl) {
+        this.pktDelayUl = pktDelayUl;
     }
 
-    public StartPrbUl getStartPrbUl() {
-        return startPrbUl;
+    public PktDiscardRateDl getPktDiscardRateDl() {
+        return pktDiscardRateDl;
     }
 
-    public void setStartPrbUl(StartPrbUl startPrbUl) {
-        this.startPrbUl = startPrbUl;
+    public void setPktDiscardRateDl(PktDiscardRateDl pktDiscardRateDl) {
+        this.pktDiscardRateDl = pktDiscardRateDl;
     }
 
-    public EndPrbUl getEndPrbUl() {
-        return endPrbUl;
+    public PktLossRateDl getPktLossRateDl() {
+        return pktLossRateDl;
     }
 
-    public void setEndPrbUl(EndPrbUl endPrbUl) {
-        this.endPrbUl = endPrbUl;
+    public void setPktLossRateDl(PktLossRateDl pktLossRateDl) {
+        this.pktLossRateDl = pktLossRateDl;
     }
 
-    public SubframeBitmaskUl getSubframeBitmaskUl() {
-        return subframeBitmaskUl;
+    public PktLossRateUl getPktLossRateUl() {
+        return pktLossRateUl;
     }
 
-    public void setSubframeBitmaskUl(SubframeBitmaskUl subframeBitmaskUl) {
-        this.subframeBitmaskUl = subframeBitmaskUl;
+    public void setPktLossRateUl(PktLossRateUl pktLossRateUl) {
+        this.pktLossRateUl = pktLossRateUl;
+    }
+
+    public ThroughputDl getThroughputDl() {
+        return throughputDl;
+    }
+
+    public void setThroughputDl(ThroughputDl throughputDl) {
+        this.throughputDl = throughputDl;
+    }
+
+    public ThroughputUl getThroughputUl() {
+        return throughputUl;
+    }
+
+    public void setThroughputUl(ThroughputUl throughputUl) {
+        this.throughputUl = throughputUl;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -167,68 +161,60 @@
         }
 
         int codeLength = 0;
-        if (subframeBitmaskUl != null) {
-            codeLength += subframeBitmaskUl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 9
-            os.write(0xA9);
-            codeLength += 1;
-        }
+        codeLength += throughputUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 11
+        os.write(0xAB);
+        codeLength += 1;
 
-        if (endPrbUl != null) {
-            codeLength += endPrbUl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 8
-            os.write(0xA8);
-            codeLength += 1;
-        }
+        codeLength += throughputDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 10
+        os.write(0xAA);
+        codeLength += 1;
 
-        if (startPrbUl != null) {
-            codeLength += startPrbUl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 7
-            os.write(0xA7);
-            codeLength += 1;
-        }
+        codeLength += pktLossRateUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 9
+        os.write(0xA9);
+        codeLength += 1;
 
-        if (p0UePusch != null) {
-            codeLength += p0UePusch.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 6
-            os.write(0xA6);
-            codeLength += 1;
-        }
+        codeLength += pktLossRateDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 8
+        os.write(0xA8);
+        codeLength += 1;
 
-        if (subframeBitmaskDl != null) {
-            codeLength += subframeBitmaskDl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 5
-            os.write(0xA5);
-            codeLength += 1;
-        }
+        codeLength += pktDiscardRateDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 7
+        os.write(0xA7);
+        codeLength += 1;
 
-        if (endPrbDl != null) {
-            codeLength += endPrbDl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
-            os.write(0xA4);
-            codeLength += 1;
-        }
+        codeLength += pktDelayUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 6
+        os.write(0xA6);
+        codeLength += 1;
 
-        if (startPrbDl != null) {
-            codeLength += startPrbDl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-            os.write(0xA3);
-            codeLength += 1;
-        }
+        codeLength += pktDelayDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 5
+        os.write(0xA5);
+        codeLength += 1;
 
-        if (pa != null) {
-            codeLength += pa.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-            os.write(0xA2);
-            codeLength += 1;
-        }
+        codeLength += dataVolUl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
+        os.write(0xA4);
+        codeLength += 1;
 
-        if (crnti != null) {
-            codeLength += crnti.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-            os.write(0xA1);
-            codeLength += 1;
-        }
+        codeLength += dataVolDl.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
+        codeLength += qciVals.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
+        codeLength += 1;
 
         codeLength += ecgi.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
@@ -268,89 +254,94 @@
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
             ecgi = new ECGI();
             subCodeLength += ecgi.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
             subCodeLength += berTag.decode(is);
         } else {
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-            crnti = new Crnti();
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            crnti = new CRNTI();
             subCodeLength += crnti.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
             subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-            pa = new Pa();
-            subCodeLength += pa.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
+            qciVals = new QciVals();
+            subCodeLength += qciVals.decode(is, false);
             subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-            startPrbDl = new StartPrbDl();
-            subCodeLength += startPrbDl.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
+            dataVolDl = new DataVolDl();
+            subCodeLength += dataVolDl.decode(is, false);
             subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
-            endPrbDl = new EndPrbDl();
-            subCodeLength += endPrbDl.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
+            dataVolUl = new DataVolUl();
+            subCodeLength += dataVolUl.decode(is, false);
             subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 5)) {
-            subframeBitmaskDl = new SubframeBitmaskDl();
-            subCodeLength += subframeBitmaskDl.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
+            pktDelayDl = new PktDelayDl();
+            subCodeLength += pktDelayDl.decode(is, false);
             subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 6)) {
-            p0UePusch = new P0UePusch();
-            subCodeLength += p0UePusch.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
+            pktDelayUl = new PktDelayUl();
+            subCodeLength += pktDelayUl.decode(is, false);
             subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 7)) {
-            startPrbUl = new StartPrbUl();
-            subCodeLength += startPrbUl.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
+            pktDiscardRateDl = new PktDiscardRateDl();
+            subCodeLength += pktDiscardRateDl.decode(is, false);
             subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 8)) {
-            endPrbUl = new EndPrbUl();
-            subCodeLength += endPrbUl.decode(is, false);
-            if (subCodeLength == totalLength) {
-                return codeLength;
-            }
+            pktLossRateDl = new PktLossRateDl();
+            subCodeLength += pktLossRateDl.decode(is, false);
             subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 9)) {
-            subframeBitmaskUl = new SubframeBitmaskUl();
-            subCodeLength += subframeBitmaskUl.decode(is, false);
+            pktLossRateUl = new PktLossRateUl();
+            subCodeLength += pktLossRateUl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 10)) {
+            throughputDl = new ThroughputDl();
+            subCodeLength += throughputDl.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 11)) {
+            throughputUl = new ThroughputUl();
+            subCodeLength += throughputUl.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -382,87 +373,128 @@
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
         if (crnti != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("crnti: ");
-            crnti.appendAsString(sb, indentLevel + 1);
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
         }
 
-        if (pa != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("pa: ");
-            pa.appendAsString(sb, indentLevel + 1);
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (qciVals != null) {
+            sb.append("qciVals: ");
+            qciVals.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("qciVals: <empty-required-field>");
         }
 
-        if (startPrbDl != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("startPrbDl: ");
-            startPrbDl.appendAsString(sb, indentLevel + 1);
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (dataVolDl != null) {
+            sb.append("dataVolDl: ");
+            dataVolDl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("dataVolDl: <empty-required-field>");
         }
 
-        if (endPrbDl != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("endPrbDl: ");
-            endPrbDl.appendAsString(sb, indentLevel + 1);
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (dataVolUl != null) {
+            sb.append("dataVolUl: ");
+            dataVolUl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("dataVolUl: <empty-required-field>");
         }
 
-        if (subframeBitmaskDl != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("subframeBitmaskDl: ");
-            subframeBitmaskDl.appendAsString(sb, indentLevel + 1);
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pktDelayDl != null) {
+            sb.append("pktDelayDl: ");
+            pktDelayDl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pktDelayDl: <empty-required-field>");
         }
 
-        if (p0UePusch != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("p0UePusch: ");
-            p0UePusch.appendAsString(sb, indentLevel + 1);
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pktDelayUl != null) {
+            sb.append("pktDelayUl: ");
+            pktDelayUl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pktDelayUl: <empty-required-field>");
         }
 
-        if (startPrbUl != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("startPrbUl: ");
-            startPrbUl.appendAsString(sb, indentLevel + 1);
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pktDiscardRateDl != null) {
+            sb.append("pktDiscardRateDl: ");
+            pktDiscardRateDl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pktDiscardRateDl: <empty-required-field>");
         }
 
-        if (endPrbUl != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("endPrbUl: ");
-            endPrbUl.appendAsString(sb, indentLevel + 1);
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pktLossRateDl != null) {
+            sb.append("pktLossRateDl: ");
+            pktLossRateDl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pktLossRateDl: <empty-required-field>");
         }
 
-        if (subframeBitmaskUl != null) {
-            sb.append(",\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            sb.append("subframeBitmaskUl: ");
-            subframeBitmaskUl.appendAsString(sb, indentLevel + 1);
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pktLossRateUl != null) {
+            sb.append("pktLossRateUl: ");
+            pktLossRateUl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pktLossRateUl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (throughputDl != null) {
+            sb.append("throughputDl: ");
+            throughputDl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("throughputDl: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (throughputUl != null) {
+            sb.append("throughputUl: ");
+            throughputUl.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("throughputUl: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -472,34 +504,32 @@
         sb.append("}");
     }
 
-    public static class Crnti implements Serializable {
+    public static class QciVals implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
+
         @JsonIgnore
         public byte[] code = null;
-        private List<CRNTI> seqOf = null;
+        private List<QCI> seqOf = null;
 
-        public Crnti() {
-            seqOf = new ArrayList<CRNTI>();
+        public QciVals() {
+            seqOf = new ArrayList<QCI>();
         }
 
-        public Crnti(byte[] code) {
+        public QciVals(byte[] code) {
             this.code = code;
         }
 
+
         @JsonValue
-        public List<CRNTI> getCRNTI() {
+        public List<QCI> getQCI() {
             if (seqOf == null) {
-                seqOf = new ArrayList<CRNTI>();
+                seqOf = new ArrayList<QCI>();
             }
             return seqOf;
         }
 
-        public void addCRNTI(CRNTI crnti) {
-            seqOf.add(crnti);
-        }
-
         public int encode(BerByteArrayOutputStream os) throws IOException {
             return encode(os, true);
         }
@@ -546,7 +576,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                CRNTI element = new CRNTI();
+                QCI element = new QCI();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -573,14 +603,14 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<CRNTI> it = seqOf.iterator();
+                Iterator<QCI> it = seqOf.iterator();
                 if (it.hasNext()) {
                     sb.append(it.next());
                     while (it.hasNext()) {
@@ -597,163 +627,28 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
     }
 
-    public static class Pa implements Serializable {
+    public static class DataVolDl implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore
-        public byte[] code = null;
-        private List<XICICPA> seqOf = null;
 
-        public Pa() {
-            seqOf = new ArrayList<XICICPA>();
-        }
-
-        public Pa(byte[] code) {
-            this.code = code;
-        }
-
-        @JsonValue
-        public List<XICICPA> getXICICPA() {
-            if (seqOf == null) {
-                seqOf = new ArrayList<XICICPA>();
-            }
-            return seqOf;
-        }
-
-        public void setXICICPA(List<XICICPA> seqOf) {
-            this.seqOf = seqOf;
-        }
-
-        public int encode(BerByteArrayOutputStream os) throws IOException {
-            return encode(os, true);
-        }
-
-        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-            if (code != null) {
-                for (int i = code.length - 1; i >= 0; i--) {
-                    os.write(code[i]);
-                }
-                if (withTag) {
-                    return tag.encode(os) + code.length;
-                }
-                return code.length;
-            }
-
-            int codeLength = 0;
-            for (int i = (seqOf.size() - 1); i >= 0; i--) {
-                codeLength += seqOf.get(i).encode(os, true);
-            }
-
-            codeLength += BerLength.encodeLength(os, codeLength);
-
-            if (withTag) {
-                codeLength += tag.encode(os);
-            }
-
-            return codeLength;
-        }
-
-        public int decode(InputStream is) throws IOException {
-            return decode(is, true);
-        }
-
-        public int decode(InputStream is, boolean withTag) throws IOException {
-            int codeLength = 0;
-            int subCodeLength = 0;
-            if (withTag) {
-                codeLength += tag.decodeAndCheck(is);
-            }
-
-            BerLength length = new BerLength();
-            codeLength += length.decode(is);
-            int totalLength = length.val;
-
-            while (subCodeLength < totalLength) {
-                XICICPA element = new XICICPA();
-                subCodeLength += element.decode(is, true);
-                seqOf.add(element);
-            }
-            if (subCodeLength != totalLength) {
-                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-            }
-            codeLength += subCodeLength;
-
-            return codeLength;
-        }
-
-        public void encodeAndSave(int encodingSizeGuess) throws IOException {
-            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-            encode(os, false);
-            code = os.getArray();
-        }
-
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-            appendAsString(sb, 0);
-            return sb.toString();
-        }
-
-        public void appendAsString(StringBuilder sb, int indentLevel) {
-
-            sb.append("[\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            if (seqOf == null) {
-//				sb.append("null");
-            } else {
-                Iterator<XICICPA> it = seqOf.iterator();
-                if (it.hasNext()) {
-                    sb.append(it.next());
-                    while (it.hasNext()) {
-                        sb.append(",\n");
-                        for (int i = 0; i < indentLevel + 1; i++) {
-                            sb.append("\t");
-                        }
-                        sb.append(it.next());
-                    }
-                }
-            }
-
-            sb.append("\n");
-            for (int i = 0; i < indentLevel; i++) {
-                sb.append("\t");
-            }
-            sb.append("]");
-        }
-    }
-
-    public static class StartPrbDl implements Serializable {
-
-        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-        private static final long serialVersionUID = 1L;
         @JsonIgnore
         public byte[] code = null;
         private List<BerInteger> seqOf = null;
 
-        public StartPrbDl() {
+        public DataVolDl() {
             seqOf = new ArrayList<BerInteger>();
         }
 
-        public StartPrbDl(byte[] code) {
+        public DataVolDl(byte[] code) {
             this.code = code;
         }
 
-        public List<BerInteger> getSeqOf() {
-            return seqOf;
-        }
-
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
 
         @JsonValue
         public List<BerInteger> getBerInteger() {
@@ -836,12 +731,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -860,30 +755,29 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addBerInteger(BerInteger berInteger) {
-            seqOf.add(berInteger);
-        }
     }
 
-    public static class EndPrbDl implements Serializable {
+    public static class DataVolUl implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
+
         @JsonIgnore
         public byte[] code = null;
         private List<BerInteger> seqOf = null;
 
-        public EndPrbDl() {
+        public DataVolUl() {
             seqOf = new ArrayList<BerInteger>();
         }
 
-        public EndPrbDl(byte[] code) {
+        public DataVolUl(byte[] code) {
             this.code = code;
         }
 
+
         @JsonValue
         public List<BerInteger> getBerInteger() {
             if (seqOf == null) {
@@ -965,12 +859,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -989,172 +883,29 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addBerInteger(BerInteger berInteger) {
-            seqOf.add(berInteger);
-        }
-
-        public List<BerInteger> getSeqOf() {
-            return seqOf;
-        }
-
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
     }
 
-    public static class SubframeBitmaskDl implements Serializable {
+    public static class PktDelayDl implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore
-        public byte[] code = null;
-        private List<BerBitString> seqOf = null;
 
-        public SubframeBitmaskDl() {
-            seqOf = new ArrayList<BerBitString>();
-        }
-
-        public SubframeBitmaskDl(byte[] code) {
-            this.code = code;
-        }
-
-        public void setSeqOf(List<BerBitString> seqOf) {
-            this.seqOf = seqOf;
-        }
-
-        @JsonValue
-        public List<BerBitString> getBerBitString() {
-            if (seqOf == null) {
-                seqOf = new ArrayList<BerBitString>();
-            }
-            return seqOf;
-        }
-
-
-        public void addBerBitString(BerBitString berBitString) {
-            seqOf.add(berBitString);
-        }
-
-        public int encode(BerByteArrayOutputStream os) throws IOException {
-            return encode(os, true);
-        }
-
-        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-            if (code != null) {
-                for (int i = code.length - 1; i >= 0; i--) {
-                    os.write(code[i]);
-                }
-                if (withTag) {
-                    return tag.encode(os) + code.length;
-                }
-                return code.length;
-            }
-
-            int codeLength = 0;
-            for (int i = (seqOf.size() - 1); i >= 0; i--) {
-                codeLength += seqOf.get(i).encode(os, true);
-            }
-
-            codeLength += BerLength.encodeLength(os, codeLength);
-
-            if (withTag) {
-                codeLength += tag.encode(os);
-            }
-
-            return codeLength;
-        }
-
-        public int decode(InputStream is) throws IOException {
-            return decode(is, true);
-        }
-
-        public int decode(InputStream is, boolean withTag) throws IOException {
-            int codeLength = 0;
-            int subCodeLength = 0;
-            if (withTag) {
-                codeLength += tag.decodeAndCheck(is);
-            }
-
-            BerLength length = new BerLength();
-            codeLength += length.decode(is);
-            int totalLength = length.val;
-
-            while (subCodeLength < totalLength) {
-                BerBitString element = new BerBitString();
-                subCodeLength += element.decode(is, true);
-                seqOf.add(element);
-            }
-            if (subCodeLength != totalLength) {
-                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-            }
-            codeLength += subCodeLength;
-
-            return codeLength;
-        }
-
-        public void encodeAndSave(int encodingSizeGuess) throws IOException {
-            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-            encode(os, false);
-            code = os.getArray();
-        }
-
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-            appendAsString(sb, 0);
-            return sb.toString();
-        }
-
-        public void appendAsString(StringBuilder sb, int indentLevel) {
-
-            sb.append("[\n");
-            for (int i = 0; i < indentLevel + 1; i++) {
-                sb.append("\t");
-            }
-            if (seqOf == null) {
-//				sb.append("null");
-            } else {
-                Iterator<BerBitString> it = seqOf.iterator();
-                if (it.hasNext()) {
-                    sb.append("" + it.next() + "");
-                    while (it.hasNext()) {
-                        sb.append(",\n");
-                        for (int i = 0; i < indentLevel + 1; i++) {
-                            sb.append("\t");
-                        }
-                        sb.append("" + it.next() + "");
-                    }
-                }
-            }
-
-            sb.append("\n");
-            for (int i = 0; i < indentLevel; i++) {
-                sb.append("\t");
-            }
-            sb.append("]");
-        }
-    }
-
-    public static class P0UePusch implements Serializable {
-
-        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-        private static final long serialVersionUID = 1L;
         @JsonIgnore
         public byte[] code = null;
         private List<BerInteger> seqOf = null;
 
-        public P0UePusch() {
+        public PktDelayDl() {
             seqOf = new ArrayList<BerInteger>();
         }
 
-        public P0UePusch(byte[] code) {
+        public PktDelayDl(byte[] code) {
             this.code = code;
         }
 
+
         @JsonValue
         public List<BerInteger> getBerInteger() {
             if (seqOf == null) {
@@ -1236,12 +987,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -1260,30 +1011,29 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
     }
 
-    public static class StartPrbUl implements Serializable {
+    public static class PktDelayUl implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
+
         @JsonIgnore
         public byte[] code = null;
         private List<BerInteger> seqOf = null;
 
-        public StartPrbUl() {
+        public PktDelayUl() {
             seqOf = new ArrayList<BerInteger>();
         }
 
-        public StartPrbUl(byte[] code) {
+        public PktDelayUl(byte[] code) {
             this.code = code;
         }
 
+
         @JsonValue
         public List<BerInteger> getBerInteger() {
             if (seqOf == null) {
@@ -1365,12 +1115,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -1389,38 +1139,29 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addBerInteger(BerInteger berInteger) {
-            seqOf.add(berInteger);
-        }
-
-        public List<BerInteger> getSeqOf() {
-            return seqOf;
-        }
-
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
     }
 
-    public static class EndPrbUl implements Serializable {
+    public static class PktDiscardRateDl implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
+
         @JsonIgnore
         public byte[] code = null;
         private List<BerInteger> seqOf = null;
 
-        public EndPrbUl() {
+        public PktDiscardRateDl() {
             seqOf = new ArrayList<BerInteger>();
         }
 
-        public EndPrbUl(byte[] code) {
+        public PktDiscardRateDl(byte[] code) {
             this.code = code;
         }
 
+
         @JsonValue
         public List<BerInteger> getBerInteger() {
             if (seqOf == null) {
@@ -1502,12 +1243,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -1526,46 +1267,33 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addBerInteger(BerInteger berInteger) {
-            seqOf.add(berInteger);
-        }
-
-        public List<BerInteger> getSeqOf() {
-            return seqOf;
-        }
-
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
     }
 
-    public static class SubframeBitmaskUl implements Serializable {
+    public static class PktLossRateDl implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
+
         @JsonIgnore
         public byte[] code = null;
-        private List<BerBitString> seqOf = null;
+        private List<BerInteger> seqOf = null;
 
-        public SubframeBitmaskUl() {
-            seqOf = new ArrayList<BerBitString>();
+        public PktLossRateDl() {
+            seqOf = new ArrayList<BerInteger>();
         }
 
-        public SubframeBitmaskUl(byte[] code) {
+        public PktLossRateDl(byte[] code) {
             this.code = code;
         }
 
-        public void setSeqOf(List<BerBitString> seqOf) {
-            this.seqOf = seqOf;
-        }
 
         @JsonValue
-        public List<BerBitString> getBerBitString() {
+        public List<BerInteger> getBerInteger() {
             if (seqOf == null) {
-                seqOf = new ArrayList<BerBitString>();
+                seqOf = new ArrayList<BerInteger>();
             }
             return seqOf;
         }
@@ -1616,7 +1344,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                BerBitString element = new BerBitString();
+                BerInteger element = new BerInteger();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -1643,14 +1371,14 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<BerBitString> it = seqOf.iterator();
+                Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
                     sb.append(it.next());
                     while (it.hasNext()) {
@@ -1667,7 +1395,391 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
+        }
+
+    }
+
+    public static class PktLossRateUl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public PktLossRateUl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public PktLossRateUl(byte[] code) {
+            this.code = code;
+        }
+
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class ThroughputDl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public ThroughputDl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public ThroughputDl(byte[] code) {
+            this.code = code;
+        }
+
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class ThroughputUl implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public ThroughputUl() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public ThroughputUl(byte[] code) {
+            this.code = code;
+        }
+
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
         }
 
     }
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRCMeasConfig.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRCMeasConfig.java
new file mode 100644
index 0000000..20b0980
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRCMeasConfig.java
@@ -0,0 +1,815 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.api.*;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class RRCMeasConfig implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgi = null;
+    private Crnti crnti = null;
+    private MeasObjects measObjects = null;
+    private ReportConfigs reportConfigs = null;
+    private MeasIds measIds = null;
+
+    public RRCMeasConfig() {
+    }
+
+    public RRCMeasConfig(byte[] code) {
+        this.code = code;
+    }
+
+    public static XrancPdu constructPacket(
+            ECGI ecgi, CRNTI crnti, MeasObjects measObjects, ReportConfigs reportConfigs,
+            MeasIds measIds, int rxSignalInterval
+    ) {
+        RRCMeasConfig rrcMeasConfig = new RRCMeasConfig();
+
+        Crnti crntilist = new Crnti();
+        crntilist.getCRNTI().add(crnti);
+
+        rrcMeasConfig.setEcgi(ecgi);
+        rrcMeasConfig.setCrnti(crntilist);
+        rrcMeasConfig.setMeasIds(measIds);
+        rrcMeasConfig.setMeasObjects(measObjects);
+        rrcMeasConfig.setReportConfigs(reportConfigs);
+
+        BerUTF8String ver = null;
+        try {
+            ver = new BerUTF8String("5");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        XrancApiID apiID = new XrancApiID(34);
+        XrancPduBody body = new XrancPduBody();
+        body.setRRCMeasConfig(rrcMeasConfig);
+
+        XrancPduHdr hdr = new XrancPduHdr();
+        hdr.setVer(ver);
+        hdr.setApiId(apiID);
+
+        XrancPdu pdu = new XrancPdu();
+        pdu.setBody(body);
+        pdu.setHdr(hdr);
+
+        return pdu;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public Crnti getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(Crnti crnti) {
+        this.crnti = crnti;
+    }
+
+    public MeasObjects getMeasObjects() {
+        return measObjects;
+    }
+
+    public void setMeasObjects(MeasObjects measObjects) {
+        this.measObjects = measObjects;
+    }
+
+    public ReportConfigs getReportConfigs() {
+        return reportConfigs;
+    }
+
+    public void setReportConfigs(ReportConfigs reportConfigs) {
+        this.reportConfigs = reportConfigs;
+    }
+
+    public MeasIds getMeasIds() {
+        return measIds;
+    }
+
+    public void setMeasIds(MeasIds measIds) {
+        this.measIds = measIds;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += measIds.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
+        os.write(0xA4);
+        codeLength += 1;
+
+        codeLength += reportConfigs.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
+        codeLength += measObjects.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        if (crnti != null) {
+            codeLength += crnti.encode(os, false);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+            os.write(0xA1);
+            codeLength += 1;
+        }
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            crnti = new Crnti();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            measObjects = new MeasObjects();
+            subCodeLength += measObjects.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            reportConfigs = new ReportConfigs();
+            subCodeLength += reportConfigs.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
+            measIds = new MeasIds();
+            subCodeLength += measIds.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        if (crnti != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("crnti: ");
+            crnti.appendAsString(sb, indentLevel + 1);
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (measObjects != null) {
+            sb.append("measObjects: ");
+            measObjects.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("measObjects: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (reportConfigs != null) {
+            sb.append("reportConfigs: ");
+            reportConfigs.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("reportConfigs: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (measIds != null) {
+            sb.append("measIds: ");
+            measIds.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("measIds: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class Crnti implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<CRNTI> seqOf = null;
+
+        public Crnti() {
+            seqOf = new ArrayList<CRNTI>();
+        }
+
+        public Crnti(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<CRNTI> getCRNTI() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<CRNTI>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                CRNTI element = new CRNTI();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<CRNTI> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class MeasObjects implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<MeasObject> seqOf = null;
+
+        public MeasObjects() {
+            seqOf = new ArrayList<MeasObject>();
+        }
+
+        public MeasObjects(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<MeasObject> getMeasObject() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<MeasObject>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                MeasObject element = new MeasObject();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<MeasObject> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    it.next().appendAsString(sb, indentLevel + 1);
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        it.next().appendAsString(sb, indentLevel + 1);
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class ReportConfigs implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<ReportConfig> seqOf = null;
+
+        public ReportConfigs() {
+            seqOf = new ArrayList<ReportConfig>();
+        }
+
+        public ReportConfigs(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<ReportConfig> getReportConfig() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<ReportConfig>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                ReportConfig element = new ReportConfig();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<ReportConfig> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    it.next().appendAsString(sb, indentLevel + 1);
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        it.next().appendAsString(sb, indentLevel + 1);
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class MeasIds implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<MeasID> seqOf = null;
+
+        public MeasIds() {
+            seqOf = new ArrayList<MeasID>();
+        }
+
+        public MeasIds(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<MeasID> getMeasID() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<MeasID>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                MeasID element = new MeasID();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<MeasID> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    it.next().appendAsString(sb, indentLevel + 1);
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        it.next().appendAsString(sb, indentLevel + 1);
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRMConfig.java
similarity index 93%
rename from src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRMConfig.java
index 7cd1606..196071c 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRMConfig.java
@@ -1,20 +1,21 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.XICICPA;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerBitString;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.PCIARFCN;
+import org.onosproject.xran.asn1lib.api.XICICPA;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerBitString;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -32,6 +33,7 @@
     public byte[] code = null;
     private ECGI ecgi = null;
     private Crnti crnti = null;
+    private PCIARFCN pciArfcn = null;
     private Pa pa = null;
     private StartPrbDl startPrbDl = null;
     private EndPrbDl endPrbDl = null;
@@ -44,22 +46,18 @@
     public RRMConfig() {
     }
 
-    public RRMConfig(byte[] code) {
-        this.code = code;
-    }
-
     public static XrancPdu constructPacket(RRMConfig config) {
         XrancPduBody body = new XrancPduBody();
         body.setRRMConfig(config);
 
         BerUTF8String ver = null;
         try {
-            ver = new BerUTF8String("3");
+            ver = new BerUTF8String("5");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
 
-        XrancApiID apiID = new XrancApiID(29);
+        XrancApiID apiID = new XrancApiID(27);
         XrancPduHdr hdr = new XrancPduHdr();
         hdr.setVer(ver);
         hdr.setApiId(apiID);
@@ -70,6 +68,10 @@
         return pdu;
     }
 
+    public RRMConfig(byte[] code) {
+        this.code = code;
+    }
+
     public ECGI getEcgi() {
         return ecgi;
     }
@@ -86,6 +88,14 @@
         this.crnti = crnti;
     }
 
+    public PCIARFCN getPciArfcn() {
+        return pciArfcn;
+    }
+
+    public void setPciArfcn(PCIARFCN pciArfcn) {
+        this.pciArfcn = pciArfcn;
+    }
+
     public Pa getPa() {
         return pa;
     }
@@ -169,55 +179,62 @@
         int codeLength = 0;
         if (subframeBitmaskUl != null) {
             codeLength += subframeBitmaskUl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 9
-            os.write(0xA9);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 10
+            os.write(0xAA);
             codeLength += 1;
         }
 
         if (endPrbUl != null) {
             codeLength += endPrbUl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 8
-            os.write(0xA8);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 9
+            os.write(0xA9);
             codeLength += 1;
         }
 
         if (startPrbUl != null) {
             codeLength += startPrbUl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 7
-            os.write(0xA7);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 8
+            os.write(0xA8);
             codeLength += 1;
         }
 
         if (p0UePusch != null) {
             codeLength += p0UePusch.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 6
-            os.write(0xA6);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 7
+            os.write(0xA7);
             codeLength += 1;
         }
 
         if (subframeBitmaskDl != null) {
             codeLength += subframeBitmaskDl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 5
-            os.write(0xA5);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 6
+            os.write(0xA6);
             codeLength += 1;
         }
 
         if (endPrbDl != null) {
             codeLength += endPrbDl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
-            os.write(0xA4);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 5
+            os.write(0xA5);
             codeLength += 1;
         }
 
         if (startPrbDl != null) {
             codeLength += startPrbDl.encode(os, false);
-            // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-            os.write(0xA3);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 4
+            os.write(0xA4);
             codeLength += 1;
         }
 
         if (pa != null) {
             codeLength += pa.encode(os, false);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+            os.write(0xA3);
+            codeLength += 1;
+        }
+
+        if (pciArfcn != null) {
+            codeLength += pciArfcn.encode(os, false);
             // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
             os.write(0xA2);
             codeLength += 1;
@@ -286,6 +303,15 @@
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            pciArfcn = new PCIARFCN();
+            subCodeLength += pciArfcn.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
             pa = new Pa();
             subCodeLength += pa.decode(is, false);
             if (subCodeLength == totalLength) {
@@ -294,7 +320,7 @@
             subCodeLength += berTag.decode(is);
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
             startPrbDl = new StartPrbDl();
             subCodeLength += startPrbDl.decode(is, false);
             if (subCodeLength == totalLength) {
@@ -303,7 +329,7 @@
             subCodeLength += berTag.decode(is);
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 5)) {
             endPrbDl = new EndPrbDl();
             subCodeLength += endPrbDl.decode(is, false);
             if (subCodeLength == totalLength) {
@@ -312,7 +338,7 @@
             subCodeLength += berTag.decode(is);
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 5)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 6)) {
             subframeBitmaskDl = new SubframeBitmaskDl();
             subCodeLength += subframeBitmaskDl.decode(is, false);
             if (subCodeLength == totalLength) {
@@ -321,7 +347,7 @@
             subCodeLength += berTag.decode(is);
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 6)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 7)) {
             p0UePusch = new P0UePusch();
             subCodeLength += p0UePusch.decode(is, false);
             if (subCodeLength == totalLength) {
@@ -330,7 +356,7 @@
             subCodeLength += berTag.decode(is);
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 7)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 8)) {
             startPrbUl = new StartPrbUl();
             subCodeLength += startPrbUl.decode(is, false);
             if (subCodeLength == totalLength) {
@@ -339,7 +365,7 @@
             subCodeLength += berTag.decode(is);
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 8)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 9)) {
             endPrbUl = new EndPrbUl();
             subCodeLength += endPrbUl.decode(is, false);
             if (subCodeLength == totalLength) {
@@ -348,7 +374,7 @@
             subCodeLength += berTag.decode(is);
         }
 
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 9)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 10)) {
             subframeBitmaskUl = new SubframeBitmaskUl();
             subCodeLength += subframeBitmaskUl.decode(is, false);
             if (subCodeLength == totalLength) {
@@ -382,6 +408,8 @@
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         if (crnti != null) {
@@ -393,6 +421,15 @@
             crnti.appendAsString(sb, indentLevel + 1);
         }
 
+        if (pciArfcn != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("pciArfcn: ");
+            pciArfcn.appendAsString(sb, indentLevel + 1);
+        }
+
         if (pa != null) {
             sb.append(",\n");
             for (int i = 0; i < indentLevel + 1; i++) {
@@ -496,10 +533,6 @@
             return seqOf;
         }
 
-        public void addCRNTI(CRNTI crnti) {
-            seqOf.add(crnti);
-        }
-
         public int encode(BerByteArrayOutputStream os) throws IOException {
             return encode(os, true);
         }
@@ -573,12 +606,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<CRNTI> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -597,7 +630,7 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
     }
@@ -626,10 +659,6 @@
             return seqOf;
         }
 
-        public void setXICICPA(List<XICICPA> seqOf) {
-            this.seqOf = seqOf;
-        }
-
         public int encode(BerByteArrayOutputStream os) throws IOException {
             return encode(os, true);
         }
@@ -703,12 +732,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<XICICPA> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -727,8 +756,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
+
     }
 
     public static class StartPrbDl implements Serializable {
@@ -747,14 +777,6 @@
             this.code = code;
         }
 
-        public List<BerInteger> getSeqOf() {
-            return seqOf;
-        }
-
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
-
         @JsonValue
         public List<BerInteger> getBerInteger() {
             if (seqOf == null) {
@@ -836,12 +858,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -860,12 +882,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addBerInteger(BerInteger berInteger) {
-            seqOf.add(berInteger);
-        }
     }
 
     public static class EndPrbDl implements Serializable {
@@ -965,12 +984,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -989,20 +1008,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addBerInteger(BerInteger berInteger) {
-            seqOf.add(berInteger);
-        }
-
-        public List<BerInteger> getSeqOf() {
-            return seqOf;
-        }
-
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
     }
 
     public static class SubframeBitmaskDl implements Serializable {
@@ -1021,10 +1029,6 @@
             this.code = code;
         }
 
-        public void setSeqOf(List<BerBitString> seqOf) {
-            this.seqOf = seqOf;
-        }
-
         @JsonValue
         public List<BerBitString> getBerBitString() {
             if (seqOf == null) {
@@ -1033,11 +1037,6 @@
             return seqOf;
         }
 
-
-        public void addBerBitString(BerBitString berBitString) {
-            seqOf.add(berBitString);
-        }
-
         public int encode(BerByteArrayOutputStream os) throws IOException {
             return encode(os, true);
         }
@@ -1111,22 +1110,22 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerBitString> it = seqOf.iterator();
                 if (it.hasNext()) {
-                    sb.append("" + it.next() + "");
+                    sb.append(it.next());
                     while (it.hasNext()) {
                         sb.append(",\n");
                         for (int i = 0; i < indentLevel + 1; i++) {
                             sb.append("\t");
                         }
-                        sb.append("" + it.next() + "");
+                        sb.append(it.next());
                     }
                 }
             }
@@ -1135,8 +1134,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
+
     }
 
     public static class P0UePusch implements Serializable {
@@ -1236,12 +1236,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -1260,12 +1260,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
     }
 
     public static class StartPrbUl implements Serializable {
@@ -1365,12 +1362,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -1389,20 +1386,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addBerInteger(BerInteger berInteger) {
-            seqOf.add(berInteger);
-        }
-
-        public List<BerInteger> getSeqOf() {
-            return seqOf;
-        }
-
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
     }
 
     public static class EndPrbUl implements Serializable {
@@ -1502,12 +1488,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerInteger> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -1526,20 +1512,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addBerInteger(BerInteger berInteger) {
-            seqOf.add(berInteger);
-        }
-
-        public List<BerInteger> getSeqOf() {
-            return seqOf;
-        }
-
-        public void setSeqOf(List<BerInteger> seqOf) {
-            this.seqOf = seqOf;
-        }
     }
 
     public static class SubframeBitmaskUl implements Serializable {
@@ -1558,10 +1533,6 @@
             this.code = code;
         }
 
-        public void setSeqOf(List<BerBitString> seqOf) {
-            this.seqOf = seqOf;
-        }
-
         @JsonValue
         public List<BerBitString> getBerBitString() {
             if (seqOf == null) {
@@ -1643,12 +1614,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<BerBitString> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -1667,7 +1638,7 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
     }
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRMConfigStatus.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRMConfigStatus.java
new file mode 100644
index 0000000..009c0da
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RRMConfigStatus.java
@@ -0,0 +1,460 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class RRMConfigStatus implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgi = null;
+    private Crnti crnti = null;
+    private Status status = null;
+
+    public RRMConfigStatus() {
+    }
+
+    public RRMConfigStatus(byte[] code) {
+        this.code = code;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public Crnti getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(Crnti crnti) {
+        this.crnti = crnti;
+    }
+
+    public Status getStatus() {
+        return status;
+    }
+
+    public void setStatus(Status status) {
+        this.status = status;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += status.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        if (crnti != null) {
+            codeLength += crnti.encode(os, false);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+            os.write(0xA1);
+            codeLength += 1;
+        }
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            crnti = new Crnti();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            status = new Status();
+            subCodeLength += status.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        if (crnti != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("crnti: ");
+            crnti.appendAsString(sb, indentLevel + 1);
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (status != null) {
+            sb.append("status: ");
+            status.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("status: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class Crnti implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<CRNTI> seqOf = null;
+
+        public Crnti() {
+            seqOf = new ArrayList<CRNTI>();
+        }
+
+        public Crnti(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<CRNTI> getCRNTI() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<CRNTI>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                CRNTI element = new CRNTI();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<CRNTI> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class Status implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerEnum> seqOf = null;
+
+        public Status() {
+            seqOf = new ArrayList<BerEnum>();
+        }
+
+        public Status(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerEnum> getBerEnum() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerEnum>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerEnum element = new BerEnum();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerEnum> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RXSigMeasReport.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RXSigMeasReport.java
new file mode 100644
index 0000000..9e12d1f
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RXSigMeasReport.java
@@ -0,0 +1,588 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.RXSigReport;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class RXSigMeasReport implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private Crnti crnti = null;
+    private ECGI ecgi = null;
+    private CellMeasReports cellMeasReports = null;
+
+    public RXSigMeasReport() {
+    }
+
+    public RXSigMeasReport(byte[] code) {
+        this.code = code;
+    }
+
+    public Crnti getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(Crnti crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public CellMeasReports getCellMeasReports() {
+        return cellMeasReports;
+    }
+
+    public void setCellMeasReports(CellMeasReports cellMeasReports) {
+        this.cellMeasReports = cellMeasReports;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += cellMeasReports.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            crnti = new Crnti();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            cellMeasReports = new CellMeasReports();
+            subCodeLength += cellMeasReports.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ");
+            crnti.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (cellMeasReports != null) {
+            sb.append("cellMeasReports: ");
+            cellMeasReports.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("cellMeasReports: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class Crnti implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<CRNTI> seqOf = null;
+
+        public Crnti() {
+            seqOf = new ArrayList<CRNTI>();
+        }
+
+        public Crnti(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<CRNTI> getCRNTI() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<CRNTI>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                CRNTI element = new CRNTI();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<CRNTI> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class CellMeasReports implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<SEQUENCEOF> seqOf = null;
+
+        public CellMeasReports() {
+            seqOf = new ArrayList<SEQUENCEOF>();
+        }
+
+        public CellMeasReports(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<SEQUENCEOF> getSEQUENCEOF() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<SEQUENCEOF>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                SEQUENCEOF element = new SEQUENCEOF();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<SEQUENCEOF> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    it.next().appendAsString(sb, indentLevel + 1);
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        it.next().appendAsString(sb, indentLevel + 1);
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+        public static class SEQUENCEOF implements Serializable {
+
+            public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+            private static final long serialVersionUID = 1L;
+            @JsonIgnore
+            public byte[] code = null;
+            private List<RXSigReport> seqOf = null;
+
+            public SEQUENCEOF() {
+                seqOf = new ArrayList<RXSigReport>();
+            }
+
+            public SEQUENCEOF(byte[] code) {
+                this.code = code;
+            }
+
+            @JsonValue
+            public List<RXSigReport> getRXSigReport() {
+                if (seqOf == null) {
+                    seqOf = new ArrayList<RXSigReport>();
+                }
+                return seqOf;
+            }
+
+            public int encode(BerByteArrayOutputStream os) throws IOException {
+                return encode(os, true);
+            }
+
+            public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+                if (code != null) {
+                    for (int i = code.length - 1; i >= 0; i--) {
+                        os.write(code[i]);
+                    }
+                    if (withTag) {
+                        return tag.encode(os) + code.length;
+                    }
+                    return code.length;
+                }
+
+                int codeLength = 0;
+                for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                    codeLength += seqOf.get(i).encode(os, true);
+                }
+
+                codeLength += BerLength.encodeLength(os, codeLength);
+
+                if (withTag) {
+                    codeLength += tag.encode(os);
+                }
+
+                return codeLength;
+            }
+
+            public int decode(InputStream is) throws IOException {
+                return decode(is, true);
+            }
+
+            public int decode(InputStream is, boolean withTag) throws IOException {
+                int codeLength = 0;
+                int subCodeLength = 0;
+                if (withTag) {
+                    codeLength += tag.decodeAndCheck(is);
+                }
+
+                BerLength length = new BerLength();
+                codeLength += length.decode(is);
+                int totalLength = length.val;
+
+                while (subCodeLength < totalLength) {
+                    RXSigReport element = new RXSigReport();
+                    subCodeLength += element.decode(is, true);
+                    seqOf.add(element);
+                }
+                if (subCodeLength != totalLength) {
+                    throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+                }
+                codeLength += subCodeLength;
+
+                return codeLength;
+            }
+
+            public void encodeAndSave(int encodingSizeGuess) throws IOException {
+                BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+                encode(os, false);
+                code = os.getArray();
+            }
+
+            public String toString() {
+                StringBuilder sb = new StringBuilder();
+                appendAsString(sb, 0);
+                return sb.toString();
+            }
+
+            public void appendAsString(StringBuilder sb, int indentLevel) {
+
+                sb.append("{\n");
+                for (int i = 0; i < indentLevel + 1; i++) {
+                    sb.append("\t");
+                }
+                if (seqOf == null) {
+                    sb.append("null");
+                } else {
+                    Iterator<RXSigReport> it = seqOf.iterator();
+                    if (it.hasNext()) {
+                        it.next().appendAsString(sb, indentLevel + 1);
+                        while (it.hasNext()) {
+                            sb.append(",\n");
+                            for (int i = 0; i < indentLevel + 1; i++) {
+                                sb.append("\t");
+                            }
+                            it.next().appendAsString(sb, indentLevel + 1);
+                        }
+                    }
+                }
+
+                sb.append("\n");
+                for (int i = 0; i < indentLevel; i++) {
+                    sb.append("\t");
+                }
+                sb.append("}");
+            }
+
+        }
+
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RadioMeasReportPerCell.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RadioMeasReportPerCell.java
new file mode 100644
index 0000000..60838a0
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RadioMeasReportPerCell.java
@@ -0,0 +1,461 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class RadioMeasReportPerCell implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private ECGI ecgi = null;
+    private PuschIntfPowerHist puschIntfPowerHist = null;
+    private PucchIntfPowerHist pucchIntfPowerHist = null;
+
+    public RadioMeasReportPerCell() {
+    }
+
+    public RadioMeasReportPerCell(byte[] code) {
+        this.code = code;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public PuschIntfPowerHist getPuschIntfPowerHist() {
+        return puschIntfPowerHist;
+    }
+
+    public void setPuschIntfPowerHist(PuschIntfPowerHist puschIntfPowerHist) {
+        this.puschIntfPowerHist = puschIntfPowerHist;
+    }
+
+    public PucchIntfPowerHist getPucchIntfPowerHist() {
+        return pucchIntfPowerHist;
+    }
+
+    public void setPucchIntfPowerHist(PucchIntfPowerHist pucchIntfPowerHist) {
+        this.pucchIntfPowerHist = pucchIntfPowerHist;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += pucchIntfPowerHist.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += puschIntfPowerHist.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            puschIntfPowerHist = new PuschIntfPowerHist();
+            subCodeLength += puschIntfPowerHist.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            pucchIntfPowerHist = new PucchIntfPowerHist();
+            subCodeLength += pucchIntfPowerHist.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (puschIntfPowerHist != null) {
+            sb.append("puschIntfPowerHist: ");
+            puschIntfPowerHist.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("puschIntfPowerHist: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (pucchIntfPowerHist != null) {
+            sb.append("pucchIntfPowerHist: ");
+            pucchIntfPowerHist.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("pucchIntfPowerHist: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class PuschIntfPowerHist implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public PuschIntfPowerHist() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public PuschIntfPowerHist(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+    public static class PucchIntfPowerHist implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerInteger> seqOf = null;
+
+        public PucchIntfPowerHist() {
+            seqOf = new ArrayList<BerInteger>();
+        }
+
+        public PucchIntfPowerHist(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerInteger> getBerInteger() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerInteger>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerInteger element = new BerInteger();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerInteger> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RadioMeasReportPerUE.java
similarity index 73%
copy from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RadioMeasReportPerUE.java
index 6080f69..204060b 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/RadioMeasReportPerUE.java
@@ -1,81 +1,42 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.RadioRepPerServCell;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class ScellDelete implements Serializable {
+public class RadioMeasReportPerUE implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
     @JsonIgnore
     public byte[] code = null;
-    private CRNTI crnti = null;
     private ECGI ecgi = null;
-    private ScellsInd scellsInd = null;
-    public ScellDelete() {
+    private CRNTI crnti = null;
+    private RadioReportServCells radioReportServCells = null;
+
+    public RadioMeasReportPerUE() {
     }
-    public ScellDelete(byte[] code) {
+
+    public RadioMeasReportPerUE(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
-        ScellDelete scellDelete = new ScellDelete();
-        scellDelete.setEcgi(ecgi);
-        scellDelete.setCrnti(crnti);
-        ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
-        scellDelete.setScellsInd(scellsInd);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("3");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(28);
-        XrancPduBody body = new XrancPduBody();
-        body.setScellDelete(scellDelete);
-
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setBody(body);
-        pdu.setHdr(hdr);
-
-        return pdu;
-
-    }
-
-    public CRNTI getCrnti() {
-        return crnti;
-    }
-
-    public void setCrnti(CRNTI crnti) {
-        this.crnti = crnti;
-    }
-
     public ECGI getEcgi() {
         return ecgi;
     }
@@ -84,12 +45,20 @@
         this.ecgi = ecgi;
     }
 
-    public ScellsInd getScellsInd() {
-        return scellsInd;
+    public CRNTI getCrnti() {
+        return crnti;
     }
 
-    public void setScellsInd(ScellsInd scellsInd) {
-        this.scellsInd = scellsInd;
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public RadioReportServCells getRadioReportServCells() {
+        return radioReportServCells;
+    }
+
+    public void setRadioReportServCells(RadioReportServCells radioReportServCells) {
+        this.radioReportServCells = radioReportServCells;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -109,19 +78,19 @@
         }
 
         int codeLength = 0;
-        codeLength += scellsInd.encode(os, false);
+        codeLength += radioReportServCells.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
         os.write(0xA2);
         codeLength += 1;
 
-        codeLength += ecgi.encode(os, false);
-        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-        os.write(0xA1);
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
         codeLength += 1;
 
-        codeLength += crnti.encode(os, false);
-        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
-        os.write(0x80);
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
         codeLength += 1;
 
         codeLength += BerLength.encodeLength(os, codeLength);
@@ -154,15 +123,7 @@
         codeLength += totalLength;
 
         subCodeLength += berTag.decode(is);
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-            crnti = new CRNTI();
-            subCodeLength += crnti.decode(is, false);
-            subCodeLength += berTag.decode(is);
-        } else {
-            throw new IOException("Tag does not match the mandatory sequence element tag.");
-        }
-
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
             ecgi = new ECGI();
             subCodeLength += ecgi.decode(is, false);
             subCodeLength += berTag.decode(is);
@@ -170,9 +131,17 @@
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-            scellsInd = new ScellsInd();
-            subCodeLength += scellsInd.decode(is, false);
+            radioReportServCells = new RadioReportServCells();
+            subCodeLength += radioReportServCells.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -201,26 +170,32 @@
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (crnti != null) {
-            sb.append("crnti: ").append(crnti);
-        }
-
-        sb.append(",\n");
-        for (int i = 0; i < indentLevel + 1; i++) {
-            sb.append("\t");
-        }
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (scellsInd != null) {
-            sb.append("scellsInd: ");
-            scellsInd.appendAsString(sb, indentLevel + 1);
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (radioReportServCells != null) {
+            sb.append("radioReportServCells: ");
+            radioReportServCells.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("radioReportServCells: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -230,25 +205,26 @@
         sb.append("}");
     }
 
-    public static class ScellsInd implements Serializable {
+    public static class RadioReportServCells implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
-        private List<PCIARFCN> seqOf = null;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<RadioRepPerServCell> seqOf = null;
 
-        public ScellsInd() {
-            seqOf = new ArrayList<PCIARFCN>();
+        public RadioReportServCells() {
+            seqOf = new ArrayList<RadioRepPerServCell>();
         }
 
-        public ScellsInd(byte[] code) {
+        public RadioReportServCells(byte[] code) {
             this.code = code;
         }
 
         @JsonValue
-        public List<PCIARFCN> getPCIARFCN() {
+        public List<RadioRepPerServCell> getRadioRepPerServCell() {
             if (seqOf == null) {
-                seqOf = new ArrayList<PCIARFCN>();
+                seqOf = new ArrayList<RadioRepPerServCell>();
             }
             return seqOf;
         }
@@ -299,7 +275,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                PCIARFCN element = new PCIARFCN();
+                RadioRepPerServCell element = new RadioRepPerServCell();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -326,14 +302,14 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<PCIARFCN> it = seqOf.iterator();
+                Iterator<RadioRepPerServCell> it = seqOf.iterator();
                 if (it.hasNext()) {
                     it.next().appendAsString(sb, indentLevel + 1);
                     while (it.hasNext()) {
@@ -350,12 +326,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
-        }
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellAdd.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellAdd.java
similarity index 89%
rename from src/main/java/org.onosproject.xran/codecs/pdu/ScellAdd.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellAdd.java
index 674b79d..5e524e9 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellAdd.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellAdd.java
@@ -1,21 +1,21 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PropScell;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerBoolean;
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.PropScell;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerBoolean;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -35,8 +35,10 @@
     private CRNTI crnti = null;
     private ECGI ecgi = null;
     private ScellsProp scellsProp = null;
+
     public ScellAdd() {
     }
+
     public ScellAdd(byte[] code) {
         this.code = code;
     }
@@ -50,7 +52,7 @@
         propScell.setCaDirection(new BerEnum(new BigInteger("dl")));
         propScell.setDeactTimer(new BerInteger(1000));
         ScellsProp scellsProp = new ScellsProp();
-        scellsProp.addPropScell(propScell);
+        scellsProp.getPropScell().add(propScell);
         scellAdd.setScellsProp(scellsProp);
 
         XrancPduBody body = new XrancPduBody();
@@ -58,11 +60,11 @@
 
         BerUTF8String ver = null;
         try {
-            ver = new BerUTF8String("3");
+            ver = new BerUTF8String("5");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
-        XrancApiID apiID = new XrancApiID(26);
+        XrancApiID apiID = new XrancApiID(24);
         XrancPduHdr hdr = new XrancPduHdr();
         hdr.setVer(ver);
         hdr.setApiId(apiID);
@@ -209,6 +211,8 @@
         }
         if (crnti != null) {
             sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -218,6 +222,8 @@
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -227,6 +233,8 @@
         if (scellsProp != null) {
             sb.append("scellsProp: ");
             scellsProp.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("scellsProp: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -240,7 +248,8 @@
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
+        @JsonIgnore
+        public byte[] code = null;
         private List<PropScell> seqOf = null;
 
         public ScellsProp() {
@@ -332,12 +341,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<PropScell> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -356,12 +365,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPropScell(PropScell propScell) {
-            seqOf.add(propScell);
-        }
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellAddStatus.java
similarity index 60%
copy from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellAddStatus.java
index 6080f69..ea29f54 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellAddStatus.java
@@ -1,28 +1,27 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.PCIARFCN;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class ScellDelete implements Serializable {
+public class ScellAddStatus implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
@@ -31,43 +30,13 @@
     private CRNTI crnti = null;
     private ECGI ecgi = null;
     private ScellsInd scellsInd = null;
-    public ScellDelete() {
+    private Status status = null;
+    public ScellAddStatus() {
     }
-    public ScellDelete(byte[] code) {
+    public ScellAddStatus(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
-        ScellDelete scellDelete = new ScellDelete();
-        scellDelete.setEcgi(ecgi);
-        scellDelete.setCrnti(crnti);
-        ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
-        scellDelete.setScellsInd(scellsInd);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("3");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(28);
-        XrancPduBody body = new XrancPduBody();
-        body.setScellDelete(scellDelete);
-
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setBody(body);
-        pdu.setHdr(hdr);
-
-        return pdu;
-
-    }
-
     public CRNTI getCrnti() {
         return crnti;
     }
@@ -92,6 +61,14 @@
         this.scellsInd = scellsInd;
     }
 
+    public Status getStatus() {
+        return status;
+    }
+
+    public void setStatus(Status status) {
+        this.status = status;
+    }
+
     public int encode(BerByteArrayOutputStream os) throws IOException {
         return encode(os, true);
     }
@@ -109,6 +86,11 @@
         }
 
         int codeLength = 0;
+        codeLength += status.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
         codeLength += scellsInd.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
         os.write(0xA2);
@@ -173,6 +155,14 @@
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
             scellsInd = new ScellsInd();
             subCodeLength += scellsInd.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            status = new Status();
+            subCodeLength += status.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -203,6 +193,8 @@
         }
         if (crnti != null) {
             sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -212,6 +204,8 @@
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -221,6 +215,19 @@
         if (scellsInd != null) {
             sb.append("scellsInd: ");
             scellsInd.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("scellsInd: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (status != null) {
+            sb.append("status: ");
+            status.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("status: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -234,7 +241,8 @@
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
+        @JsonIgnore
+        public byte[] code = null;
         private List<PCIARFCN> seqOf = null;
 
         public ScellsInd() {
@@ -326,12 +334,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<PCIARFCN> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -350,12 +358,135 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
+    }
+
+    public static class Status implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<BerEnum> seqOf = null;
+
+        public Status() {
+            seqOf = new ArrayList<BerEnum>();
         }
+
+        public Status(byte[] code) {
+            this.code = code;
+        }
+
+        @JsonValue
+        public List<BerEnum> getBerEnum() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<BerEnum>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                BerEnum element = new BerEnum();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("{\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
+                sb.append("null");
+            } else {
+                Iterator<BerEnum> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    sb.append(it.next());
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        sb.append(it.next());
+                    }
+                }
+            }
+
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("}");
+        }
+
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellDelete.java
similarity index 90%
rename from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellDelete.java
index 6080f69..a17b221 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/ScellDelete.java
@@ -1,18 +1,18 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.PCIARFCN;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -31,8 +31,10 @@
     private CRNTI crnti = null;
     private ECGI ecgi = null;
     private ScellsInd scellsInd = null;
+
     public ScellDelete() {
     }
+
     public ScellDelete(byte[] code) {
         this.code = code;
     }
@@ -42,17 +44,17 @@
         scellDelete.setEcgi(ecgi);
         scellDelete.setCrnti(crnti);
         ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
+        scellsInd.getPCIARFCN().add(pciarfcn);
         scellDelete.setScellsInd(scellsInd);
 
         BerUTF8String ver = null;
         try {
-            ver = new BerUTF8String("3");
+            ver = new BerUTF8String("5");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
 
-        XrancApiID apiID = new XrancApiID(28);
+        XrancApiID apiID = new XrancApiID(26);
         XrancPduBody body = new XrancPduBody();
         body.setScellDelete(scellDelete);
 
@@ -65,7 +67,6 @@
         pdu.setHdr(hdr);
 
         return pdu;
-
     }
 
     public CRNTI getCrnti() {
@@ -203,6 +204,8 @@
         }
         if (crnti != null) {
             sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -212,6 +215,8 @@
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -221,6 +226,8 @@
         if (scellsInd != null) {
             sb.append("scellsInd: ");
             scellsInd.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("scellsInd: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -234,7 +241,8 @@
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
+        @JsonIgnore
+        public byte[] code = null;
         private List<PCIARFCN> seqOf = null;
 
         public ScellsInd() {
@@ -326,12 +334,12 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
                 Iterator<PCIARFCN> it = seqOf.iterator();
                 if (it.hasNext()) {
@@ -350,12 +358,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
-        }
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SchedMeasReportPerCell.java
similarity index 67%
copy from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SchedMeasReportPerCell.java
index 6080f69..e926702 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SchedMeasReportPerCell.java
@@ -1,81 +1,43 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.PRBUsage;
+import org.onosproject.xran.asn1lib.api.QCI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class ScellDelete implements Serializable {
+public class SchedMeasReportPerCell implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
     @JsonIgnore
     public byte[] code = null;
-    private CRNTI crnti = null;
     private ECGI ecgi = null;
-    private ScellsInd scellsInd = null;
-    public ScellDelete() {
+    private QciVals qciVals = null;
+    private PRBUsage prbUsagePcell = null;
+    private PRBUsage prbUsageScell = null;
+
+    public SchedMeasReportPerCell() {
     }
-    public ScellDelete(byte[] code) {
+
+    public SchedMeasReportPerCell(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
-        ScellDelete scellDelete = new ScellDelete();
-        scellDelete.setEcgi(ecgi);
-        scellDelete.setCrnti(crnti);
-        ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
-        scellDelete.setScellsInd(scellsInd);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("3");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(28);
-        XrancPduBody body = new XrancPduBody();
-        body.setScellDelete(scellDelete);
-
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setBody(body);
-        pdu.setHdr(hdr);
-
-        return pdu;
-
-    }
-
-    public CRNTI getCrnti() {
-        return crnti;
-    }
-
-    public void setCrnti(CRNTI crnti) {
-        this.crnti = crnti;
-    }
-
     public ECGI getEcgi() {
         return ecgi;
     }
@@ -84,12 +46,28 @@
         this.ecgi = ecgi;
     }
 
-    public ScellsInd getScellsInd() {
-        return scellsInd;
+    public QciVals getQciVals() {
+        return qciVals;
     }
 
-    public void setScellsInd(ScellsInd scellsInd) {
-        this.scellsInd = scellsInd;
+    public void setQciVals(QciVals qciVals) {
+        this.qciVals = qciVals;
+    }
+
+    public PRBUsage getPrbUsagePcell() {
+        return prbUsagePcell;
+    }
+
+    public void setPrbUsagePcell(PRBUsage prbUsagePcell) {
+        this.prbUsagePcell = prbUsagePcell;
+    }
+
+    public PRBUsage getPrbUsageScell() {
+        return prbUsageScell;
+    }
+
+    public void setPrbUsageScell(PRBUsage prbUsageScell) {
+        this.prbUsageScell = prbUsageScell;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -109,19 +87,24 @@
         }
 
         int codeLength = 0;
-        codeLength += scellsInd.encode(os, false);
+        codeLength += prbUsageScell.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+        os.write(0xA3);
+        codeLength += 1;
+
+        codeLength += prbUsagePcell.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
         os.write(0xA2);
         codeLength += 1;
 
-        codeLength += ecgi.encode(os, false);
+        codeLength += qciVals.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
         os.write(0xA1);
         codeLength += 1;
 
-        codeLength += crnti.encode(os, false);
-        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
-        os.write(0x80);
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
         codeLength += 1;
 
         codeLength += BerLength.encodeLength(os, codeLength);
@@ -154,15 +137,7 @@
         codeLength += totalLength;
 
         subCodeLength += berTag.decode(is);
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-            crnti = new CRNTI();
-            subCodeLength += crnti.decode(is, false);
-            subCodeLength += berTag.decode(is);
-        } else {
-            throw new IOException("Tag does not match the mandatory sequence element tag.");
-        }
-
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
             ecgi = new ECGI();
             subCodeLength += ecgi.decode(is, false);
             subCodeLength += berTag.decode(is);
@@ -170,9 +145,25 @@
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            qciVals = new QciVals();
+            subCodeLength += qciVals.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-            scellsInd = new ScellsInd();
-            subCodeLength += scellsInd.decode(is, false);
+            prbUsagePcell = new PRBUsage();
+            subCodeLength += prbUsagePcell.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            prbUsageScell = new PRBUsage();
+            subCodeLength += prbUsageScell.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -201,26 +192,44 @@
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (crnti != null) {
-            sb.append("crnti: ").append(crnti);
-        }
-
-        sb.append(",\n");
-        for (int i = 0; i < indentLevel + 1; i++) {
-            sb.append("\t");
-        }
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (scellsInd != null) {
-            sb.append("scellsInd: ");
-            scellsInd.appendAsString(sb, indentLevel + 1);
+        if (qciVals != null) {
+            sb.append("qciVals: ");
+            qciVals.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("qciVals: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (prbUsagePcell != null) {
+            sb.append("prbUsagePcell: ");
+            prbUsagePcell.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("prbUsagePcell: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (prbUsageScell != null) {
+            sb.append("prbUsageScell: ");
+            prbUsageScell.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("prbUsageScell: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -230,25 +239,26 @@
         sb.append("}");
     }
 
-    public static class ScellsInd implements Serializable {
+    public static class QciVals implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
-        private List<PCIARFCN> seqOf = null;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<QCI> seqOf = null;
 
-        public ScellsInd() {
-            seqOf = new ArrayList<PCIARFCN>();
+        public QciVals() {
+            seqOf = new ArrayList<QCI>();
         }
 
-        public ScellsInd(byte[] code) {
+        public QciVals(byte[] code) {
             this.code = code;
         }
 
         @JsonValue
-        public List<PCIARFCN> getPCIARFCN() {
+        public List<QCI> getQCI() {
             if (seqOf == null) {
-                seqOf = new ArrayList<PCIARFCN>();
+                seqOf = new ArrayList<QCI>();
             }
             return seqOf;
         }
@@ -299,7 +309,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                PCIARFCN element = new PCIARFCN();
+                QCI element = new QCI();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -326,22 +336,22 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<PCIARFCN> it = seqOf.iterator();
+                Iterator<QCI> it = seqOf.iterator();
                 if (it.hasNext()) {
-                    it.next().appendAsString(sb, indentLevel + 1);
+                    sb.append(it.next());
                     while (it.hasNext()) {
                         sb.append(",\n");
                         for (int i = 0; i < indentLevel + 1; i++) {
                             sb.append("\t");
                         }
-                        it.next().appendAsString(sb, indentLevel + 1);
+                        sb.append(it.next());
                     }
                 }
             }
@@ -350,12 +360,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
-        }
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SchedMeasReportPerUE.java
similarity index 73%
copy from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SchedMeasReportPerUE.java
index 6080f69..211ea0f 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SchedMeasReportPerUE.java
@@ -1,81 +1,42 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.SchedMeasRepPerServCell;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class ScellDelete implements Serializable {
+public class SchedMeasReportPerUE implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
     @JsonIgnore
     public byte[] code = null;
-    private CRNTI crnti = null;
     private ECGI ecgi = null;
-    private ScellsInd scellsInd = null;
-    public ScellDelete() {
+    private CRNTI crnti = null;
+    private SchedReportServCells schedReportServCells = null;
+
+    public SchedMeasReportPerUE() {
     }
-    public ScellDelete(byte[] code) {
+
+    public SchedMeasReportPerUE(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
-        ScellDelete scellDelete = new ScellDelete();
-        scellDelete.setEcgi(ecgi);
-        scellDelete.setCrnti(crnti);
-        ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
-        scellDelete.setScellsInd(scellsInd);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("3");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(28);
-        XrancPduBody body = new XrancPduBody();
-        body.setScellDelete(scellDelete);
-
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setBody(body);
-        pdu.setHdr(hdr);
-
-        return pdu;
-
-    }
-
-    public CRNTI getCrnti() {
-        return crnti;
-    }
-
-    public void setCrnti(CRNTI crnti) {
-        this.crnti = crnti;
-    }
-
     public ECGI getEcgi() {
         return ecgi;
     }
@@ -84,12 +45,20 @@
         this.ecgi = ecgi;
     }
 
-    public ScellsInd getScellsInd() {
-        return scellsInd;
+    public CRNTI getCrnti() {
+        return crnti;
     }
 
-    public void setScellsInd(ScellsInd scellsInd) {
-        this.scellsInd = scellsInd;
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public SchedReportServCells getSchedReportServCells() {
+        return schedReportServCells;
+    }
+
+    public void setSchedReportServCells(SchedReportServCells schedReportServCells) {
+        this.schedReportServCells = schedReportServCells;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -109,19 +78,19 @@
         }
 
         int codeLength = 0;
-        codeLength += scellsInd.encode(os, false);
+        codeLength += schedReportServCells.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
         os.write(0xA2);
         codeLength += 1;
 
-        codeLength += ecgi.encode(os, false);
-        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-        os.write(0xA1);
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 1
+        os.write(0x81);
         codeLength += 1;
 
-        codeLength += crnti.encode(os, false);
-        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
-        os.write(0x80);
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 0
+        os.write(0xA0);
         codeLength += 1;
 
         codeLength += BerLength.encodeLength(os, codeLength);
@@ -154,15 +123,7 @@
         codeLength += totalLength;
 
         subCodeLength += berTag.decode(is);
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-            crnti = new CRNTI();
-            subCodeLength += crnti.decode(is, false);
-            subCodeLength += berTag.decode(is);
-        } else {
-            throw new IOException("Tag does not match the mandatory sequence element tag.");
-        }
-
-        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
             ecgi = new ECGI();
             subCodeLength += ecgi.decode(is, false);
             subCodeLength += berTag.decode(is);
@@ -170,9 +131,17 @@
             throw new IOException("Tag does not match the mandatory sequence element tag.");
         }
 
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-            scellsInd = new ScellsInd();
-            subCodeLength += scellsInd.decode(is, false);
+            schedReportServCells = new SchedReportServCells();
+            subCodeLength += schedReportServCells.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -201,26 +170,32 @@
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (crnti != null) {
-            sb.append("crnti: ").append(crnti);
-        }
-
-        sb.append(",\n");
-        for (int i = 0; i < indentLevel + 1; i++) {
-            sb.append("\t");
-        }
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (scellsInd != null) {
-            sb.append("scellsInd: ");
-            scellsInd.appendAsString(sb, indentLevel + 1);
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (schedReportServCells != null) {
+            sb.append("schedReportServCells: ");
+            schedReportServCells.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("schedReportServCells: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -230,25 +205,26 @@
         sb.append("}");
     }
 
-    public static class ScellsInd implements Serializable {
+    public static class SchedReportServCells implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
-        private List<PCIARFCN> seqOf = null;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<SchedMeasRepPerServCell> seqOf = null;
 
-        public ScellsInd() {
-            seqOf = new ArrayList<PCIARFCN>();
+        public SchedReportServCells() {
+            seqOf = new ArrayList<SchedMeasRepPerServCell>();
         }
 
-        public ScellsInd(byte[] code) {
+        public SchedReportServCells(byte[] code) {
             this.code = code;
         }
 
         @JsonValue
-        public List<PCIARFCN> getPCIARFCN() {
+        public List<SchedMeasRepPerServCell> getSchedMeasRepPerServCell() {
             if (seqOf == null) {
-                seqOf = new ArrayList<PCIARFCN>();
+                seqOf = new ArrayList<SchedMeasRepPerServCell>();
             }
             return seqOf;
         }
@@ -299,7 +275,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                PCIARFCN element = new PCIARFCN();
+                SchedMeasRepPerServCell element = new SchedMeasRepPerServCell();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -326,14 +302,14 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<PCIARFCN> it = seqOf.iterator();
+                Iterator<SchedMeasRepPerServCell> it = seqOf.iterator();
                 if (it.hasNext()) {
                     it.next().appendAsString(sb, indentLevel + 1);
                     while (it.hasNext()) {
@@ -350,12 +326,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
-        }
     }
 
 }
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBAdd.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBAdd.java
new file mode 100644
index 0000000..df99522
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBAdd.java
@@ -0,0 +1,204 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class SeNBAdd implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI mEcgi = null;
+    private ECGI sEcgi = null;
+
+    public SeNBAdd() {
+    }
+
+    public SeNBAdd(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getMEcgi() {
+        return mEcgi;
+    }
+
+    public void setMEcgi(ECGI mEcgi) {
+        this.mEcgi = mEcgi;
+    }
+
+    public ECGI getSEcgi() {
+        return sEcgi;
+    }
+
+    public void setSEcgi(ECGI sEcgi) {
+        this.sEcgi = sEcgi;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += sEcgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += mEcgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            mEcgi = new ECGI();
+            subCodeLength += mEcgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            sEcgi = new ECGI();
+            subCodeLength += sEcgi.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (mEcgi != null) {
+            sb.append("mEcgi: ");
+            mEcgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("mEcgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (sEcgi != null) {
+            sb.append("sEcgi: ");
+            sEcgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("sEcgi: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBAddStatus.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBAddStatus.java
new file mode 100644
index 0000000..e68799b
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBAddStatus.java
@@ -0,0 +1,204 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class SeNBAddStatus implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private BerEnum status = null;
+
+    public SeNBAddStatus() {
+    }
+
+    public SeNBAddStatus(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public BerEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(BerEnum status) {
+        this.status = status;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += status.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            status = new BerEnum();
+            subCodeLength += status.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (status != null) {
+            sb.append("status: ").append(status);
+        } else {
+            sb.append("status: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBDelete.java
new file mode 100644
index 0000000..35fc047
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/SeNBDelete.java
@@ -0,0 +1,204 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class SeNBDelete implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI mEcgi = null;
+    private ECGI sEcgi = null;
+
+    public SeNBDelete() {
+    }
+
+    public SeNBDelete(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getMEcgi() {
+        return mEcgi;
+    }
+
+    public void setMEcgi(ECGI mEcgi) {
+        this.mEcgi = mEcgi;
+    }
+
+    public ECGI getSEcgi() {
+        return sEcgi;
+    }
+
+    public void setSEcgi(ECGI sEcgi) {
+        this.sEcgi = sEcgi;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += sEcgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
+
+        codeLength += mEcgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            mEcgi = new ECGI();
+            subCodeLength += mEcgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            sEcgi = new ECGI();
+            subCodeLength += sEcgi.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (mEcgi != null) {
+            sb.append("mEcgi: ");
+            mEcgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("mEcgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (sEcgi != null) {
+            sb.append("sEcgi: ");
+            sEcgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("sEcgi: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/TrafficSplitConfig.java
similarity index 74%
copy from src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
copy to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/TrafficSplitConfig.java
index 6080f69..ebdc917 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/TrafficSplitConfig.java
@@ -1,28 +1,26 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.TrafficSplitPercentage;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class ScellDelete implements Serializable {
+public class TrafficSplitConfig implements Serializable {
 
     public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
     private static final long serialVersionUID = 1L;
@@ -30,44 +28,15 @@
     public byte[] code = null;
     private CRNTI crnti = null;
     private ECGI ecgi = null;
-    private ScellsInd scellsInd = null;
-    public ScellDelete() {
+    private TrafficSplitPercent trafficSplitPercent = null;
+
+    public TrafficSplitConfig() {
     }
-    public ScellDelete(byte[] code) {
+
+    public TrafficSplitConfig(byte[] code) {
         this.code = code;
     }
 
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
-        ScellDelete scellDelete = new ScellDelete();
-        scellDelete.setEcgi(ecgi);
-        scellDelete.setCrnti(crnti);
-        ScellsInd scellsInd = new ScellsInd();
-        scellsInd.addPCIARFCN(pciarfcn);
-        scellDelete.setScellsInd(scellsInd);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("3");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(28);
-        XrancPduBody body = new XrancPduBody();
-        body.setScellDelete(scellDelete);
-
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setBody(body);
-        pdu.setHdr(hdr);
-
-        return pdu;
-
-    }
-
     public CRNTI getCrnti() {
         return crnti;
     }
@@ -84,12 +53,12 @@
         this.ecgi = ecgi;
     }
 
-    public ScellsInd getScellsInd() {
-        return scellsInd;
+    public TrafficSplitPercent getTrafficSplitPercent() {
+        return trafficSplitPercent;
     }
 
-    public void setScellsInd(ScellsInd scellsInd) {
-        this.scellsInd = scellsInd;
+    public void setTrafficSplitPercent(TrafficSplitPercent trafficSplitPercent) {
+        this.trafficSplitPercent = trafficSplitPercent;
     }
 
     public int encode(BerByteArrayOutputStream os) throws IOException {
@@ -109,7 +78,7 @@
         }
 
         int codeLength = 0;
-        codeLength += scellsInd.encode(os, false);
+        codeLength += trafficSplitPercent.encode(os, false);
         // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
         os.write(0xA2);
         codeLength += 1;
@@ -171,8 +140,8 @@
         }
 
         if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-            scellsInd = new ScellsInd();
-            subCodeLength += scellsInd.decode(is, false);
+            trafficSplitPercent = new TrafficSplitPercent();
+            subCodeLength += trafficSplitPercent.decode(is, false);
             if (subCodeLength == totalLength) {
                 return codeLength;
             }
@@ -203,6 +172,8 @@
         }
         if (crnti != null) {
             sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
         }
 
         sb.append(",\n");
@@ -212,15 +183,19 @@
         if (ecgi != null) {
             sb.append("ecgi: ");
             ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
         }
 
         sb.append(",\n");
         for (int i = 0; i < indentLevel + 1; i++) {
             sb.append("\t");
         }
-        if (scellsInd != null) {
-            sb.append("scellsInd: ");
-            scellsInd.appendAsString(sb, indentLevel + 1);
+        if (trafficSplitPercent != null) {
+            sb.append("trafficSplitPercent: ");
+            trafficSplitPercent.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("trafficSplitPercent: <empty-required-field>");
         }
 
         sb.append("\n");
@@ -230,25 +205,26 @@
         sb.append("}");
     }
 
-    public static class ScellsInd implements Serializable {
+    public static class TrafficSplitPercent implements Serializable {
 
         public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
         private static final long serialVersionUID = 1L;
-        @JsonIgnore public byte[] code = null;
-        private List<PCIARFCN> seqOf = null;
+        @JsonIgnore
+        public byte[] code = null;
+        private List<TrafficSplitPercentage> seqOf = null;
 
-        public ScellsInd() {
-            seqOf = new ArrayList<PCIARFCN>();
+        public TrafficSplitPercent() {
+            seqOf = new ArrayList<TrafficSplitPercentage>();
         }
 
-        public ScellsInd(byte[] code) {
+        public TrafficSplitPercent(byte[] code) {
             this.code = code;
         }
 
         @JsonValue
-        public List<PCIARFCN> getPCIARFCN() {
+        public List<TrafficSplitPercentage> getTrafficSplitPercentage() {
             if (seqOf == null) {
-                seqOf = new ArrayList<PCIARFCN>();
+                seqOf = new ArrayList<TrafficSplitPercentage>();
             }
             return seqOf;
         }
@@ -299,7 +275,7 @@
             int totalLength = length.val;
 
             while (subCodeLength < totalLength) {
-                PCIARFCN element = new PCIARFCN();
+                TrafficSplitPercentage element = new TrafficSplitPercentage();
                 subCodeLength += element.decode(is, true);
                 seqOf.add(element);
             }
@@ -326,14 +302,14 @@
 
         public void appendAsString(StringBuilder sb, int indentLevel) {
 
-            sb.append("[\n");
+            sb.append("{\n");
             for (int i = 0; i < indentLevel + 1; i++) {
                 sb.append("\t");
             }
             if (seqOf == null) {
-//				sb.append("null");
+                sb.append("null");
             } else {
-                Iterator<PCIARFCN> it = seqOf.iterator();
+                Iterator<TrafficSplitPercentage> it = seqOf.iterator();
                 if (it.hasNext()) {
                     it.next().appendAsString(sb, indentLevel + 1);
                     while (it.hasNext()) {
@@ -350,12 +326,9 @@
             for (int i = 0; i < indentLevel; i++) {
                 sb.append("\t");
             }
-            sb.append("]");
+            sb.append("}");
         }
 
-        public void addPCIARFCN(PCIARFCN pciarfcn) {
-            seqOf.add(pciarfcn);
-        }
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionRequest.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionRequest.java
similarity index 87%
rename from src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionRequest.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionRequest.java
index fd5148e..b807e50 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionRequest.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionRequest.java
@@ -1,16 +1,16 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.api.AdmEstCause;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
+import org.onosproject.xran.asn1lib.api.AdmEstCause;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -173,6 +173,9 @@
 		if (crnti != null) {
 			sb.append("crnti: ").append(crnti);
 		}
+		else {
+			sb.append("crnti: <empty-required-field>");
+		}
 		
 		sb.append(",\n");
 		for (int i = 0; i < indentLevel + 1; i++) {
@@ -182,6 +185,9 @@
 			sb.append("ecgi: ");
 			ecgi.appendAsString(sb, indentLevel + 1);
 		}
+		else {
+			sb.append("ecgi: <empty-required-field>");
+		}
 		
 		sb.append(",\n");
 		for (int i = 0; i < indentLevel + 1; i++) {
@@ -190,6 +196,9 @@
 		if (admEstCause != null) {
 			sb.append("admEstCause: ").append(admEstCause);
 		}
+		else {
+			sb.append("admEstCause: <empty-required-field>");
+		}
 		
 		sb.append("\n");
 		for (int i = 0; i < indentLevel; i++) {
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionResponse.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionResponse.java
new file mode 100644
index 0000000..e06c0fd
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionResponse.java
@@ -0,0 +1,234 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.AdmEstResponse;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+
+public class UEAdmissionResponse implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private AdmEstResponse admEstResponse = null;
+
+    public UEAdmissionResponse() {
+    }
+
+    public UEAdmissionResponse(byte[] code) {
+        this.code = code;
+    }
+
+    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, boolean b) {
+        AdmEstResponse response = new AdmEstResponse(b ? 0 : 1);
+
+        UEAdmissionResponse ueAdmissionResponse = new UEAdmissionResponse();
+        ueAdmissionResponse.setCrnti(crnti);
+        ueAdmissionResponse.setEcgi(ecgi);
+        ueAdmissionResponse.setAdmEstResponse(response);
+
+        XrancPduBody body = new XrancPduBody();
+        body.setUEAdmissionResponse(ueAdmissionResponse);
+
+        BerUTF8String ver = null;
+        try {
+            ver = new BerUTF8String("5");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        XrancApiID apiID = new XrancApiID(3);
+        XrancPduHdr hdr = new XrancPduHdr();
+        hdr.setVer(ver);
+        hdr.setApiId(apiID);
+
+        XrancPdu pdu = new XrancPdu();
+        pdu.setHdr(hdr);
+        pdu.setBody(body);
+        return pdu;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public AdmEstResponse getAdmEstResponse() {
+        return admEstResponse;
+    }
+
+    public void setAdmEstResponse(AdmEstResponse admEstResponse) {
+        this.admEstResponse = admEstResponse;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += admEstResponse.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            admEstResponse = new AdmEstResponse();
+            subCodeLength += admEstResponse.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (admEstResponse != null) {
+            sb.append("admEstResponse: ").append(admEstResponse);
+        } else {
+            sb.append("admEstResponse: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionStatus.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionStatus.java
new file mode 100644
index 0000000..137bf60
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEAdmissionStatus.java
@@ -0,0 +1,204 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.AdmEstStatus;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class UEAdmissionStatus implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private AdmEstStatus admEstStatus = null;
+
+    public UEAdmissionStatus() {
+    }
+
+    public UEAdmissionStatus(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public AdmEstStatus getAdmEstStatus() {
+        return admEstStatus;
+    }
+
+    public void setAdmEstStatus(AdmEstStatus admEstStatus) {
+        this.admEstStatus = admEstStatus;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += admEstStatus.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            admEstStatus = new AdmEstStatus();
+            subCodeLength += admEstStatus.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (admEstStatus != null) {
+            sb.append("admEstStatus: ").append(admEstStatus);
+        } else {
+            sb.append("admEstStatus: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UECapabilityEnquiry.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UECapabilityEnquiry.java
new file mode 100644
index 0000000..ceb3b79
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UECapabilityEnquiry.java
@@ -0,0 +1,199 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+
+public class UECapabilityEnquiry implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+
+    public UECapabilityEnquiry() {
+    }
+
+    public UECapabilityEnquiry(byte[] code) {
+        this.code = code;
+    }
+
+    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti) {
+        UECapabilityEnquiry capabilityEnquiry = new UECapabilityEnquiry();
+        capabilityEnquiry.setCrnti(crnti);
+        capabilityEnquiry.setEcgi(ecgi);
+
+        XrancPduBody body = new XrancPduBody();
+        body.setUECapabilityEnquiry(capabilityEnquiry);
+
+        BerUTF8String ver = null;
+        try {
+            ver = new BerUTF8String("5");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        XrancApiID apiID = new XrancApiID(22);
+        XrancPduHdr hdr = new XrancPduHdr();
+        hdr.setVer(ver);
+        hdr.setApiId(apiID);
+
+        XrancPdu pdu = new XrancPdu();
+        pdu.setHdr(hdr);
+        pdu.setBody(body);
+
+        return pdu;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UECapabilityInfo.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UECapabilityInfo.java
new file mode 100644
index 0000000..b842ec4
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UECapabilityInfo.java
@@ -0,0 +1,243 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CACap;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.DCCap;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class UECapabilityInfo implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private CACap caCap = null;
+    private DCCap dcCap = null;
+
+    public UECapabilityInfo() {
+    }
+
+    public UECapabilityInfo(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public CACap getCaCap() {
+        return caCap;
+    }
+
+    public void setCaCap(CACap caCap) {
+        this.caCap = caCap;
+    }
+
+    public DCCap getDcCap() {
+        return dcCap;
+    }
+
+    public void setDcCap(DCCap dcCap) {
+        this.dcCap = dcCap;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        if (dcCap != null) {
+            codeLength += dcCap.encode(os, false);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 3
+            os.write(0xA3);
+            codeLength += 1;
+        }
+
+        if (caCap != null) {
+            codeLength += caCap.encode(os, false);
+            // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+            os.write(0xA2);
+            codeLength += 1;
+        }
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            caCap = new CACap();
+            subCodeLength += caCap.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
+            dcCap = new DCCap();
+            subCodeLength += dcCap.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        if (caCap != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("caCap: ");
+            caCap.appendAsString(sb, indentLevel + 1);
+        }
+
+        if (dcCap != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("dcCap: ");
+            dcCap.appendAsString(sb, indentLevel + 1);
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEContextUpdate.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEContextUpdate.java
new file mode 100644
index 0000000..310cc7d
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEContextUpdate.java
@@ -0,0 +1,273 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.ENBUES1APID;
+import org.onosproject.xran.asn1lib.api.MMEUES1APID;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class UEContextUpdate implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private MMEUES1APID mMEUES1APID = null;
+    private ENBUES1APID eNBUES1APID = null;
+    private BerUTF8String imsi = null;
+
+    public UEContextUpdate() {
+    }
+
+    public UEContextUpdate(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public MMEUES1APID getMMEUES1APID() {
+        return mMEUES1APID;
+    }
+
+    public void setMMEUES1APID(MMEUES1APID mMEUES1APID) {
+        this.mMEUES1APID = mMEUES1APID;
+    }
+
+    public ENBUES1APID getENBUES1APID() {
+        return eNBUES1APID;
+    }
+
+    public void setENBUES1APID(ENBUES1APID eNBUES1APID) {
+        this.eNBUES1APID = eNBUES1APID;
+    }
+
+    public BerUTF8String getImsi() {
+        return imsi;
+    }
+
+    public void setImsi(BerUTF8String imsi) {
+        this.imsi = imsi;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        if (imsi != null) {
+            codeLength += imsi.encode(os, false);
+            // write tag: CONTEXT_CLASS, PRIMITIVE, 4
+            os.write(0x84);
+            codeLength += 1;
+        }
+
+        codeLength += eNBUES1APID.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += mMEUES1APID.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            mMEUES1APID = new MMEUES1APID();
+            subCodeLength += mMEUES1APID.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            eNBUES1APID = new ENBUES1APID();
+            subCodeLength += eNBUES1APID.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
+            imsi = new BerUTF8String();
+            subCodeLength += imsi.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (mMEUES1APID != null) {
+            sb.append("mMEUES1APID: ").append(mMEUES1APID);
+        } else {
+            sb.append("mMEUES1APID: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (eNBUES1APID != null) {
+            sb.append("eNBUES1APID: ").append(eNBUES1APID);
+        } else {
+            sb.append("eNBUES1APID: <empty-required-field>");
+        }
+
+        if (imsi != null) {
+            sb.append(",\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            sb.append("imsi: ").append(imsi);
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEReconfigInd.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEReconfigInd.java
new file mode 100644
index 0000000..3d7fe2e
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEReconfigInd.java
@@ -0,0 +1,236 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.ReconfIndReason;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class UEReconfigInd implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crntiOld = null;
+    private ECGI ecgi = null;
+    private CRNTI crntiNew = null;
+    private ReconfIndReason reconfigCause = null;
+
+    public UEReconfigInd() {
+    }
+
+    public UEReconfigInd(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrntiOld() {
+        return crntiOld;
+    }
+
+    public void setCrntiOld(CRNTI crntiOld) {
+        this.crntiOld = crntiOld;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public CRNTI getCrntiNew() {
+        return crntiNew;
+    }
+
+    public void setCrntiNew(CRNTI crntiNew) {
+        this.crntiNew = crntiNew;
+    }
+
+    public ReconfIndReason getReconfigCause() {
+        return reconfigCause;
+    }
+
+    public void setReconfigCause(ReconfIndReason reconfigCause) {
+        this.reconfigCause = reconfigCause;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += reconfigCause.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 3
+        os.write(0x83);
+        codeLength += 1;
+
+        codeLength += crntiNew.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crntiOld.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crntiOld = new CRNTI();
+            subCodeLength += crntiOld.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            crntiNew = new CRNTI();
+            subCodeLength += crntiNew.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
+            reconfigCause = new ReconfIndReason();
+            subCodeLength += reconfigCause.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crntiOld != null) {
+            sb.append("crntiOld: ").append(crntiOld);
+        } else {
+            sb.append("crntiOld: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crntiNew != null) {
+            sb.append("crntiNew: ").append(crntiNew);
+        } else {
+            sb.append("crntiNew: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (reconfigCause != null) {
+            sb.append("reconfigCause: ").append(reconfigCause);
+        } else {
+            sb.append("reconfigCause: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEReleaseInd.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEReleaseInd.java
new file mode 100644
index 0000000..dd4f717
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/UEReleaseInd.java
@@ -0,0 +1,204 @@
+/**
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
+ */
+
+package org.onosproject.xran.asn1lib.pdu;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.RelCause;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+
+public class UEReleaseInd implements Serializable {
+
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    @JsonIgnore
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private RelCause releaseCause = null;
+
+    public UEReleaseInd() {
+    }
+
+    public UEReleaseInd(byte[] code) {
+        this.code = code;
+    }
+
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public RelCause getReleaseCause() {
+        return releaseCause;
+    }
+
+    public void setReleaseCause(RelCause releaseCause) {
+        this.releaseCause = releaseCause;
+    }
+
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
+
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
+
+        int codeLength = 0;
+        codeLength += releaseCause.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 2
+        os.write(0x82);
+        codeLength += 1;
+
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
+
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
+
+        codeLength += BerLength.encodeLength(os, codeLength);
+
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
+
+        return codeLength;
+
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
+            releaseCause = new RelCause();
+            subCodeLength += releaseCause.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("crnti: ").append(crnti);
+        } else {
+            sb.append("crnti: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("ecgi: ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        } else {
+            sb.append("ecgi: <empty-required-field>");
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (releaseCause != null) {
+            sb.append("releaseCause: ").append(releaseCause);
+        } else {
+            sb.append("releaseCause: <empty-required-field>");
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+}
+
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/XrancApiID.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancApiID.java
similarity index 68%
rename from src/main/java/org.onosproject.xran/codecs/pdu/XrancApiID.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancApiID.java
index fa902f8..c258f10 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/XrancApiID.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancApiID.java
@@ -1,10 +1,11 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
-import org.onosproject.xran.codecs.ber.types.BerEnum;
+
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
 
 import java.math.BigInteger;
 
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/XrancPdu.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPdu.java
similarity index 89%
rename from src/main/java/org.onosproject.xran/codecs/pdu/XrancPdu.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPdu.java
index d983713..2253dd1 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/XrancPdu.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPdu.java
@@ -1,13 +1,13 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
+
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -19,7 +19,6 @@
 
 	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
 
-	@JsonIgnore
 	public byte[] code = null;
 	private XrancPduHdr hdr = null;
 	private XrancPduBody body = null;
@@ -153,6 +152,9 @@
 			sb.append("hdr: ");
 			hdr.appendAsString(sb, indentLevel + 1);
 		}
+		else {
+			sb.append("hdr: <empty-required-field>");
+		}
 		
 		sb.append(",\n");
 		for (int i = 0; i < indentLevel + 1; i++) {
@@ -162,6 +164,9 @@
 			sb.append("body: ");
 			body.appendAsString(sb, indentLevel + 1);
 		}
+		else {
+			sb.append("body: <empty-required-field>");
+		}
 		
 		sb.append("\n");
 		for (int i = 0; i < indentLevel; i++) {
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/XrancPduBody.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPduBody.java
similarity index 95%
rename from src/main/java/org.onosproject.xran/codecs/pdu/XrancPduBody.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPduBody.java
index 29bef78..047827e 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/XrancPduBody.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPduBody.java
@@ -1,12 +1,12 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerTag;
+
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerTag;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -16,7 +16,6 @@
 
 	private static final long serialVersionUID = 1L;
 
-	@JsonIgnore
 	public byte[] code = null;
 	private CellConfigRequest cellConfigRequest = null;
 	private CellConfigReport cellConfigReport = null;
@@ -33,7 +32,6 @@
 	private HORequest hORequest = null;
 	private HOFailure hOFailure = null;
 	private HOComplete hOComplete = null;
-	private RXSigMeasConfig rXSigMeasConfig = null;
 	private RXSigMeasReport rXSigMeasReport = null;
 	private L2MeasConfig l2MeasConfig = null;
 	private RadioMeasReportPerUE radioMeasReportPerUE = null;
@@ -41,9 +39,8 @@
 	private SchedMeasReportPerUE schedMeasReportPerUE = null;
 	private SchedMeasReportPerCell schedMeasReportPerCell = null;
 	private PDCPMeasReportPerUe pDCPMeasReportPerUe = null;
-	private XICICConfig xICICConfig = null;
-	private UECapabilityInfo uECapabilityInfo = null;
 	private UECapabilityEnquiry uECapabilityEnquiry = null;
+	private UECapabilityInfo uECapabilityInfo = null;
 	private ScellAdd scellAdd = null;
 	private ScellAddStatus scellAddStatus = null;
 	private ScellDelete scellDelete = null;
@@ -53,7 +50,9 @@
 	private SeNBAddStatus seNBAddStatus = null;
 	private SeNBDelete seNBDelete = null;
 	private TrafficSplitConfig trafficSplitConfig = null;
-
+	private HOCause hOCause = null;
+	private RRCMeasConfig rRCMeasConfig = null;
+	
 	public XrancPduBody() {
 	}
 
@@ -181,14 +180,6 @@
 		return hOComplete;
 	}
 
-	public void setRXSigMeasConfig(RXSigMeasConfig rXSigMeasConfig) {
-		this.rXSigMeasConfig = rXSigMeasConfig;
-	}
-
-	public RXSigMeasConfig getRXSigMeasConfig() {
-		return rXSigMeasConfig;
-	}
-
 	public void setRXSigMeasReport(RXSigMeasReport rXSigMeasReport) {
 		this.rXSigMeasReport = rXSigMeasReport;
 	}
@@ -245,12 +236,12 @@
 		return pDCPMeasReportPerUe;
 	}
 
-	public void setXICICConfig(XICICConfig xICICConfig) {
-		this.xICICConfig = xICICConfig;
+	public void setUECapabilityEnquiry(UECapabilityEnquiry uECapabilityEnquiry) {
+		this.uECapabilityEnquiry = uECapabilityEnquiry;
 	}
 
-	public XICICConfig getXICICConfig() {
-		return xICICConfig;
+	public UECapabilityEnquiry getUECapabilityEnquiry() {
+		return uECapabilityEnquiry;
 	}
 
 	public void setUECapabilityInfo(UECapabilityInfo uECapabilityInfo) {
@@ -261,14 +252,6 @@
 		return uECapabilityInfo;
 	}
 
-	public void setUECapabilityEnquiry(UECapabilityEnquiry uECapabilityEnquiry) {
-		this.uECapabilityEnquiry = uECapabilityEnquiry;
-	}
-
-	public UECapabilityEnquiry getUECapabilityEnquiry() {
-		return uECapabilityEnquiry;
-	}
-
 	public void setScellAdd(ScellAdd scellAdd) {
 		this.scellAdd = scellAdd;
 	}
@@ -341,6 +324,22 @@
 		return trafficSplitConfig;
 	}
 
+	public void setHOCause(HOCause hOCause) {
+		this.hOCause = hOCause;
+	}
+
+	public HOCause getHOCause() {
+		return hOCause;
+	}
+
+	public void setRRCMeasConfig(RRCMeasConfig rRCMeasConfig) {
+		this.rRCMeasConfig = rRCMeasConfig;
+	}
+
+	public RRCMeasConfig getRRCMeasConfig() {
+		return rRCMeasConfig;
+	}
+
 	public int encode(BerByteArrayOutputStream os) throws IOException {
 
 		if (code != null) {
@@ -351,170 +350,170 @@
 		}
 
 		int codeLength = 0;
-		if (trafficSplitConfig != null) {
-			codeLength += trafficSplitConfig.encode(os, false);
+		if (rRCMeasConfig != null) {
+			codeLength += rRCMeasConfig.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 34
 			os.write(0x22);
 			os.write(0xBF);
 			codeLength += 2;
 			return codeLength;
 		}
-
-		if (seNBDelete != null) {
-			codeLength += seNBDelete.encode(os, false);
+		
+		if (hOCause != null) {
+			codeLength += hOCause.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 33
 			os.write(0x21);
 			os.write(0xBF);
 			codeLength += 2;
 			return codeLength;
 		}
-
-		if (seNBAddStatus != null) {
-			codeLength += seNBAddStatus.encode(os, false);
+		
+		if (trafficSplitConfig != null) {
+			codeLength += trafficSplitConfig.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 32
 			os.write(0x20);
 			os.write(0xBF);
 			codeLength += 2;
 			return codeLength;
 		}
-
-		if (seNBAdd != null) {
-			codeLength += seNBAdd.encode(os, false);
+		
+		if (seNBDelete != null) {
+			codeLength += seNBDelete.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 31
 			os.write(0x1F);
 			os.write(0xBF);
 			codeLength += 2;
 			return codeLength;
 		}
-
-		if (rRMConfigStatus != null) {
-			codeLength += rRMConfigStatus.encode(os, false);
+		
+		if (seNBAddStatus != null) {
+			codeLength += seNBAddStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 30
 			os.write(0xBE);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (rRMConfig != null) {
-			codeLength += rRMConfig.encode(os, false);
+		
+		if (seNBAdd != null) {
+			codeLength += seNBAdd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 29
 			os.write(0xBD);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (scellDelete != null) {
-			codeLength += scellDelete.encode(os, false);
+		
+		if (rRMConfigStatus != null) {
+			codeLength += rRMConfigStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 28
 			os.write(0xBC);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (scellAddStatus != null) {
-			codeLength += scellAddStatus.encode(os, false);
+		
+		if (rRMConfig != null) {
+			codeLength += rRMConfig.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 27
 			os.write(0xBB);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (scellAdd != null) {
-			codeLength += scellAdd.encode(os, false);
+		
+		if (scellDelete != null) {
+			codeLength += scellDelete.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 26
 			os.write(0xBA);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (uECapabilityEnquiry != null) {
-			codeLength += uECapabilityEnquiry.encode(os, false);
+		
+		if (scellAddStatus != null) {
+			codeLength += scellAddStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 25
 			os.write(0xB9);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (uECapabilityInfo != null) {
-			codeLength += uECapabilityInfo.encode(os, false);
+		
+		if (scellAdd != null) {
+			codeLength += scellAdd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 24
 			os.write(0xB8);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (xICICConfig != null) {
-			codeLength += xICICConfig.encode(os, false);
+		
+		if (uECapabilityInfo != null) {
+			codeLength += uECapabilityInfo.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 23
 			os.write(0xB7);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (pDCPMeasReportPerUe != null) {
-			codeLength += pDCPMeasReportPerUe.encode(os, false);
+		
+		if (uECapabilityEnquiry != null) {
+			codeLength += uECapabilityEnquiry.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 22
 			os.write(0xB6);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (schedMeasReportPerCell != null) {
-			codeLength += schedMeasReportPerCell.encode(os, false);
+		
+		if (pDCPMeasReportPerUe != null) {
+			codeLength += pDCPMeasReportPerUe.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 21
 			os.write(0xB5);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (schedMeasReportPerUE != null) {
-			codeLength += schedMeasReportPerUE.encode(os, false);
+		
+		if (schedMeasReportPerCell != null) {
+			codeLength += schedMeasReportPerCell.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 20
 			os.write(0xB4);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (radioMeasReportPerCell != null) {
-			codeLength += radioMeasReportPerCell.encode(os, false);
+		
+		if (schedMeasReportPerUE != null) {
+			codeLength += schedMeasReportPerUE.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 19
 			os.write(0xB3);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (radioMeasReportPerUE != null) {
-			codeLength += radioMeasReportPerUE.encode(os, false);
+		
+		if (radioMeasReportPerCell != null) {
+			codeLength += radioMeasReportPerCell.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 18
 			os.write(0xB2);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (l2MeasConfig != null) {
-			codeLength += l2MeasConfig.encode(os, false);
+		
+		if (radioMeasReportPerUE != null) {
+			codeLength += radioMeasReportPerUE.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 17
 			os.write(0xB1);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (rXSigMeasReport != null) {
-			codeLength += rXSigMeasReport.encode(os, false);
+		
+		if (l2MeasConfig != null) {
+			codeLength += l2MeasConfig.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 16
 			os.write(0xB0);
 			codeLength += 1;
 			return codeLength;
 		}
-
-		if (rXSigMeasConfig != null) {
-			codeLength += rXSigMeasConfig.encode(os, false);
+		
+		if (rXSigMeasReport != null) {
+			codeLength += rXSigMeasReport.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 15
 			os.write(0xAF);
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (hOComplete != null) {
 			codeLength += hOComplete.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 14
@@ -522,7 +521,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (hOFailure != null) {
 			codeLength += hOFailure.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 13
@@ -530,7 +529,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (hORequest != null) {
 			codeLength += hORequest.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 12
@@ -538,7 +537,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (bearerReleaseInd != null) {
 			codeLength += bearerReleaseInd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 11
@@ -546,7 +545,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (bearerAdmissionStatus != null) {
 			codeLength += bearerAdmissionStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 10
@@ -554,7 +553,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (bearerAdmissionResponse != null) {
 			codeLength += bearerAdmissionResponse.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 9
@@ -562,7 +561,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (bearerAdmissionRequest != null) {
 			codeLength += bearerAdmissionRequest.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 8
@@ -570,7 +569,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (uEReleaseInd != null) {
 			codeLength += uEReleaseInd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 7
@@ -578,7 +577,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (uEReconfigInd != null) {
 			codeLength += uEReconfigInd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 6
@@ -586,7 +585,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (uEContextUpdate != null) {
 			codeLength += uEContextUpdate.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 5
@@ -594,7 +593,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (uEAdmissionStatus != null) {
 			codeLength += uEAdmissionStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 4
@@ -602,7 +601,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (uEAdmissionResponse != null) {
 			codeLength += uEAdmissionResponse.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
@@ -610,7 +609,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (uEAdmissionRequest != null) {
 			codeLength += uEAdmissionRequest.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
@@ -618,7 +617,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (cellConfigReport != null) {
 			codeLength += cellConfigReport.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
@@ -626,7 +625,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		if (cellConfigRequest != null) {
 			codeLength += cellConfigRequest.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
@@ -634,7 +633,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-
+		
 		throw new IOException("Error encoding CHOICE: No element of CHOICE was selected.");
 	}
 
@@ -743,125 +742,125 @@
 		}
 
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 15)) {
-			rXSigMeasConfig = new RXSigMeasConfig();
-			codeLength += rXSigMeasConfig.decode(is, false);
-			return codeLength;
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 16)) {
 			rXSigMeasReport = new RXSigMeasReport();
 			codeLength += rXSigMeasReport.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 17)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 16)) {
 			l2MeasConfig = new L2MeasConfig();
 			codeLength += l2MeasConfig.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 18)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 17)) {
 			radioMeasReportPerUE = new RadioMeasReportPerUE();
 			codeLength += radioMeasReportPerUE.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 19)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 18)) {
 			radioMeasReportPerCell = new RadioMeasReportPerCell();
 			codeLength += radioMeasReportPerCell.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 20)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 19)) {
 			schedMeasReportPerUE = new SchedMeasReportPerUE();
 			codeLength += schedMeasReportPerUE.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 21)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 20)) {
 			schedMeasReportPerCell = new SchedMeasReportPerCell();
 			codeLength += schedMeasReportPerCell.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 22)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 21)) {
 			pDCPMeasReportPerUe = new PDCPMeasReportPerUe();
 			codeLength += pDCPMeasReportPerUe.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 23)) {
-			xICICConfig = new XICICConfig();
-			codeLength += xICICConfig.decode(is, false);
-			return codeLength;
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 24)) {
-			uECapabilityInfo = new UECapabilityInfo();
-			codeLength += uECapabilityInfo.decode(is, false);
-			return codeLength;
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 25)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 22)) {
 			uECapabilityEnquiry = new UECapabilityEnquiry();
 			codeLength += uECapabilityEnquiry.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 26)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 23)) {
+			uECapabilityInfo = new UECapabilityInfo();
+			codeLength += uECapabilityInfo.decode(is, false);
+			return codeLength;
+		}
+
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 24)) {
 			scellAdd = new ScellAdd();
 			codeLength += scellAdd.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 27)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 25)) {
 			scellAddStatus = new ScellAddStatus();
 			codeLength += scellAddStatus.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 28)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 26)) {
 			scellDelete = new ScellDelete();
 			codeLength += scellDelete.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 29)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 27)) {
 			rRMConfig = new RRMConfig();
 			codeLength += rRMConfig.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 30)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 28)) {
 			rRMConfigStatus = new RRMConfigStatus();
 			codeLength += rRMConfigStatus.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 31)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 29)) {
 			seNBAdd = new SeNBAdd();
 			codeLength += seNBAdd.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 32)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 30)) {
 			seNBAddStatus = new SeNBAddStatus();
 			codeLength += seNBAddStatus.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 33)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 31)) {
 			seNBDelete = new SeNBDelete();
 			codeLength += seNBDelete.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 34)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 32)) {
 			trafficSplitConfig = new TrafficSplitConfig();
 			codeLength += trafficSplitConfig.decode(is, false);
 			return codeLength;
 		}
 
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 33)) {
+			hOCause = new HOCause();
+			codeLength += hOCause.decode(is, false);
+			return codeLength;
+		}
+
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 34)) {
+			rRCMeasConfig = new RRCMeasConfig();
+			codeLength += rRCMeasConfig.decode(is, false);
+			return codeLength;
+		}
+
 		if (passedTag != null) {
 			return 0;
 		}
@@ -907,18 +906,18 @@
 			return;
 		}
 
-		if (uEContextUpdate != null) {
-			sb.append("uEContextUpdate: ");
-			uEContextUpdate.appendAsString(sb, indentLevel + 1);
-			return;
-		}
-
 		if (uEAdmissionStatus != null) {
 			sb.append("uEAdmissionStatus: ");
 			uEAdmissionStatus.appendAsString(sb, indentLevel + 1);
 			return;
 		}
 
+		if (uEContextUpdate != null) {
+			sb.append("uEContextUpdate: ");
+			uEContextUpdate.appendAsString(sb, indentLevel + 1);
+			return;
+		}
+
 		if (uEReconfigInd != null) {
 			sb.append("uEReconfigInd: ");
 			uEReconfigInd.appendAsString(sb, indentLevel + 1);
@@ -955,18 +954,6 @@
 			return;
 		}
 
-		if (uECapabilityEnquiry != null) {
-			sb.append("uECapabilityEnquiry: ");
-			uECapabilityEnquiry.appendAsString(sb, indentLevel + 1);
-			return;
-		}
-
-		if (uECapabilityInfo != null) {
-			sb.append("uECapabilityInfo: ");
-			uECapabilityInfo.appendAsString(sb, indentLevel + 1);
-			return;
-		}
-
 		if (hORequest != null) {
 			sb.append("hORequest: ");
 			hORequest.appendAsString(sb, indentLevel + 1);
@@ -985,12 +972,6 @@
 			return;
 		}
 
-		if (rXSigMeasConfig != null) {
-			sb.append("rXSigMeasConfig: ");
-			rXSigMeasConfig.appendAsString(sb, indentLevel + 1);
-			return;
-		}
-
 		if (rXSigMeasReport != null) {
 			sb.append("rXSigMeasReport: ");
 			rXSigMeasReport.appendAsString(sb, indentLevel + 1);
@@ -1033,21 +1014,15 @@
 			return;
 		}
 
-		if (xICICConfig != null) {
-			sb.append("xICICConfig: ");
-			xICICConfig.appendAsString(sb, indentLevel + 1);
+		if (uECapabilityEnquiry != null) {
+			sb.append("uECapabilityEnquiry: ");
+			uECapabilityEnquiry.appendAsString(sb, indentLevel + 1);
 			return;
 		}
 
-		if (rRMConfig != null) {
-			sb.append("rRMConfig: ");
-			rRMConfig.appendAsString(sb, indentLevel + 1);
-			return;
-		}
-
-		if (rRMConfigStatus != null) {
-			sb.append("rRMConfigStatus: ");
-			rRMConfigStatus.appendAsString(sb, indentLevel + 1);
+		if (uECapabilityInfo != null) {
+			sb.append("uECapabilityInfo: ");
+			uECapabilityInfo.appendAsString(sb, indentLevel + 1);
 			return;
 		}
 
@@ -1069,6 +1044,18 @@
 			return;
 		}
 
+		if (rRMConfig != null) {
+			sb.append("rRMConfig: ");
+			rRMConfig.appendAsString(sb, indentLevel + 1);
+			return;
+		}
+
+		if (rRMConfigStatus != null) {
+			sb.append("rRMConfigStatus: ");
+			rRMConfigStatus.appendAsString(sb, indentLevel + 1);
+			return;
+		}
+
 		if (seNBAdd != null) {
 			sb.append("seNBAdd: ");
 			seNBAdd.appendAsString(sb, indentLevel + 1);
@@ -1093,6 +1080,18 @@
 			return;
 		}
 
+		if (hOCause != null) {
+			sb.append("hOCause: ");
+			hOCause.appendAsString(sb, indentLevel + 1);
+			return;
+		}
+
+		if (rRCMeasConfig != null) {
+			sb.append("rRCMeasConfig: ");
+			rRCMeasConfig.appendAsString(sb, indentLevel + 1);
+			return;
+		}
+
 		sb.append("<none>");
 	}
 
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/XrancPduHdr.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPduHdr.java
similarity index 87%
rename from src/main/java/org.onosproject.xran/codecs/pdu/XrancPduHdr.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPduHdr.java
index 124e692..49390fe 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/XrancPduHdr.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/pdu/XrancPduHdr.java
@@ -1,14 +1,14 @@
 /**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
+ * This class file was automatically generated by jASN1 v1.8.2 (http://www.openmuc.org)
  */
 
-package org.onosproject.xran.codecs.pdu;
+package org.onosproject.xran.asn1lib.pdu;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
+
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.BerLength;
+import org.onosproject.xran.asn1lib.ber.BerTag;
+import org.onosproject.xran.asn1lib.ber.types.string.BerUTF8String;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -20,7 +20,6 @@
 
 	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
 
-	@JsonIgnore
 	public byte[] code = null;
 	private BerUTF8String ver = null;
 	private XrancApiID apiId = null;
@@ -148,6 +147,9 @@
 		if (ver != null) {
 			sb.append("ver: ").append(ver);
 		}
+		else {
+			sb.append("ver: <empty-required-field>");
+		}
 		
 		sb.append(",\n");
 		for (int i = 0; i < indentLevel + 1; i++) {
@@ -156,6 +158,9 @@
 		if (apiId != null) {
 			sb.append("apiId: ").append(apiId);
 		}
+		else {
+			sb.append("apiId: <empty-required-field>");
+		}
 		
 		sb.append("\n");
 		for (int i = 0; i < indentLevel; i++) {
diff --git a/src/main/java/org.onosproject.xran/codecs/util/HexConverter.java b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/util/HexConverter.java
similarity index 98%
rename from src/main/java/org.onosproject.xran/codecs/util/HexConverter.java
rename to apps/xran/src/main/java/org.onosproject.xran/asn1lib/util/HexConverter.java
index 2ffddb7..573598f 100644
--- a/src/main/java/org.onosproject.xran/codecs/util/HexConverter.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/asn1lib/util/HexConverter.java
@@ -1,4 +1,4 @@
-package org.onosproject.xran.codecs.util;
+package org.onosproject.xran.asn1lib.util;
 
 public class HexConverter {
 
diff --git a/apps/xran/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java b/apps/xran/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
new file mode 100644
index 0000000..14b93af
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
@@ -0,0 +1,454 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xran.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.Lists;
+import io.netty.channel.ChannelHandlerContext;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.core.IdGenerator;
+import org.onosproject.store.AbstractStore;
+import org.onosproject.xran.XranService;
+import org.onosproject.xran.XranStore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.EUTRANCellIdentifier;
+import org.onosproject.xran.asn1lib.api.PCIARFCN;
+import org.onosproject.xran.impl.entities.RnibCell;
+import org.onosproject.xran.impl.entities.RnibLink;
+import org.onosproject.xran.impl.entities.RnibSlice;
+import org.onosproject.xran.impl.entities.RnibUe;
+import org.onosproject.xran.impl.identifiers.EcgiCrntiPair;
+import org.onosproject.xran.impl.identifiers.LinkId;
+import org.slf4j.Logger;
+
+import javax.xml.bind.DatatypeConverter;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Default xran store.
+ */
+@Component(immediate = true)
+@Service
+public class DefaultXranStore extends AbstractStore implements XranStore {
+    private static final String XRAN_APP_ID = "org.onosproject.xran";
+
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    protected ConcurrentMap<LinkId, RnibLink> linkMap = new ConcurrentHashMap<>();
+    private ConcurrentMap<ECGI, RnibCell> cellMap = new ConcurrentHashMap<>();
+    private ConcurrentMap<Long, RnibUe> ueMap = new ConcurrentHashMap<>();
+    private ConcurrentMap<Object, RnibSlice> sliceMap = new ConcurrentHashMap<>();
+
+    private XranService controller;
+    private IdGenerator ueIdGenerator;
+
+    // map to get the context channel based on ecgi
+    private ConcurrentMap<ECGI, ChannelHandlerContext> ctxMap = new ConcurrentHashMap<>();
+    // pci-arfcn to ecgi bimap
+    private BiMap<PCIARFCN, ECGI> pciarfcnMap = HashBiMap.create();
+    // ECGI, CRNTI pair of primary cell for specified UE.
+    private BiMap<EcgiCrntiPair, Long> crntiMap = HashBiMap.create();
+
+
+    @Activate
+    public void activate() {
+        ApplicationId appId = coreService.getAppId(XRAN_APP_ID);
+
+        // create ue id generator
+        ueIdGenerator = coreService.getIdGenerator("xran-ue-id");
+
+        log.info("XRAN Default Store Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        linkMap.clear();
+        cellMap.clear();
+        ueMap.clear();
+        sliceMap.clear();
+
+        controller = null;
+        ueIdGenerator = null;
+
+        log.info("XRAN Default Store Stopped");
+    }
+
+    @Override
+    public List<RnibLink> getLinks() {
+        List<RnibLink> list = Lists.newArrayList();
+        list.addAll(linkMap.values());
+        return list;
+    }
+
+    @Override
+    public List<RnibLink> getLinks(ECGI ecgi) {
+        List<RnibLink> list = Lists.newArrayList();
+        list.addAll(
+                linkMap.keySet()
+                        .stream()
+                        .filter(k -> k.getEcgi().equals(ecgi))
+                        .map(v -> linkMap.get(v))
+                        .collect(Collectors.toList()));
+        return list;
+    }
+
+    @Override
+    public List<RnibLink> getLinks(String eciHex) {
+        List<RnibLink> list = Lists.newArrayList();
+        EUTRANCellIdentifier eci = hexToEci(eciHex);
+
+        list.addAll(
+                linkMap.keySet()
+                        .stream()
+                        .filter(k -> k.getEcgi().getEUTRANcellIdentifier().equals(eci))
+                        .map(v -> linkMap.get(v))
+                        .collect(Collectors.toList()));
+
+        return list;
+    }
+
+    @Override
+    public List<RnibLink> getLinks(long euId) {
+        List<RnibLink> list = Lists.newArrayList();
+
+        list.addAll(
+                linkMap.keySet()
+                        .stream()
+                        .filter(k -> k.getUeId().equals(euId))
+                        .map(v -> linkMap.get(v))
+                        .collect(Collectors.toList()));
+
+        return list;
+    }
+
+
+    @Override
+    public Optional<RnibLink> getLink(String eciHex, long euId) {
+        EUTRANCellIdentifier eci = hexToEci(eciHex);
+
+        Optional<LinkId> first = linkMap.keySet()
+                .stream()
+                .filter(linkId -> linkId.getEcgi().getEUTRANcellIdentifier().equals(eci) &&
+                        linkId.getUeId().equals(euId))
+                .findFirst();
+
+        return first.map(linkId -> linkMap.get(linkId));
+    }
+
+    @Override
+    public void storeLink(RnibLink link) {
+        synchronized (this) {
+            if (link.getLinkId() != null) {
+                // if we add a primary link then change the primary to non serving
+                if (link.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
+                    RnibUe ue = link.getLinkId().getUe();
+                    getLinks(ue.getId())
+                            .stream()
+                            .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
+                            .forEach(l -> l.setType(RnibLink.Type.NON_SERVING));
+                }
+                linkMap.put(link.getLinkId(), link);
+            }
+        }
+    }
+
+    @Override
+    public boolean removeLink(LinkId link) {
+        return linkMap.remove(link) != null;
+    }
+
+    @Override
+    public Optional<RnibLink> getLink(ECGI ecgi, Long ueId) {
+        LinkId linkId = LinkId.valueOf(ecgi, ueId);
+        return Optional.ofNullable(linkMap.get(linkId));
+    }
+
+    @Override
+    public Optional<RnibLink> getLink(ECGI src, CRNTI dst) {
+        return getUe(src, dst).flatMap(ue -> getLink(src, ue.getId()));
+    }
+
+    @Override
+    public void modifyLinkRrmConf(RnibLink link, JsonNode rrmConf) {
+        link.modifyRrmParameters(rrmConf);
+    }
+
+    @Override
+    public List<Object> getNodes() {
+        List<Object> list = Lists.newArrayList();
+        list.addAll(cellMap.values());
+        list.addAll(ueMap.values());
+        return list;
+    }
+
+    @Override
+    public List<RnibCell> getCellNodes() {
+        List<RnibCell> list = Lists.newArrayList();
+        list.addAll(cellMap.values());
+        return list;
+    }
+
+    @Override
+    public List<RnibUe> getUeNodes() {
+        List<RnibUe> list = Lists.newArrayList();
+        list.addAll(ueMap.values());
+        return list;
+    }
+
+    @Override
+    public Optional<Object> getNode(String nodeId) {
+        try {
+            return Optional.ofNullable(getCell(nodeId));
+        } catch (Exception ignored) {
+        }
+        return Optional.ofNullable(getUe(Long.parseLong(nodeId)));
+    }
+
+    @Override
+    public void storeCell(RnibCell cell) {
+        if (cell.getEcgi() != null) {
+            cellMap.putIfAbsent(cell.getEcgi(), cell);
+        }
+    }
+
+    @Override
+    public boolean removeCell(ECGI ecgi) {
+        pciarfcnMap.inverse().remove(ecgi);
+        ctxMap.remove(ecgi);
+        return cellMap.remove(ecgi) != null;
+    }
+
+    @Override
+    public boolean removeCell(PCIARFCN pciarfcn) {
+        return removeCell(pciarfcnMap.get(pciarfcn));
+    }
+
+    @Override
+    public Optional<RnibCell> getCell(String hexeci) {
+        EUTRANCellIdentifier eci = hexToEci(hexeci);
+        Optional<ECGI> first = cellMap.keySet()
+                .stream()
+                .filter(ecgi -> ecgi.getEUTRANcellIdentifier().equals(eci))
+                .findFirst();
+        return first.map(ecgi -> cellMap.get(ecgi));
+    }
+
+    @Override
+    public Optional<RnibCell> getCell(ECGI ecgi) {
+        return Optional.ofNullable(cellMap.get(ecgi));
+    }
+
+    @Override
+    public Optional<RnibCell> getCell(PCIARFCN id) {
+        ECGI ecgi;
+        ecgi = pciarfcnMap.get(id);
+        return getCell(ecgi);
+    }
+
+    @Override
+    public void modifyCellRrmConf(RnibCell cell, JsonNode rrmConf) throws Exception {
+        List<RnibLink> linkList = getLinks(cell.getEcgi());
+        List<RnibUe> ueList = linkList.stream()
+                .map(link -> link.getLinkId().getUe())
+                .collect(Collectors.toList());
+
+        cell.modifyRrmConfig(rrmConf, ueList);
+    }
+
+    @Override
+    public Optional<RnibSlice> getSlice(long sliceId) {
+        return Optional.ofNullable(sliceMap.get(sliceId));
+    }
+
+    @Override
+    public boolean createSlice(ObjectNode attributes) {
+        return false;
+    }
+
+    @Override
+    public boolean removeCell(long sliceId) {
+        return sliceMap.remove(sliceId) != null;
+    }
+
+    @Override
+    public Optional<XranService> getController() {
+        return Optional.ofNullable(controller);
+    }
+
+    @Override
+    public void setController(XranService controller) {
+        this.controller = controller;
+    }
+
+    @Override
+    public void storeUe(RnibUe ue) {
+        long newId;
+        if (ue.getId() == null) {
+            newId = ueIdGenerator.getNewId();
+            ue.setId(newId);
+        } else {
+            newId = ue.getId();
+        }
+        ueMap.put(newId, ue);
+    }
+
+    @Override
+    public void storeUe(RnibCell cell, RnibUe ue) {
+        storeUe(ue);
+        storeCrnti(cell, ue);
+    }
+
+    @Override
+    public boolean removeUe(long ueId) {
+        log.info("removing ue {} {}", ueId, ueMap);
+        crntiMap.inverse().remove(ueId);
+        return ueMap.remove(ueId) != null;
+    }
+
+    @Override
+    public void storePciArfcn(RnibCell value) {
+        value.getOptConf().ifPresent(cfg -> {
+            PCIARFCN pciarfcn = new PCIARFCN();
+            pciarfcn.setPci(cfg.getPci());
+            pciarfcn.setEarfcnDl(cfg.getEarfcnDl());
+            pciarfcnMap.put(pciarfcn, value.getEcgi());
+        });
+    }
+
+    @Override
+    public void storeCtx(RnibCell value, ChannelHandlerContext ctx) {
+        if (value.getEcgi() != null) {
+            ctxMap.put(value.getEcgi(), ctx);
+            storeCell(value);
+        }
+    }
+
+    @Override
+    public Optional<ChannelHandlerContext> getCtx(ECGI ecgi) {
+        return Optional.ofNullable(ctxMap.get(ecgi));
+    }
+
+    @Override
+    public BiMap<EcgiCrntiPair, Long> getCrnti() {
+        return crntiMap;
+    }
+
+    @Override
+    public void storeCrnti(RnibCell cell, RnibUe ue) {
+        CRNTI crnti = ue.getCrnti();
+        ECGI ecgi = cell.getEcgi();
+
+        if (crnti != null && ecgi != null) {
+            // check if there is an ecgi, crnti pair for this UE id.
+            EcgiCrntiPair oldPair = crntiMap.inverse().get(ue.getId()),
+                    newPair = EcgiCrntiPair.valueOf(cell.getEcgi(), ue.getCrnti());
+
+            if (oldPair == null) {
+                crntiMap.put(newPair, ue.getId());
+            } else {
+                // remove old pair and add the new pair which corresponds to the primary cell.
+                crntiMap.inverse().remove(ue.getId());
+                crntiMap.put(newPair, ue.getId());
+            }
+        }
+    }
+
+    @Override
+    public void putPrimaryLink(RnibCell cell, RnibUe ue) {
+        RnibLink link = new RnibLink(cell, ue);
+        // set link to primary before storing
+        link.setType(RnibLink.Type.SERVING_PRIMARY);
+        storeLink(link);
+        storeCrnti(cell, ue);
+    }
+
+    @Override
+    public Optional<RnibLink> putNonServingLink(RnibCell cell, CRNTI crnti) {
+        return getUe(cell.getEcgi(), crnti).map(ue -> {
+            RnibLink link = new RnibLink(cell, ue);
+            storeLink(link);
+            return Optional.of(link);
+        }).orElse(Optional.empty());
+    }
+
+    @Override
+    public Optional<RnibLink> putNonServingLink(RnibCell cell, Long ueId) {
+        return getUe(ueId).map(ue -> {
+            RnibLink link = new RnibLink(cell, ue);
+            storeLink(link);
+            return Optional.of(link);
+        }).orElse(Optional.empty());
+    }
+
+    @Override
+    public Optional<CRNTI> getCrnti(Long ueId) {
+        return Optional.ofNullable(getCrnti().inverse().get(ueId).getValue());
+    }
+
+    @Override
+    public Optional<RnibCell> getPrimaryCell(RnibUe ue) {
+        // search all links for this UE and find PRIMARY.
+        Optional<RnibLink> primary = getLinks().stream()
+                .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
+                .filter(l -> l.getLinkId().getUe().equals(ue))
+                .findFirst();
+
+        return primary.flatMap(l -> Optional.of(l.getLinkId().getCell()));
+    }
+
+    @Override
+    public Optional<RnibUe> getUe(long ueId) {
+        return Optional.ofNullable(ueMap.get(ueId));
+    }
+
+    @Override
+    public Optional<RnibUe> getUe(ECGI ecgi, CRNTI crnti) {
+        return Optional.ofNullable(crntiMap.get(EcgiCrntiPair.valueOf(ecgi, crnti)))
+                .flatMap(this::getUe);
+    }
+
+    /**
+     * Get from HEX string the according ECI class object.
+     *
+     * @param eciHex HEX string
+     * @return ECI object if created successfully
+     */
+    private EUTRANCellIdentifier hexToEci(String eciHex) {
+        byte[] hexBinary = DatatypeConverter.parseHexBinary(eciHex);
+        return new EUTRANCellIdentifier(hexBinary, 28);
+    }
+}
diff --git a/src/main/java/org.onosproject.xran/impl/XranConfig.java b/apps/xran/src/main/java/org.onosproject.xran/impl/XranConfig.java
similarity index 91%
rename from src/main/java/org.onosproject.xran/impl/XranConfig.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/XranConfig.java
index ef83194..adde62e 100644
--- a/src/main/java/org.onosproject.xran/impl/XranConfig.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/XranConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,10 +20,10 @@
 import org.onlab.packet.IpAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.config.Config;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.EUTRANCellIdentifier;
-import org.onosproject.xran.codecs.api.PLMNIdentity;
-import org.onosproject.xran.codecs.util.HexConverter;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.EUTRANCellIdentifier;
+import org.onosproject.xran.asn1lib.api.PLMNIdentity;
+import org.onosproject.xran.asn1lib.util.HexConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -117,14 +117,16 @@
     }
 
     /**
-     * Get IP where the Controller binds to.
+     * Get IP where the XranServer binds to.
      *
      * @return IP address in configuration
      */
-    public IpAddress getXrancIp() { return IpAddress.valueOf(object.get(XRANC_IP).asText()); }
+    public IpAddress getXrancIp() {
+        return IpAddress.valueOf(object.get(XRANC_IP).asText());
+    }
 
     /**
-     * Get port for xRAN controller server to bind to from configuration.
+     * Get port for xRAN xranServer server to bind to from configuration.
      *
      * @return port number
      */
@@ -189,8 +191,8 @@
     /**
      * Get ECGI from HEX representation of PLMN_ID and ECI.
      *
-     * @param plmnId  HEX string of PLMN_ID
-     * @param eci     HEX string of ECI
+     * @param plmnId HEX string of PLMN_ID
+     * @param eci    HEX string of ECI
      * @return new ECGI object
      */
     private ECGI hexToEcgi(String plmnId, String eci) {
diff --git a/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java b/apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranChannelHandler.java
similarity index 83%
rename from src/main/java/org.onosproject.xran/controller/XranChannelHandler.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranChannelHandler.java
index d429602..e0285c3 100644
--- a/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranChannelHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.controller;
+package org.onosproject.xran.impl.controller;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
@@ -23,8 +23,8 @@
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.sctp.SctpMessage;
 import org.apache.commons.lang.exception.ExceptionUtils;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.pdu.XrancPdu;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.pdu.XrancPdu;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,10 +44,10 @@
     private static final Logger log =
             LoggerFactory.getLogger(XranChannelHandler.class);
 
-    private final Controller controller;
+    private final XranServer xranServer;
 
-    XranChannelHandler(Controller controller) {
-        this.controller = controller;
+    XranChannelHandler(XranServer xranServer) {
+        this.xranServer = xranServer;
     }
 
     /**
@@ -57,10 +57,14 @@
      * @return SCTP message
      * @throws IOException IO exception
      */
-    public static SctpMessage getSctpMessage(XrancPdu pdu) throws IOException {
+    public static SctpMessage getSctpMessage(XrancPdu pdu)  {
         BerByteArrayOutputStream os = new BerByteArrayOutputStream(4096);
 
-        pdu.encode(os);
+        try {
+            pdu.encode(os);
+        } catch (IOException e) {
+          log.warn(ExceptionUtils.getFullStackTrace(e));
+        }
 
         log.debug("Sending message: {}", pdu);
         final ByteBuf buf = Unpooled.buffer(os.getArray().length);
@@ -85,7 +89,7 @@
 
         log.info("Adding device...");
 
-        controller.deviceAgent.addConnectedCell(host, ctx);
+        xranServer.deviceAgent.addConnectedCell(host, ctx);
     }
 
     @Override
@@ -102,7 +106,7 @@
 
         recvPdu.decode(inputStream);
 
-        controller.packetAgent.handlePacket(recvPdu, ctx);
+        xranServer.packetAgent.handlePacket(recvPdu, ctx);
     }
 
     @Override
@@ -119,7 +123,7 @@
         final InetSocketAddress inetAddress = (InetSocketAddress) address;
         final String host = inetAddress.getHostString();
 
-        controller.deviceAgent.removeConnectedCell(host);
+        xranServer.deviceAgent.removeConnectedCell(host);
 
         ctx.close();
     }
diff --git a/apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranManager.java b/apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranManager.java
new file mode 100644
index 0000000..0df580f
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranManager.java
@@ -0,0 +1,1485 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xran.impl.controller;
+
+import com.google.common.collect.Sets;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.sctp.SctpMessage;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.IpAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.config.Config;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.SubjectFactories;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.host.HostEvent;
+import org.onosproject.net.host.HostListener;
+import org.onosproject.net.host.HostService;
+import org.onosproject.xran.XranDeviceAgent;
+import org.onosproject.xran.XranDeviceListener;
+import org.onosproject.xran.XranHostAgent;
+import org.onosproject.xran.XranHostListener;
+import org.onosproject.xran.XranPacketProcessor;
+import org.onosproject.xran.XranService;
+import org.onosproject.xran.XranStore;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.ERABID;
+import org.onosproject.xran.asn1lib.api.ERABParams;
+import org.onosproject.xran.asn1lib.api.ERABParamsItem;
+import org.onosproject.xran.asn1lib.api.Hysteresis;
+import org.onosproject.xran.asn1lib.api.MeasID;
+import org.onosproject.xran.asn1lib.api.MeasObject;
+import org.onosproject.xran.asn1lib.api.PCIARFCN;
+import org.onosproject.xran.asn1lib.api.PropScell;
+import org.onosproject.xran.asn1lib.api.QOffsetRange;
+import org.onosproject.xran.asn1lib.api.RadioRepPerServCell;
+import org.onosproject.xran.asn1lib.api.ReportConfig;
+import org.onosproject.xran.asn1lib.api.SchedMeasRepPerServCell;
+import org.onosproject.xran.asn1lib.api.TimeToTrigger;
+import org.onosproject.xran.asn1lib.api.TrafficSplitPercentage;
+import org.onosproject.xran.asn1lib.ber.types.BerBoolean;
+import org.onosproject.xran.asn1lib.ber.types.BerEnum;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+import org.onosproject.xran.asn1lib.pdu.BearerAdmissionRequest;
+import org.onosproject.xran.asn1lib.pdu.BearerAdmissionResponse;
+import org.onosproject.xran.asn1lib.pdu.BearerAdmissionStatus;
+import org.onosproject.xran.asn1lib.pdu.BearerReleaseInd;
+import org.onosproject.xran.asn1lib.pdu.CellConfigReport;
+import org.onosproject.xran.asn1lib.pdu.CellConfigRequest;
+import org.onosproject.xran.asn1lib.pdu.HOComplete;
+import org.onosproject.xran.asn1lib.pdu.HOFailure;
+import org.onosproject.xran.asn1lib.pdu.HORequest;
+import org.onosproject.xran.asn1lib.pdu.L2MeasConfig;
+import org.onosproject.xran.asn1lib.pdu.PDCPMeasReportPerUe;
+import org.onosproject.xran.asn1lib.pdu.RRCMeasConfig;
+import org.onosproject.xran.asn1lib.pdu.RRMConfig;
+import org.onosproject.xran.asn1lib.pdu.RRMConfigStatus;
+import org.onosproject.xran.asn1lib.pdu.RXSigMeasReport;
+import org.onosproject.xran.asn1lib.pdu.RadioMeasReportPerCell;
+import org.onosproject.xran.asn1lib.pdu.RadioMeasReportPerUE;
+import org.onosproject.xran.asn1lib.pdu.ScellAdd;
+import org.onosproject.xran.asn1lib.pdu.ScellAddStatus;
+import org.onosproject.xran.asn1lib.pdu.ScellDelete;
+import org.onosproject.xran.asn1lib.pdu.SchedMeasReportPerCell;
+import org.onosproject.xran.asn1lib.pdu.SchedMeasReportPerUE;
+import org.onosproject.xran.asn1lib.pdu.TrafficSplitConfig;
+import org.onosproject.xran.asn1lib.pdu.UEAdmissionRequest;
+import org.onosproject.xran.asn1lib.pdu.UEAdmissionResponse;
+import org.onosproject.xran.asn1lib.pdu.UEAdmissionStatus;
+import org.onosproject.xran.asn1lib.pdu.UECapabilityEnquiry;
+import org.onosproject.xran.asn1lib.pdu.UECapabilityInfo;
+import org.onosproject.xran.asn1lib.pdu.UEContextUpdate;
+import org.onosproject.xran.asn1lib.pdu.UEReconfigInd;
+import org.onosproject.xran.asn1lib.pdu.UEReleaseInd;
+import org.onosproject.xran.asn1lib.pdu.XrancPdu;
+import org.onosproject.xran.impl.XranConfig;
+import org.onosproject.xran.impl.entities.RnibCell;
+import org.onosproject.xran.impl.entities.RnibLink;
+import org.onosproject.xran.impl.entities.RnibUe;
+import org.onosproject.xran.impl.identifiers.ContextUpdateHandler;
+import org.onosproject.xran.impl.identifiers.EcgiCrntiPair;
+import org.onosproject.xran.impl.identifiers.LinkId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import static org.onosproject.net.DeviceId.deviceId;
+import static org.onosproject.xran.impl.controller.XranChannelHandler.getSctpMessage;
+import static org.onosproject.xran.impl.entities.RnibCell.decodeDeviceId;
+import static org.onosproject.xran.impl.entities.RnibCell.uri;
+import static org.onosproject.xran.impl.entities.RnibUe.hostIdtoUEId;
+
+/**
+ * Created by dimitris on 7/20/17.
+ */
+@Component(immediate = true)
+@Service
+public class XranManager implements XranService {
+    protected static final String XRAN_APP_ID = "org.onosproject.xran";
+    protected static final Class<XranConfig> CONFIG_CLASS = XranConfig.class;
+
+    protected static final Logger log =
+            LoggerFactory.getLogger(XranManager.class);
+
+    /* CONFIG */
+    protected final InternalNetworkConfigListener configListener =
+            new InternalNetworkConfigListener();
+
+    /* VARIABLES */
+    protected final XranServer xranServer = new XranServer();
+    protected XranConfig xranConfig;
+    protected ApplicationId appId;
+    protected int northboundTimeout;
+
+    /* Services */
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostService hostService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry registry;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigService configService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected XranStore xranStore;
+
+    protected ConfigFactory<ApplicationId, XranConfig> xranConfigFactory =
+            new ConfigFactory<ApplicationId, XranConfig>(
+                    SubjectFactories.APP_SUBJECT_FACTORY, CONFIG_CLASS, "xran") {
+                @Override
+                public XranConfig createConfig() {
+                    return new XranConfig();
+                }
+            };
+
+    /* MAPS */
+    protected ConcurrentMap<IpAddress, ECGI> legitCells = new ConcurrentHashMap<>();
+    protected ConcurrentMap<ECGI, SynchronousQueue<String>> hoMap = new ConcurrentHashMap<>();
+    protected ConcurrentMap<ECGI, SynchronousQueue<String>> rrmCellMap = new ConcurrentHashMap<>();
+    protected ConcurrentMap<CRNTI, SynchronousQueue<String>> scellAddMap = new ConcurrentHashMap<>();
+    // Map used to keep messages in pairs (HO Complete - CTX Update, Adm Status - CTX Update)
+    protected ConcurrentMap<EcgiCrntiPair, ContextUpdateHandler> contextUpdateMap = new ConcurrentHashMap<>();
+
+    /* QUEUE */
+    protected BlockingQueue<Long> ueIdQueue = new LinkedBlockingQueue<>();
+
+    /* AGENTS */
+    protected InternalXranDeviceAgent deviceAgent = new InternalXranDeviceAgent();
+    protected InternalXranHostAgent hostAgent = new InternalXranHostAgent();
+    protected InternalXranPacketAgent packetAgent = new InternalXranPacketAgent();
+
+    /* LISTENERS */
+    protected Set<XranDeviceListener> xranDeviceListeners = new CopyOnWriteArraySet<>();
+    protected Set<XranHostListener> xranHostListeners = new CopyOnWriteArraySet<>();
+    protected InternalDeviceListener deviceListener = new InternalDeviceListener();
+    protected InternalHostListener hostListener = new InternalHostListener();
+
+    @Activate
+    public void activate() {
+        appId = coreService.registerApplication(XRAN_APP_ID);
+
+        configService.addListener(configListener);
+        registry.registerConfigFactory(xranConfigFactory);
+        deviceService.addListener(deviceListener);
+        hostService.addListener(hostListener);
+
+        xranStore.setController(this);
+
+        log.info("XRAN XranServer v5 Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        deviceService.removeListener(deviceListener);
+        hostService.removeListener(hostListener);
+        configService.removeListener(configListener);
+        registry.unregisterConfigFactory(xranConfigFactory);
+
+        cleanup();
+
+        log.info("XRAN XranServer v5 Stopped");
+    }
+
+    /**
+     * Cleanup when application is deactivated.
+     */
+    private void cleanup() {
+        xranStore.getUeNodes().forEach(ue -> xranHostListeners.forEach(l -> l.hostRemoved(ue.getHostId())));
+
+        xranStore.getCellNodes().forEach(cell -> xranDeviceListeners
+                .forEach(l -> l.deviceRemoved(deviceId(uri(cell.getEcgi())))));
+
+        xranServer.stop();
+
+        legitCells.clear();
+        hoMap.clear();
+        rrmCellMap.clear();
+        scellAddMap.clear();
+        contextUpdateMap.clear();
+        ueIdQueue.clear();
+        xranDeviceListeners.clear();
+        xranHostListeners.clear();
+    }
+
+    @Override
+    public Optional<SynchronousQueue<String>> sendHoRequest(RnibLink linkT, RnibLink linkS) {
+        ECGI ecgiT = linkT.getLinkId().getEcgi(),
+                ecgiS = linkS.getLinkId().getEcgi();
+
+        Optional<ChannelHandlerContext> ctxT = xranStore.getCtx(ecgiT),
+                ctxS = xranStore.getCtx(ecgiS);
+
+        return xranStore.getCrnti(linkT.getLinkId().getUeId()).map(crnti -> {
+            SynchronousQueue<String> queue = new SynchronousQueue<>();
+
+            XrancPdu xrancPdu = HORequest.constructPacket(crnti, ecgiS, ecgiT);
+
+            // temporary map that has ECGI source of a handoff to a queue waiting for REST response.
+            hoMap.put(ecgiS, queue);
+
+            ctxT.ifPresent(ctx -> ctx.writeAndFlush(getSctpMessage(xrancPdu)));
+            ctxS.ifPresent(ctx -> ctx.writeAndFlush(getSctpMessage(xrancPdu)));
+
+            // FIXME: only works for one HO at a time.
+            try {
+                ueIdQueue.put(linkT.getLinkId().getUeId());
+            } catch (InterruptedException e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+            }
+
+            return Optional.of(queue);
+        }).orElse(Optional.empty());
+    }
+
+    @Override
+    public void addListener(XranDeviceListener listener) {
+        xranDeviceListeners.add(listener);
+    }
+
+    @Override
+    public void addListener(XranHostListener listener) {
+        xranHostListeners.add(listener);
+    }
+
+    @Override
+    public void removeListener(XranDeviceListener listener) {
+        xranDeviceListeners.remove(listener);
+    }
+
+    @Override
+    public void removeListener(XranHostListener listener) {
+        xranHostListeners.remove(listener);
+    }
+
+    @Override
+    public int getNorthboundTimeout() {
+        return northboundTimeout;
+    }
+
+    @Override
+    public Optional<SynchronousQueue<String>> sendModifiedRrm(RRMConfig rrmConfig) {
+        ECGI ecgi = rrmConfig.getEcgi();
+        Optional<ChannelHandlerContext> optionalCtx = xranStore.getCtx(ecgi);
+
+        // if ctx exists then create the queue and send the message
+        return optionalCtx.flatMap(ctx -> {
+            XrancPdu pdu;
+            pdu = RRMConfig.constructPacket(rrmConfig);
+            ctx.writeAndFlush(getSctpMessage(pdu));
+            SynchronousQueue<String> queue = new SynchronousQueue<>();
+            rrmCellMap.put(ecgi, queue);
+            return Optional.of(queue);
+        });
+    }
+
+    @Override
+    public Optional<SynchronousQueue<String>> sendScellAdd(RnibLink link) {
+        RnibCell secondaryCell = link.getLinkId().getCell();
+        // find primary cell
+        return xranStore.getPrimaryCell(link.getLinkId().getUe()).flatMap(primaryCell -> {
+                    ECGI primaryEcgi = primaryCell.getEcgi();
+                    // get ctx for the primary cell
+                    return xranStore.getCtx(primaryEcgi).flatMap(ctx ->
+                            // check if configuration exists
+                            secondaryCell.getOptConf().flatMap(cellReport -> {
+                                        PCIARFCN pciarfcn = new PCIARFCN();
+                                        pciarfcn.setPci(cellReport.getPci());
+                                        pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
+
+                                        PropScell propScell = new PropScell();
+                                        propScell.setPciArfcn(pciarfcn);
+
+                                        // search crnti of specific UE
+                                        return xranStore.getCrnti(link.getLinkId().getUeId()).flatMap(crnti -> {
+                                            SynchronousQueue<String> queue;
+                                            XrancPdu pdu = ScellAdd
+                                                    .constructPacket(primaryEcgi, crnti, propScell);
+
+                                            ctx.writeAndFlush(getSctpMessage(pdu));
+                                            queue = new SynchronousQueue<>();
+                                            scellAddMap.put(crnti, queue);
+
+                                            return Optional.of(queue);
+                                        });
+                                    }
+                            )
+                    );
+                }
+        );
+    }
+
+    @Override
+    public boolean sendScellDelete(RnibLink link) {
+        RnibCell secondaryCell = link.getLinkId().getCell();
+        // find primary cell
+        return xranStore.getPrimaryCell(link.getLinkId().getUe()).map(primaryCell -> {
+            ECGI primaryEcgi = primaryCell.getEcgi();
+            // get ctx for the primary cell
+            return xranStore.getCtx(primaryEcgi).map(ctx ->
+                    // check if config exists
+                    secondaryCell.getOptConf().map(cellReport -> {
+                        PCIARFCN pciarfcn = new PCIARFCN();
+                        pciarfcn.setPci(cellReport.getPci());
+                        pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
+
+                        // check if crnti for UE exists
+                        return xranStore.getCrnti(link.getLinkId().getUeId()).map(crnti -> {
+                            XrancPdu pdu = ScellDelete.constructPacket(primaryEcgi, crnti, pciarfcn);
+                            ctx.writeAndFlush(getSctpMessage(pdu));
+                            link.setType(RnibLink.Type.NON_SERVING);
+                            return true;
+                        }).orElse(false);
+                    }).orElse(false)
+            ).orElse(false);
+        }).orElse(false);
+    }
+
+    /**
+     * Timer to delete UE after being IDLE.
+     *
+     * @param ue UE entity
+     */
+    private void restartTimer(RnibUe ue) {
+        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+        ue.setExecutor(executor);
+        executor.schedule(
+                () -> {
+                    if (ue.getState().equals(RnibUe.State.IDLE)) {
+                        hostAgent.removeConnectedHost(ue);
+                        log.info("UE is removed after {} ms of IDLE", xranConfig.getIdleUeRemoval());
+                    } else {
+                        log.info("UE not removed cause its ACTIVE");
+                    }
+                },
+                xranConfig.getIdleUeRemoval(),
+                TimeUnit.MILLISECONDS
+        );
+    }
+
+    /**
+     * Timer to delete LINK after not receiving measurements.
+     *
+     * @param link LINK entity
+     */
+    private void restartTimer(RnibLink link) {
+        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+        link.setExecutor(executor);
+        executor.schedule(
+                () -> {
+                    LinkId linkId = link.getLinkId();
+                    xranStore.removeLink(linkId);
+                    log.info("Link is removed after not receiving Meas Reports for {} ms",
+                            xranConfig.getNoMeasLinkRemoval());
+                },
+                xranConfig.getNoMeasLinkRemoval(),
+                TimeUnit.MILLISECONDS
+        );
+    }
+
+    /**
+     * Request measurement configuration field of specified UE.
+     *
+     * @param primary primary CELL
+     * @param ue      UE entity
+     */
+    // TODO
+    private void populateMeasConfig(RnibCell primary, RnibUe ue) {
+        RRCMeasConfig.MeasObjects measObjects = new RRCMeasConfig.MeasObjects();
+        RRCMeasConfig.MeasIds measIds = new RRCMeasConfig.MeasIds();
+        // get ctx for cell
+        xranStore.getCtx(primary.getEcgi()).ifPresent(ctx -> {
+            // iterate through all cells
+            final int[] index = {0};
+            xranStore.getCellNodes().forEach(cell ->
+                    // set pciarfcn if config exists
+                    cell.getOptConf().ifPresent(cellReport -> {
+                                // PCIARFCN
+                                PCIARFCN pciarfcn = new PCIARFCN();
+                                pciarfcn.setPci(cellReport.getPci());
+                                pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
+
+                                // MEAS OBJECT
+                                MeasObject measObject = new MeasObject();
+                                MeasObject.MeasCells measCells = new MeasObject.MeasCells();
+                                measObject.setMeasCells(measCells);
+                                measObject.setDlFreq(cellReport.getEarfcnDl());
+                                measCells.setPci(cellReport.getPci());
+                                measCells.setCellIndividualOffset(new QOffsetRange(0));
+                                measObjects.getMeasObject().add(measObject);
+
+                                // MEAS ID
+                                MeasID measID = new MeasID();
+                                MeasID.Action action = new MeasID.Action();
+                                action.setHototarget(new BerBoolean(false));
+                                measID.setAction(action);
+                                measID.setReportconfigId(new BerInteger(0));
+                                measID.setMeasobjectId(new BerInteger(index[0]++));
+                                measIds.getMeasID().add(measID);
+                            }
+                    )
+            );
+            // REPORT CONFIG
+
+            RRCMeasConfig.ReportConfigs reportConfigs = new RRCMeasConfig.ReportConfigs();
+            ReportConfig reportConfig = reportConfigs.getReportConfig().get(0);
+
+            reportConfig.setReportQuantity(new BerEnum(0));
+            reportConfig.setTriggerQuantity(new BerEnum(0));
+
+            ReportConfig.ReportParams reportParams = new ReportConfig.ReportParams();
+            reportParams.setHysteresis(new Hysteresis(0));
+            reportParams.setParams(new ReportConfig.ReportParams.Params());
+            reportParams.setTimetotrigger(new TimeToTrigger(0));
+
+            reportConfig.setReportParams(reportParams);
+
+            // construct a rx sig meas conf packet
+            XrancPdu xrancPdu = RRCMeasConfig.constructPacket(
+                    primary.getEcgi(),
+                    ue.getCrnti(),
+                    measObjects,
+                    reportConfigs,
+                    measIds,
+                    xranConfig.getRxSignalInterval()
+            );
+            ue.setMeasConfig(xrancPdu.getBody().getRRCMeasConfig());
+            ctx.writeAndFlush(getSctpMessage(xrancPdu));
+        });
+    }
+
+    public void panic(XrancPdu recvPdu) {
+        throw new IllegalArgumentException("Received illegal packet: " + recvPdu.toString());
+    }
+
+    /**
+     * Internal device listener.
+     */
+    class InternalDeviceListener implements DeviceListener {
+
+        @Override
+        public void event(DeviceEvent event) {
+            log.info("Device Event {}", event);
+            switch (event.type()) {
+                case DEVICE_ADDED: {
+                    try {
+                        ECGI ecgi = decodeDeviceId(event.subject().id());
+                        // move this to a routine service
+                        xranStore.getCell(ecgi).ifPresent(cell -> {
+                            ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+                            executor.scheduleAtFixedRate(
+                                    () -> {
+                                        // populate config if it does not exist
+                                        if (!cell.getOptConf().isPresent()) {
+                                            // if channel context is present then send the config request
+                                            xranStore.getCtx(ecgi).ifPresent(ctx -> {
+                                                XrancPdu xrancPdu = CellConfigRequest.constructPacket(ecgi);
+                                                ctx.writeAndFlush(getSctpMessage(xrancPdu));
+                                            });
+                                        } else {
+                                            // iterate through all UEs
+                                            xranStore.getUeNodes().forEach(ue -> xranStore.getPrimaryCell(ue)
+                                                    .ifPresent(primaryCell -> populateMeasConfig(primaryCell, ue)));
+
+                                            // send l2 meas interval
+                                            xranStore.getCtx(ecgi).ifPresent(ctx -> {
+                                                XrancPdu xrancPdu = L2MeasConfig
+                                                        .constructPacket(ecgi, xranConfig.getL2MeasInterval());
+                                                cell.getMeasConfig().setL2MeasConfig(xrancPdu.getBody()
+                                                        .getL2MeasConfig());
+                                                SctpMessage sctpMessage = getSctpMessage(xrancPdu);
+                                                ctx.writeAndFlush(sctpMessage);
+
+                                                executor.shutdown();
+                                            });
+                                        }
+                                    },
+                                    0,
+                                    xranConfig.getConfigRequestInterval(),
+                                    TimeUnit.SECONDS
+                            );
+                        });
+                    } catch (IOException e) {
+                        log.error(ExceptionUtils.getFullStackTrace(e));
+                    }
+                    break;
+                }
+                default: {
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * Internal host listener.
+     */
+    class InternalHostListener implements HostListener {
+
+        @Override
+        public void event(HostEvent event) {
+            log.info("Host Event {}", event);
+            switch (event.type()) {
+                case HOST_ADDED:
+                case HOST_MOVED: {
+                    xranStore.getUe(hostIdtoUEId(event.subject().id())).ifPresent(ue -> xranStore.getPrimaryCell(ue)
+                            .ifPresent(cell -> {
+                                ue.setMeasConfig(null);
+
+                                // move this to a routine service
+                                ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+                                executor.scheduleAtFixedRate(
+                                        () -> {
+                                            if (cell.getVersion() >= 3) {
+                                                if (!Optional.ofNullable(ue.getCapability()).isPresent()) {
+                                                    xranStore.getCtx(cell.getEcgi()).ifPresent(ctx -> {
+                                                        XrancPdu xrancPdu = UECapabilityEnquiry.constructPacket(
+                                                                cell.getEcgi(),
+                                                                ue.getCrnti());
+                                                        ctx.writeAndFlush(getSctpMessage(xrancPdu));
+                                                    });
+                                                } else {
+                                                    executor.shutdown();
+                                                }
+                                            } else {
+                                                executor.shutdown();
+                                            }
+
+                                        },
+                                        0,
+                                        xranConfig.getConfigRequestInterval(),
+                                        TimeUnit.MILLISECONDS
+                                );
+                                if (ue.getMeasConfig() == null) {
+                                    populateMeasConfig(cell, ue);
+                                }
+                            }));
+                    break;
+                }
+                default: {
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * Internal xran device agent.
+     */
+    public class InternalXranDeviceAgent implements XranDeviceAgent {
+
+        private final Logger log = LoggerFactory.getLogger(InternalXranDeviceAgent.class);
+
+        @Override
+        public boolean addConnectedCell(String host, ChannelHandlerContext ctx) {
+            log.info("addConnectedCell: {}", host);
+            // check configuration if the cell is inside the accepted list
+            return Optional.ofNullable(legitCells.get(IpAddress.valueOf(host))).map(ecgi -> {
+                log.info("Device exists in configuration; registering...");
+                // check if cell is not already registered
+                if (!xranStore.getCell(ecgi).isPresent()) {
+                    RnibCell storeCell = new RnibCell();
+                    storeCell.setEcgi(ecgi);
+                    xranStore.storeCtx(storeCell, ctx);
+                    xranDeviceListeners.forEach(l -> l.deviceAdded(storeCell));
+                    return true;
+                }
+                return false;
+            }).orElseGet(() -> {
+                        log.error("Device is not a legit source; ignoring...");
+                        ctx.close();
+                        return false;
+                    }
+            );
+        }
+
+        @Override
+        public boolean removeConnectedCell(String host) {
+            log.info("removeConnectedCell: {}", host);
+            ECGI ecgi = legitCells.get(IpAddress.valueOf(host));
+
+            xranStore.getLinks(ecgi).forEach(rnibLink -> {
+                rnibLink.getLinkId().getUe().setState(RnibUe.State.IDLE);
+                restartTimer(rnibLink.getLinkId().getUe());
+                xranStore.removeLink(rnibLink.getLinkId());
+            });
+
+            if (xranStore.removeCell(ecgi)) {
+                xranDeviceListeners.forEach(l -> l.deviceRemoved(deviceId(uri(ecgi))));
+                return true;
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Internal xran host agent.
+     */
+    public class InternalXranHostAgent implements XranHostAgent {
+
+        @Override
+        public boolean addConnectedHost(RnibUe ue, RnibCell cell, ChannelHandlerContext ctx) {
+            log.info("addConnectedHost: {}", ue);
+            if (ue.getId() != null && xranStore.getUe(ue.getId()).isPresent()) {
+                xranStore.putPrimaryLink(cell, ue);
+
+                Set<ECGI> ecgiSet = Sets.newConcurrentHashSet();
+
+                xranStore.getLinks(ue.getId())
+                        .stream()
+                        .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
+                        .findFirst()
+                        .ifPresent(l -> ecgiSet.add(l.getLinkId().getEcgi()));
+
+                xranHostListeners.forEach(l -> l.hostAdded(ue, ecgiSet));
+                return true;
+            } else {
+                xranStore.storeUe(cell, ue);
+                xranStore.putPrimaryLink(cell, ue);
+
+                Set<ECGI> ecgiSet = Sets.newConcurrentHashSet();
+                ecgiSet.add(cell.getEcgi());
+                xranHostListeners.forEach(l -> l.hostAdded(ue, ecgiSet));
+                return true;
+            }
+
+        }
+
+        @Override
+        public boolean removeConnectedHost(RnibUe ue) {
+            log.info("removeConnectedHost: {}", ue);
+            xranStore.getLinks(ue.getId()).forEach(rnibLink -> xranStore.removeLink(rnibLink.getLinkId()));
+            if (xranStore.removeUe(ue.getId())) {
+                xranHostListeners.forEach(l -> l.hostRemoved(ue.getHostId()));
+                return true;
+            }
+            return false;
+        }
+    }
+
+    public class InternalXranPacketAgent implements XranPacketProcessor {
+        @Override
+        public void handlePacket(XrancPdu recvPdu, ChannelHandlerContext ctx)
+                throws IOException, InterruptedException {
+            int apiID = recvPdu.getHdr().getApiId().intValue();
+            log.debug("Received message: {}", recvPdu);
+            switch (apiID) {
+                // Cell Config Report
+                case 1: {
+                    CellConfigReport report = recvPdu.getBody().getCellConfigReport();
+                    handleCellconfigreport(report, recvPdu.getHdr().getVer().toString());
+                    break;
+                }
+                // UE Admission Request
+                case 2: {
+                    UEAdmissionRequest ueAdmissionRequest = recvPdu.getBody().getUEAdmissionRequest();
+                    handleUeadmissionRequest(ueAdmissionRequest, ctx);
+                    break;
+                }
+                // UE Admission Status
+                case 4: {
+                    UEAdmissionStatus ueAdmissionStatus = recvPdu.getBody().getUEAdmissionStatus();
+                    handleAdmissionStatus(ueAdmissionStatus, ctx);
+                    break;
+                }
+                // UE Context Update
+                case 5: {
+                    UEContextUpdate ueContextUpdate = recvPdu.getBody().getUEContextUpdate();
+                    handleUeContextUpdate(ueContextUpdate, ctx);
+                    break;
+                }
+                // UE Reconfig Ind
+                case 6: {
+                    UEReconfigInd ueReconfigInd = recvPdu.getBody().getUEReconfigInd();
+                    handleUeReconfigInd(ueReconfigInd);
+                    break;
+                }
+                // UE Release Ind
+                case 7: {
+                    // If xRANc wants to deactivate UE, we pass UEReleaseInd from xRANc to eNB.
+                    UEReleaseInd ueReleaseInd = recvPdu.getBody().getUEReleaseInd();
+                    handleUeReleaseInd(ueReleaseInd);
+                    break;
+                }
+                // Bearer Admission Request
+                case 8: {
+                    BearerAdmissionRequest bearerAdmissionRequest = recvPdu.getBody().getBearerAdmissionRequest();
+                    handleBearerAdmissionRequest(bearerAdmissionRequest, ctx);
+                    break;
+                }
+                // Bearer Admission Status
+                case 10: {
+                    BearerAdmissionStatus bearerAdmissionStatus = recvPdu.getBody().getBearerAdmissionStatus();
+                    // TODO: implement
+                    break;
+                }
+                // Bearer Release Ind
+                case 11: {
+                    BearerReleaseInd bearerReleaseInd = recvPdu.getBody().getBearerReleaseInd();
+                    handleBearerReleaseInd(bearerReleaseInd);
+                    break;
+                }
+                // HO Failure
+                case 13: {
+                    HOFailure hoFailure = recvPdu.getBody().getHOFailure();
+                    handleHoFailure(hoFailure);
+                    break;
+                }
+                // HO Complete
+                case 14: {
+                    HOComplete hoComplete = recvPdu.getBody().getHOComplete();
+                    handleHoComplete(hoComplete, ctx);
+                    break;
+                }
+                // RX Sig Meas Report
+                case 15: {
+                    RXSigMeasReport rxSigMeasReport = recvPdu.getBody().getRXSigMeasReport();
+                    handleRxSigMeasReport(rxSigMeasReport);
+                    break;
+                }
+                // Radio Meas Report per UE
+                case 17: {
+                    RadioMeasReportPerUE radioMeasReportPerUE = recvPdu.getBody().getRadioMeasReportPerUE();
+                    handleRadioMeasReportPerUe(radioMeasReportPerUE);
+                    break;
+                }
+                // Radio Meas Report per Cell
+                case 18: {
+                    RadioMeasReportPerCell radioMeasReportPerCell = recvPdu.getBody().getRadioMeasReportPerCell();
+                    handleRadioMeasReportPerCell(radioMeasReportPerCell);
+                    break;
+                }
+                // Sched Meas Report per UE
+                case 19: {
+                    SchedMeasReportPerUE schedMeasReportPerUE = recvPdu.getBody().getSchedMeasReportPerUE();
+                    handleSchedMeasReportPerUe(schedMeasReportPerUE);
+                    break;
+                }
+                // Sched Meas Report per Cell
+                case 20: {
+                    SchedMeasReportPerCell schedMeasReportPerCell = recvPdu.getBody().getSchedMeasReportPerCell();
+                    handleSchedMeasReportPerCell(schedMeasReportPerCell);
+                    break;
+                }
+                // PDCP Meas Report per UE
+                case 21: {
+                    PDCPMeasReportPerUe pdcpMeasReportPerUe = recvPdu.getBody().getPDCPMeasReportPerUe();
+                    handlePdcpMeasReportPerUe(pdcpMeasReportPerUe);
+                    break;
+                }
+                // UE Capability Enquiry
+                case 22: {
+                    UECapabilityEnquiry ueCapabilityEnquiry = recvPdu.getBody().getUECapabilityEnquiry();
+                    handleUecapabilityenquiry(ueCapabilityEnquiry, ctx);
+                    break;
+                }
+                // UE Capability Info
+                case 23: {
+                    UECapabilityInfo capabilityInfo = recvPdu.getBody().getUECapabilityInfo();
+                    handleCapabilityInfo(capabilityInfo);
+                    break;
+                }
+                // Scell Add Status
+                case 25: {
+                    ScellAddStatus scellAddStatus = recvPdu.getBody().getScellAddStatus();
+                    handleScellAddStatus(scellAddStatus);
+                    break;
+                }
+                // RRM Config Status
+                case 28: {
+                    // Decode RRMConfig Status
+                    RRMConfigStatus rrmConfigStatus = recvPdu.getBody().getRRMConfigStatus();
+                    handleRrmConfigStatus(rrmConfigStatus);
+                    break;
+                }
+                // SeNB Add
+                case 29: {
+                    // TODO: implement
+                    break;
+                }
+                // SeNB Add Status
+                case 30: {
+                    // TODO: implement
+                    break;
+                }
+                // SeNB Delete
+                case 31: {
+                    // TODO: implement
+                    break;
+                }
+                // Traffic Split Config
+                case 32: {
+                    TrafficSplitConfig trafficSplitConfig = recvPdu.getBody().getTrafficSplitConfig();
+                    handleTrafficSplitConfig(trafficSplitConfig);
+                    break;
+                }
+                // HO Cause
+                case 33: {
+                    // TODO: implement
+                    break;
+                }
+                case 34: {
+                    // TODO: implement
+                    break;
+                }
+                // Cell Config Request
+                case 0:
+                    // UE Admission Response
+                case 3:
+                    // Bearer Admission Response
+                case 9:
+                    // HO Request
+                case 12:
+                    // L2 Meas Config
+                case 16:
+                    // Scell Add
+                case 24:
+                    // Scell Delete
+                case 26:
+                    // RRM Config
+                case 27:
+                default: {
+                    panic(recvPdu);
+                }
+            }
+
+        }
+
+        /**
+         * Handle Cellconfigreport.
+         *
+         * @param report  CellConfigReport
+         * @param version String version ID
+         */
+        private void handleCellconfigreport(CellConfigReport report, String version) {
+            ECGI ecgi = report.getEcgi();
+
+            xranStore.getCell(ecgi).ifPresent(cell -> {
+                cell.setVersion(version);
+                cell.setConf(report);
+                xranStore.storePciArfcn(cell);
+            });
+        }
+
+        /**
+         * Handle Ueadmissionrequest.
+         *
+         * @param ueAdmissionRequest UEAdmissionRequest
+         * @param ctx                ChannelHandlerContext
+         * @throws IOException IO Exception
+         */
+        private void handleUeadmissionRequest(UEAdmissionRequest ueAdmissionRequest, ChannelHandlerContext ctx)
+                throws IOException {
+            ECGI ecgi = ueAdmissionRequest.getEcgi();
+
+            xranStore.getCell(ecgi).map(c -> {
+                CRNTI crnti = ueAdmissionRequest.getCrnti();
+                XrancPdu sendPdu = UEAdmissionResponse.constructPacket(ecgi, crnti, xranConfig.admissionFlag());
+                ctx.writeAndFlush(getSctpMessage(sendPdu));
+                return 1;
+            }).orElseGet(() -> {
+                log.warn("Could not find ECGI in registered cells: {}", ecgi);
+                return 0;
+            });
+        }
+
+        /**
+         * Handle UEAdmissionStatus.
+         *
+         * @param ueAdmissionStatus UEAdmissionStatus
+         * @param ctx               ChannelHandlerContext
+         */
+        private void handleAdmissionStatus(UEAdmissionStatus ueAdmissionStatus, ChannelHandlerContext ctx) {
+            xranStore.getUe(ueAdmissionStatus.getEcgi(), ueAdmissionStatus.getCrnti()).ifPresent(ue -> {
+                if (ueAdmissionStatus.getAdmEstStatus().value.intValue() == 0) {
+                    ue.setState(RnibUe.State.ACTIVE);
+                } else {
+                    ue.setState(RnibUe.State.IDLE);
+                }
+            });
+
+            if (ueAdmissionStatus.getAdmEstStatus().value.intValue() == 0) {
+                EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair
+                        .valueOf(ueAdmissionStatus.getEcgi(), ueAdmissionStatus.getCrnti());
+                contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
+                    if (v == null) {
+                        v = new ContextUpdateHandler();
+                    }
+                    if (v.setAdmissionStatus(ueAdmissionStatus)) {
+                        handlePairedPackets(v.getContextUpdate(), ctx, false);
+                        v.reset();
+                    }
+                    return v;
+                });
+            }
+        }
+
+        /**
+         * Handle UEContextUpdate.
+         *
+         * @param ueContextUpdate UEContextUpdate
+         * @param ctx             ChannelHandlerContext
+         */
+        private void handleUeContextUpdate(UEContextUpdate ueContextUpdate, ChannelHandlerContext ctx) {
+            EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair
+                    .valueOf(ueContextUpdate.getEcgi(), ueContextUpdate.getCrnti());
+
+            contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
+                if (v == null) {
+                    v = new ContextUpdateHandler();
+                }
+                if (v.setContextUpdate(ueContextUpdate)) {
+                    HOComplete hoComplete = v.getHoComplete();
+                    handlePairedPackets(ueContextUpdate, ctx, hoComplete != null);
+                    if (hoComplete != null) {
+                        try {
+                            hoMap.get(hoComplete.getEcgiS()).put("Hand Over Completed");
+                        } catch (InterruptedException e) {
+                            log.error(ExceptionUtils.getFullStackTrace(e));
+                        } finally {
+                            hoMap.remove(hoComplete.getEcgiS());
+                        }
+                    }
+                    v.reset();
+                }
+                return v;
+            });
+        }
+
+        /**
+         * Handle UEReconfigInd.
+         *
+         * @param ueReconfigInd UEReconfigInd
+         */
+        private void handleUeReconfigInd(UEReconfigInd ueReconfigInd) {
+            Optional<RnibUe> ue = xranStore.getUe(ueReconfigInd.getEcgi(), ueReconfigInd.getCrntiOld());
+            Optional<RnibCell> cell = xranStore.getCell(ueReconfigInd.getEcgi());
+
+            if (ue.isPresent() && cell.isPresent()) {
+                ue.get().setCrnti(ueReconfigInd.getCrntiNew());
+                xranStore.storeCrnti(cell.get(), ue.get());
+            } else {
+                log.warn("Could not find UE with this CRNTI: {}", ueReconfigInd.getCrntiOld());
+            }
+        }
+
+        /**
+         * Handle UEReleaseInd.
+         *
+         * @param ueReleaseInd UEReleaseInd
+         */
+        private void handleUeReleaseInd(UEReleaseInd ueReleaseInd) {
+            ECGI ecgi = ueReleaseInd.getEcgi();
+            CRNTI crnti = ueReleaseInd.getCrnti();
+
+            // Check if there is an ongoing handoff and only remove if ue is not part of the handoff.
+            Long peek = ueIdQueue.peek();
+            if (peek != null) {
+                EcgiCrntiPair ecgiCrntiPair = xranStore.getCrnti().inverse().get(peek);
+                if (ecgiCrntiPair != null && ecgiCrntiPair.equals(EcgiCrntiPair.valueOf(ecgi, crnti))) {
+                    return;
+                }
+            }
+
+            xranStore.getUe(ecgi, crnti).ifPresent(ue -> {
+                ue.setState(RnibUe.State.IDLE);
+                restartTimer(ue);
+            });
+        }
+
+        /**
+         * Handle BearerAdmissionRequest.
+         *
+         * @param bearerAdmissionRequest BearerAdmissionRequest
+         * @param ctx                    ChannelHandlerContext
+         */
+        private void handleBearerAdmissionRequest(BearerAdmissionRequest bearerAdmissionRequest,
+                                                  ChannelHandlerContext ctx) {
+            ECGI ecgi = bearerAdmissionRequest.getEcgi();
+            CRNTI crnti = bearerAdmissionRequest.getCrnti();
+            ERABParams erabParams = bearerAdmissionRequest.getErabParams();
+            xranStore.getLink(ecgi, crnti).ifPresent(link -> link.setBearerParameters(erabParams));
+
+            BerInteger numErabs = bearerAdmissionRequest.getNumErabs();
+            // Encode and send Bearer Admission Response
+            XrancPdu sendPdu = BearerAdmissionResponse
+                    .constructPacket(ecgi, crnti, erabParams, numErabs, xranConfig.bearerFlag());
+            ctx.writeAndFlush(getSctpMessage(sendPdu));
+        }
+
+        /**
+         * Handle BearerReleaseInd.
+         *
+         * @param bearerReleaseInd bearer release ind
+         */
+        private void handleBearerReleaseInd(BearerReleaseInd bearerReleaseInd) {
+            ECGI ecgi = bearerReleaseInd.getEcgi();
+            CRNTI crnti = bearerReleaseInd.getCrnti();
+
+            xranStore.getLink(ecgi, crnti).ifPresent(link -> {
+                List<ERABID> erabidsRelease = bearerReleaseInd.getErabIds().getERABID();
+                List<ERABParamsItem> erabParamsItem = link.getBearerParameters().getERABParamsItem();
+
+                List<ERABParamsItem> unreleased = erabParamsItem
+                        .stream()
+                        .filter(item -> {
+                            Optional<ERABID> any = erabidsRelease.stream()
+                                    .filter(id -> id.equals(item.getId())).findAny();
+                            return !any.isPresent();
+                        }).collect(Collectors.toList());
+                link.getBearerParameters().getERABParamsItem().clear();
+                link.getBearerParameters().getERABParamsItem().addAll(new ArrayList<>(unreleased));
+            });
+        }
+
+        /**
+         * Handle HOFailure.
+         *
+         * @param hoFailure HOFailure
+         * @throws InterruptedException ueIdQueue interruption
+         */
+        private void handleHoFailure(HOFailure hoFailure) throws InterruptedException {
+            try {
+                hoMap.get(hoFailure.getEcgi())
+                        .put("Hand Over Failed with cause: " + hoFailure.getCause());
+            } catch (InterruptedException e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+            } finally {
+                hoMap.remove(hoFailure.getEcgi());
+                ueIdQueue.take();
+            }
+        }
+
+        /**
+         * Handle HOComplete.
+         *
+         * @param hoComplete HOComplete
+         * @param ctx        ChannelHandlerContext
+         */
+        private void handleHoComplete(HOComplete hoComplete, ChannelHandlerContext ctx) {
+            EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair.valueOf(hoComplete.getEcgiT(),
+                    hoComplete.getCrntiNew());
+            contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
+                if (v == null) {
+                    v = new ContextUpdateHandler();
+                }
+                if (v.setHoComplete(hoComplete)) {
+                    handlePairedPackets(v.getContextUpdate(), ctx, true);
+
+                    try {
+                        hoMap.get(hoComplete.getEcgiS()).put("Hand Over Completed");
+                    } catch (InterruptedException e) {
+                        log.error(ExceptionUtils.getFullStackTrace(e));
+                    } finally {
+                        hoMap.remove(hoComplete.getEcgiS());
+                    }
+                    v.reset();
+                }
+                return v;
+            });
+        }
+
+        /**
+         * Handle RXSigMeasReport.
+         *
+         * @param rxSigMeasReport RXSigMeasReport
+         */
+        private void handleRxSigMeasReport(RXSigMeasReport rxSigMeasReport) {
+            rxSigMeasReport.getCellMeasReports().getSEQUENCEOF().forEach(
+                    cellMeasReport -> cellMeasReport.getRXSigReport().forEach(
+                            rxSigReport -> {
+                                rxSigMeasReport.getCrnti().getCRNTI().forEach(
+                                        crnti -> xranStore.getUe(rxSigMeasReport.getEcgi(), crnti).ifPresent(ue -> {
+                                            Long ueId = ue.getId();
+                                            xranStore.getCell(rxSigReport.getPciArfcn()).ifPresent(cell -> {
+                                                ECGI ecgi = cell.getEcgi();
+
+                                                Optional<RnibLink> link = xranStore.getLink(ecgi, ueId);
+                                                if (!link.isPresent()) {
+                                                    log.warn("Could not find link between: {}-{} " +
+                                                                    "| Creating non-serving link..",
+                                                            ecgi, ueId);
+                                                    link = xranStore.putNonServingLink(cell, ueId);
+                                                }
+
+                                                if (link.isPresent()) {
+                                                    if (link.get().getType().equals(RnibLink.Type.NON_SERVING)) {
+                                                        restartTimer(link.get());
+                                                    }
+
+//                                                    link.get().getMeasurements().setRxSigReport(
+//                                                        new RnibLink.Measurements.RXSigReport(
+//                                                                rxSigReport.getRsrq(),
+//                                                                rxSigReport.getRsrp(),
+//                                                                rxSigReport.get...
+//                                                        )
+//                                                    );
+                                                }
+                                            });
+                                        })
+                                );
+                            }
+                    )
+            );
+        }
+
+        /**
+         * Handle RadioMeasReportPerUE.
+         *
+         * @param radioMeasReportPerUE RadioMeasReportPerUE
+         */
+        private void handleRadioMeasReportPerUe(RadioMeasReportPerUE radioMeasReportPerUE) {
+            xranStore.getUe(radioMeasReportPerUE.getEcgi(), radioMeasReportPerUE.getCrnti()).ifPresent(ue -> {
+                Long ueId = ue.getId();
+                List<RadioRepPerServCell> servCells = radioMeasReportPerUE.getRadioReportServCells()
+                        .getRadioRepPerServCell();
+
+                servCells.forEach(servCell -> xranStore.getCell(servCell.getEcgi())
+                        .ifPresent(cell -> xranStore.getLink(cell.getEcgi(), ueId)
+                                .ifPresent(link -> {
+                                            RadioRepPerServCell.CqiHist cqiHist = servCell.getCqiHist();
+                                            final double[] values = {0, 0, 0};
+                                            final int[] i = {1};
+                                            cqiHist.getBerInteger().forEach(value -> {
+                                                        values[0] = Math.max(values[0], value.intValue());
+                                                        values[1] += i[0] * value.intValue();
+                                                        values[2] += value.intValue();
+                                                        i[0]++;
+                                                    }
+                                            );
+
+                                            link.getMeasurements().setRadioReport(
+                                                    new RnibLink.Measurements.RadioReport(
+                                                            new RnibLink.Measurements.RadioReport.Cqi(
+                                                                    cqiHist,
+                                                                    values[0],
+                                                                    values[1] / values[0]
+                                                            ),
+                                                            servCell.getRiHist(),
+                                                            servCell.getPucchSinrHist(),
+                                                            servCell.getPuschSinrHist()
+
+                                                    )
+                                            );
+                                        }
+                                )
+                        )
+                );
+            });
+        }
+
+        /**
+         * Handle RadioMeasReportPerCell.
+         *
+         * @param radioMeasReportPerCell RadioMeasReportPerCell
+         */
+        private void handleRadioMeasReportPerCell(RadioMeasReportPerCell radioMeasReportPerCell) {
+            xranStore.getCell(radioMeasReportPerCell.getEcgi()).ifPresent(
+                    cell -> cell.getMeasurements().setUlInterferenceMeasurement(
+                            new RnibCell.Measurements.ULInterferenceMeasurement(
+                                    radioMeasReportPerCell.getPuschIntfPowerHist(),
+                                    radioMeasReportPerCell.getPucchIntfPowerHist()
+                            )
+                    )
+            );
+        }
+
+        /**
+         * Handle SchedMeasReportPerUE.
+         *
+         * @param schedMeasReportPerUE SchedMeasReportPerUE
+         */
+        private void handleSchedMeasReportPerUe(SchedMeasReportPerUE schedMeasReportPerUE) {
+            xranStore.getUe(schedMeasReportPerUE.getEcgi(), schedMeasReportPerUE.getCrnti()).ifPresent(ue -> {
+                Long ueId = ue.getId();
+
+                List<SchedMeasRepPerServCell> servCells = schedMeasReportPerUE.getSchedReportServCells()
+                        .getSchedMeasRepPerServCell();
+
+                servCells.forEach(servCell -> xranStore.getCell(servCell.getEcgi())
+                        .ifPresent(cell -> xranStore.getLink(cell.getEcgi(), ueId)
+                                .ifPresent(link -> link.getMeasurements().setSchedMeasReport(
+                                        new RnibLink.Measurements.SchedMeasReport(
+                                                servCell.getQciVals(),
+                                                new RnibLink.Measurements.SchedMeasReport.ResourceUsage(
+                                                        servCell.getPrbUsage().getPrbUsageDl(),
+                                                        servCell.getPrbUsage().getPrbUsageUl()
+                                                ),
+                                                new RnibLink.Measurements.SchedMeasReport.Mcs(
+                                                        servCell.getMcsDl(),
+                                                        servCell.getMcsUl()
+                                                ),
+                                                new RnibLink.Measurements.SchedMeasReport.NumSchedTtis(
+                                                        servCell.getNumSchedTtisDl(),
+                                                        servCell.getNumSchedTtisUl()
+                                                ),
+                                                new RnibLink.Measurements.SchedMeasReport.DlRankStats(
+                                                        servCell.getRankDl1(),
+                                                        servCell.getRankDl2()
+                                                )
+                                        )
+                                )
+                                )
+                        )
+                );
+            });
+        }
+
+        /**
+         * Handle SchedMeasReportPerCell.
+         *
+         * @param schedMeasReportPerCell SchedMeasReportPerCell
+         */
+        private void handleSchedMeasReportPerCell(SchedMeasReportPerCell schedMeasReportPerCell) {
+            xranStore.getCell(schedMeasReportPerCell.getEcgi()).ifPresent(cell -> cell.getMeasurements().setPrbUsage(
+                    new RnibCell.Measurements.PrbUsage(
+                            schedMeasReportPerCell.getQciVals(),
+                            schedMeasReportPerCell.getPrbUsagePcell(),
+                            schedMeasReportPerCell.getPrbUsageScell()
+                    )
+            ));
+        }
+
+        /**
+         * Handle PDCPMeasReportPerUe.
+         *
+         * @param pdcpMeasReportPerUe PDCPMeasReportPerUe
+         */
+        private void handlePdcpMeasReportPerUe(PDCPMeasReportPerUe pdcpMeasReportPerUe) {
+            xranStore.getUe(pdcpMeasReportPerUe.getEcgi(), pdcpMeasReportPerUe.getCrnti()).ifPresent(ue -> {
+                Long ueId = ue.getId();
+                xranStore.getLink(pdcpMeasReportPerUe.getEcgi(), ueId).ifPresent(link ->
+                        link.getMeasurements().setPdcpMeasReport(
+                                new RnibLink.Measurements.PdcpMeasReport(
+                                        pdcpMeasReportPerUe.getQciVals(),
+                                        new RnibLink.Measurements.PdcpMeasReport.PdcpThroughput(
+                                                pdcpMeasReportPerUe.getThroughputDl(),
+                                                pdcpMeasReportPerUe.getThroughputUl()
+                                        ),
+                                        new RnibLink.Measurements.PdcpMeasReport.DataVol(
+                                                pdcpMeasReportPerUe.getDataVolDl(),
+                                                pdcpMeasReportPerUe.getDataVolUl()
+                                        ),
+                                        pdcpMeasReportPerUe.getPktDelayDl(),
+                                        pdcpMeasReportPerUe.getPktDiscardRateDl(),
+                                        new RnibLink.Measurements.PdcpMeasReport.PktLossRate(
+                                                pdcpMeasReportPerUe.getPktLossRateDl(),
+                                                pdcpMeasReportPerUe.getPktLossRateUl()
+                                        )
+                                )
+                        )
+                );
+            });
+        }
+
+        /**
+         * Handle UECapabilityInfo.
+         *
+         * @param capabilityInfo UECapabilityInfo
+         */
+        private void handleCapabilityInfo(UECapabilityInfo capabilityInfo) {
+            xranStore.getUe(capabilityInfo.getEcgi(), capabilityInfo.getCrnti())
+                    .ifPresent(
+                            ue -> ue.setCapability(capabilityInfo)
+                    );
+        }
+
+        /**
+         * Handle UECapabilityEnquiry.
+         *
+         * @param ueCapabilityEnquiry UECapabilityEnquiry
+         * @param ctx                 ChannelHandlerContext
+         */
+        private void handleUecapabilityenquiry(UECapabilityEnquiry ueCapabilityEnquiry, ChannelHandlerContext ctx) {
+            XrancPdu xrancPdu = UECapabilityEnquiry.constructPacket(ueCapabilityEnquiry.getEcgi(),
+                    ueCapabilityEnquiry.getCrnti());
+            ctx.writeAndFlush(getSctpMessage(xrancPdu));
+        }
+
+        /**
+         * Handle ScellAddStatus.
+         *
+         * @param scellAddStatus ScellAddStatus
+         */
+        private void handleScellAddStatus(ScellAddStatus scellAddStatus) {
+            xranStore.getUe(scellAddStatus.getEcgi(), scellAddStatus.getCrnti()).ifPresent(ue -> {
+                Long ueId = ue.getId();
+                try {
+                    scellAddMap.get(scellAddStatus.getCrnti()).put("Scell's status: " +
+                            scellAddStatus.getStatus());
+                    final int[] i = {0};
+                    scellAddStatus.getScellsInd().getPCIARFCN().forEach(
+                            pciarfcn -> {
+                                if (scellAddStatus.getStatus().getBerEnum().get(i[0]).value.intValue() == 0) {
+                                    xranStore.getCell(pciarfcn)
+                                            .ifPresent(cell -> xranStore.getLink(cell.getEcgi(), ueId)
+                                                    .ifPresent(link -> link.setType(RnibLink.Type.SERVING_SECONDARY_CA))
+                                            );
+                                }
+                                i[0]++;
+                            }
+                    );
+
+                } catch (InterruptedException e) {
+                    log.error(ExceptionUtils.getFullStackTrace(e));
+                } finally {
+                    scellAddMap.remove(scellAddStatus.getCrnti());
+                }
+            });
+        }
+
+        /**
+         * Handle RRMConfigStatus.
+         *
+         * @param rrmConfigStatus RRMConfigStatus
+         */
+        private void handleRrmConfigStatus(RRMConfigStatus rrmConfigStatus) {
+            try {
+                rrmCellMap.get(rrmConfigStatus.getEcgi())
+                        .put("RRM Config's status: " + rrmConfigStatus.getStatus());
+            } catch (InterruptedException e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+            } finally {
+                rrmCellMap.remove(rrmConfigStatus.getEcgi());
+            }
+        }
+
+        /**
+         * Handle TrafficSplitConfig.
+         *
+         * @param trafficSplitConfig TrafficSplitConfig
+         */
+        private void handleTrafficSplitConfig(TrafficSplitConfig trafficSplitConfig) {
+            xranStore.getUe(trafficSplitConfig.getEcgi(), trafficSplitConfig.getCrnti()).ifPresent(ue -> {
+                Long ueId = ue.getId();
+                List<TrafficSplitPercentage> splitPercentages = trafficSplitConfig
+                        .getTrafficSplitPercent().getTrafficSplitPercentage();
+
+                splitPercentages.forEach(trafficSplitPercentage -> xranStore.getCell(trafficSplitPercentage.getEcgi())
+                        .ifPresent(cell -> xranStore.getLink(cell.getEcgi(), ueId)
+                                .ifPresent(link -> link.setTrafficPercent(trafficSplitPercentage))));
+            });
+        }
+
+        /**
+         * Handle context update depending if its handoff or not.
+         *
+         * @param contextUpdate context update packet
+         * @param ctx           channel context for the CELL
+         * @param handoff       true if we handle a Hand Off
+         */
+        private void handlePairedPackets(UEContextUpdate contextUpdate, ChannelHandlerContext ctx, boolean handoff) {
+            xranStore.getCell(contextUpdate.getEcgi()).ifPresent(cell -> {
+                        Optional<RnibUe> optionalUe;
+                        if (handoff) {
+                            try {
+                                optionalUe = xranStore.getUe(ueIdQueue.take());
+                            } catch (InterruptedException e) {
+                                log.error(ExceptionUtils.getFullStackTrace(e));
+                                optionalUe = Optional.of(new RnibUe());
+                            }
+                        } else {
+                            optionalUe = Optional.of(new RnibUe());
+                        }
+
+                        optionalUe.ifPresent(ue -> {
+                            ue.getContextIds().setMmeS1apId(contextUpdate.getMMEUES1APID());
+                            ue.getContextIds().setEnbS1apId(contextUpdate.getENBUES1APID());
+                            ue.setCrnti(contextUpdate.getCrnti());
+                            hostAgent.addConnectedHost(ue, cell, ctx);
+                        });
+                    }
+            );
+        }
+    }
+
+    /**
+     * Internal class for NetworkConfigListener.
+     */
+    class InternalNetworkConfigListener implements NetworkConfigListener {
+
+        @Override
+        public void event(NetworkConfigEvent event) {
+            switch (event.type()) {
+                case CONFIG_REGISTERED:
+                    break;
+                case CONFIG_UNREGISTERED:
+                    break;
+                case CONFIG_ADDED:
+                case CONFIG_UPDATED:
+                    if (event.configClass() == CONFIG_CLASS) {
+                        handleConfigEvent(event.config());
+                    }
+                    break;
+                case CONFIG_REMOVED:
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        /**
+         * Handle config event.
+         *
+         * @param configOptional config
+         */
+        private void handleConfigEvent(Optional<Config> configOptional) {
+            configOptional.ifPresent(config -> {
+                xranConfig = (XranConfig) config;
+                northboundTimeout = xranConfig.getNorthBoundTimeout();
+                legitCells.putAll(xranConfig.activeCellSet());
+                xranServer.start(deviceAgent, hostAgent, packetAgent,
+                        xranConfig.getXrancIp(), xranConfig.getXrancPort());
+            });
+        }
+    }
+}
diff --git a/src/main/java/org.onosproject.xran/controller/Controller.java b/apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranServer.java
similarity index 89%
rename from src/main/java/org.onosproject.xran/controller/Controller.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranServer.java
index e8caacc..8a92ffd 100644
--- a/src/main/java/org.onosproject.xran/controller/Controller.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/controller/XranServer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.controller;
+package org.onosproject.xran.impl.controller;
 
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.ChannelFuture;
@@ -26,14 +26,17 @@
 import io.netty.handler.logging.LogLevel;
 import io.netty.handler.logging.LoggingHandler;
 import org.onlab.packet.IpAddress;
+import org.onosproject.xran.XranDeviceAgent;
+import org.onosproject.xran.XranHostAgent;
+import org.onosproject.xran.XranPacketProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Created by dimitris on 7/27/17.
  */
-public class Controller {
-    protected static final Logger log = LoggerFactory.getLogger(Controller.class);
+public class XranServer {
+    protected static final Logger log = LoggerFactory.getLogger(XranServer.class);
     protected XranDeviceAgent deviceAgent;
     protected XranHostAgent hostAgent;
     protected XranPacketProcessor packetAgent;
@@ -48,7 +51,7 @@
      * Run SCTP server.
      */
     public void run() {
-        final Controller ctrl = this;
+        final XranServer ctrl = this;
         try {
             ServerBootstrap b = createServerBootStrap();
             b.childHandler(new ChannelInitializer<SctpChannel>() {
@@ -84,11 +87,11 @@
     }
 
     /**
-     * Initialize controller and start SCTP server.
+     * Initialize xranServer and start SCTP server.
      *  @param deviceAgent device agent
      * @param hostAgent   host agent
      * @param packetAgent packet agent
-     * @param xrancIp
+     * @param xrancIp     xran bind IP
      * @param port        port of server
      */
     public void start(XranDeviceAgent deviceAgent, XranHostAgent hostAgent, XranPacketProcessor packetAgent,
diff --git a/src/main/java/org.onosproject.xran/controller/package-info.java b/apps/xran/src/main/java/org.onosproject.xran/impl/controller/package-info.java
similarity index 85%
rename from src/main/java/org.onosproject.xran/controller/package-info.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/controller/package-info.java
index 866c396..6b047e5 100644
--- a/src/main/java/org.onosproject.xran/controller/package-info.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/controller/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,4 +17,4 @@
 /**
  * Created by dimitris on 7/21/17.
  */
-package org.onosproject.xran.controller;
\ No newline at end of file
+package org.onosproject.xran.impl.controller;
\ No newline at end of file
diff --git a/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibCell.java b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibCell.java
new file mode 100644
index 0000000..6370a05
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibCell.java
@@ -0,0 +1,676 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xran.impl.entities;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.onosproject.net.DeviceId;
+import org.onosproject.store.service.WallClockTimestamp;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.PRBUsage;
+import org.onosproject.xran.asn1lib.api.XICICPA;
+import org.onosproject.xran.asn1lib.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.asn1lib.ber.types.BerBitString;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+import org.onosproject.xran.asn1lib.pdu.CellConfigReport;
+import org.onosproject.xran.asn1lib.pdu.L2MeasConfig;
+import org.onosproject.xran.asn1lib.pdu.RRCMeasConfig;
+import org.onosproject.xran.asn1lib.pdu.RRMConfig;
+import org.onosproject.xran.asn1lib.pdu.RadioMeasReportPerCell;
+import org.onosproject.xran.asn1lib.pdu.SchedMeasReportPerCell;
+
+import javax.xml.bind.DatatypeConverter;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+
+/**
+ * R-NIB Cell and its properties.
+ */
+@JsonPropertyOrder({
+        "ECGI",
+        "Configuration",
+        "RRMConfiguration",
+        "MeasConfig",
+        "Measurements"
+})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RnibCell {
+    @JsonIgnore
+    private static final String SCHEME = "xran";
+
+    @JsonProperty("ECGI")
+    private ECGI ecgi;
+
+    @JsonProperty("Configuration")
+    private Optional<CellConfigReport> conf = Optional.empty();
+
+    @JsonProperty("RRMConfiguration")
+    private RRMConfig rrmConfig = new RRMConfig();
+
+    @JsonProperty("MeasConfig")
+    private MeasConfig measConfig = new MeasConfig();
+
+    @JsonProperty("Measurements")
+    private Measurements measurements = new Measurements();
+
+    @JsonIgnore
+    private String version = "5";
+
+    /**
+     * Encode ECGI and obtain its URI.
+     *
+     * @param ecgi ECGI
+     * @return URI
+     */
+    public static URI uri(ECGI ecgi) {
+        if (ecgi != null) {
+            try {
+                BerByteArrayOutputStream os = new BerByteArrayOutputStream(4096);
+                ecgi.encode(os);
+                String message = DatatypeConverter.printHexBinary(os.getArray());
+                return new URI(SCHEME, message, null);
+            } catch (URISyntaxException | IOException e) {
+                return null;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Obtain ECGI from the device ID.
+     *
+     * @param deviceId ID of the device
+     * @return ECGI
+     * @throws IOException I0 Exception for ByteArrayInputStream
+     */
+    public static ECGI decodeDeviceId(DeviceId deviceId) throws IOException {
+        String uri = deviceId.toString();
+        String hexEcgi = uri.substring(uri.lastIndexOf("xran:") + 5);
+
+        ECGI ecgi = new ECGI();
+        byte[] bytearray = DatatypeConverter.parseHexBinary(hexEcgi);
+        InputStream inputStream = new ByteArrayInputStream(bytearray);
+
+        ecgi.decode(inputStream);
+        return ecgi;
+    }
+
+    /**
+     * Get version ID.
+     *
+     * @return version ID
+     */
+    public int getVersion() {
+        return Integer.parseInt(version);
+    }
+
+    /**
+     * Set version ID.
+     *
+     * @param version version ID
+     */
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    /**
+     * Get RRMConfig.
+     *
+     * @return RRMConfig
+     */
+    public RRMConfig getRrmConfig() {
+        return rrmConfig;
+    }
+
+    /**
+     * Set RRMConfig properties.
+     *
+     * @param rrmConfig RRMConfig
+     */
+    public void setRrmConfig(RRMConfig rrmConfig) {
+        this.rrmConfig = rrmConfig;
+    }
+
+    /**
+     * Get ECGI.
+     *
+     * @return ECGI
+     */
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    /**
+     * Set ECGI.
+     *
+     * @param ecgi ECGI
+     */
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    /**
+     * Get cell config report.
+     *
+     * @return Optional CellConfig Report
+     */
+    public Optional<CellConfigReport> getOptConf() {
+        return conf;
+    }
+
+    /**
+     * Get cell config report.
+     *
+     * @return CellConfig Report
+     */
+    public CellConfigReport getConf() {
+        return conf.get();
+    }
+
+    /**
+     * Set cell config report.
+     *
+     * @param conf Cell config report
+     */
+    public void setConf(CellConfigReport conf) {
+        this.conf = Optional.ofNullable(conf);
+    }
+
+    public MeasConfig getMeasConfig() {
+        return measConfig;
+    }
+
+    public void setMeasConfig(MeasConfig measConfig) {
+        this.measConfig = measConfig;
+    }
+
+    public Measurements getMeasurements() {
+        return measurements;
+    }
+
+    public void setMeasurements(Measurements measurements) {
+        this.measurements = measurements;
+    }
+
+    /**
+     * Modify the RRM Config parameters of cell.
+     *
+     * @param rrmConfigNode RRMConfig parameters to modify obtained from REST call
+     * @param ueList        List of all UEs
+     * @throws Exception p_a size not equal to UE size
+     */
+    public void modifyRrmConfig(JsonNode rrmConfigNode, List<RnibUe> ueList) throws Exception {
+        RRMConfig.Crnti crnti = new RRMConfig.Crnti();
+        ueList.forEach(ue -> crnti.getCRNTI().add(ue.getCrnti()));
+
+        JsonNode pA = rrmConfigNode.path("p_a");
+        if (!pA.isMissingNode()) {
+            RRMConfig.Pa pa = new RRMConfig.Pa();
+            if (pA.isArray()) {
+                if (ueList.size() == pA.size()) {
+                    List<XICICPA> collect = Stream.of(pA)
+                            .map(val -> new XICICPA(val.asInt()))
+                            .collect(Collectors.toList());
+                    pa.getXICICPA().clear();
+                    pa.getXICICPA().addAll(collect);
+                } else {
+                    throw new Exception("p_a size is not the same as UE size");
+                }
+            }
+            rrmConfig.setPa(pa);
+        }
+
+        JsonNode startPrbDl1 = rrmConfigNode.path("start_prb_dl");
+        if (!startPrbDl1.isMissingNode()) {
+            RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
+            if (startPrbDl1.isArray()) {
+                if (ueList.size() == startPrbDl1.size()) {
+                    List<BerInteger> collect = Stream.of(startPrbDl1)
+                            .map(val -> new BerInteger(val.asInt()))
+                            .collect(Collectors.toList());
+                    startPrbDl.getBerInteger().clear();
+                    startPrbDl.getBerInteger().addAll(collect);
+                } else {
+                    throw new Exception("start_prb_dl size is not the same as UE size");
+                }
+            }
+            rrmConfig.setStartPrbDl(startPrbDl);
+        }
+
+        JsonNode endPrbDl1 = rrmConfigNode.path("end_prb_dl");
+        if (!endPrbDl1.isMissingNode()) {
+            RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
+            if (endPrbDl1.isArray()) {
+                if (ueList.size() == endPrbDl1.size()) {
+                    List<BerInteger> collect = Stream.of(endPrbDl1)
+                            .map(val -> new BerInteger(val.asInt()))
+                            .collect(Collectors.toList());
+                    endPrbDl.getBerInteger().clear();
+                    endPrbDl.getBerInteger().addAll(collect);
+                } else {
+                    throw new Exception("end_prb_dl size is not the same as UE size");
+                }
+            }
+            rrmConfig.setEndPrbDl(endPrbDl);
+        }
+
+        JsonNode frameBitmaskDl = rrmConfigNode.path("sub_frame_bitmask_dl");
+        if (!frameBitmaskDl.isMissingNode()) {
+            RRMConfig.SubframeBitmaskDl subframeBitmaskDl = new RRMConfig.SubframeBitmaskDl();
+            if (frameBitmaskDl.isArray()) {
+                List<BerBitString> collect = Stream.of(frameBitmaskDl)
+                        .map(val -> new BerBitString(DatatypeConverter.parseHexBinary(val.asText()), 10))
+                        .collect(Collectors.toList());
+                subframeBitmaskDl.getBerBitString().clear();
+                subframeBitmaskDl.getBerBitString().addAll(collect);
+            } else {
+                throw new Exception("sub_frame_bitmask_dl size is not the same as UE size");
+            }
+            rrmConfig.setSubframeBitmaskDl(subframeBitmaskDl);
+        }
+
+        JsonNode startPrbUl1 = rrmConfigNode.path("start_prb_ul");
+        if (!startPrbUl1.isMissingNode()) {
+            RRMConfig.StartPrbUl startPrbUl = new RRMConfig.StartPrbUl();
+            if (startPrbUl1.isArray()) {
+                if (ueList.size() == startPrbUl1.size()) {
+                    List<BerInteger> collect = Stream.of(startPrbUl1)
+                            .map(val -> new BerInteger(val.asInt()))
+                            .collect(Collectors.toList());
+                    startPrbUl.getBerInteger().clear();
+                    startPrbUl.getBerInteger().addAll(collect);
+                } else {
+                    throw new Exception("start_prb_ul size is not the same as UE size");
+                }
+            }
+            rrmConfig.setStartPrbUl(startPrbUl);
+        }
+
+        JsonNode endPrbUl1 = rrmConfigNode.path("end_prb_ul");
+        if (!endPrbUl1.isMissingNode()) {
+            RRMConfig.EndPrbUl endPrbUl = new RRMConfig.EndPrbUl();
+            if (endPrbUl1.isArray()) {
+                if (ueList.size() == endPrbUl1.size()) {
+                    List<BerInteger> collect = Stream.of(endPrbUl1)
+                            .map(val -> new BerInteger(val.asInt()))
+                            .collect(Collectors.toList());
+                    endPrbUl.getBerInteger().clear();
+                    endPrbUl.getBerInteger().addAll(collect);
+                } else {
+                    throw new Exception("end_prb_ul size is not the same as UE size");
+                }
+            }
+            rrmConfig.setEndPrbUl(endPrbUl);
+        }
+
+        JsonNode uePusch = rrmConfigNode.path("p0_ue_pusch");
+        if (!uePusch.isMissingNode()) {
+            RRMConfig.P0UePusch p0UePusch = new RRMConfig.P0UePusch();
+            if (uePusch.isArray()) {
+                if (ueList.size() == uePusch.size()) {
+                    List<BerInteger> collect = Stream.of(uePusch)
+                            .map(val -> new BerInteger(val.asInt()))
+                            .collect(Collectors.toList());
+                    p0UePusch.getBerInteger().clear();
+                    p0UePusch.getBerInteger().addAll(collect);
+                } else {
+                    throw new Exception("p0_ue_pusch size is not the same as UE size");
+                }
+            }
+            rrmConfig.setP0UePusch(p0UePusch);
+        }
+
+        JsonNode frameBitmaskUl = rrmConfigNode.path("sub_frame_bitmask_ul");
+        if (!frameBitmaskUl.isMissingNode()) {
+            RRMConfig.SubframeBitmaskUl subframeBitmaskUl = new RRMConfig.SubframeBitmaskUl();
+            if (frameBitmaskUl.isArray()) {
+                List<BerBitString> collect = Stream.of(frameBitmaskUl)
+                        .map(val -> new BerBitString(DatatypeConverter.parseHexBinary(val.asText()), 10))
+                        .collect(Collectors.toList());
+                subframeBitmaskUl.getBerBitString().clear();
+                subframeBitmaskUl.getBerBitString().addAll(collect);
+            } else {
+                throw new Exception("sub_frame_bitmask_ul size is not the same as UE size");
+            }
+            rrmConfig.setSubframeBitmaskUl(subframeBitmaskUl);
+        }
+
+        rrmConfig.setCrnti(crnti);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        RnibCell rnibCell = (RnibCell) o;
+
+        return ecgi.equals(rnibCell.ecgi);
+    }
+
+    @Override
+    public int hashCode() {
+        return ecgi.hashCode();
+    }
+
+    /**
+     * Object class for MeasConfig.
+     */
+    @JsonPropertyOrder({
+            "RRCMeasConfig",
+            "L2MeasConfig",
+            "timestamp"
+    })
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class MeasConfig {
+        @JsonProperty("timestamp")
+        WallClockTimestamp timestamp = new WallClockTimestamp();
+        @JsonProperty("RRCMeasConfig")
+        private RRCMeasConfig rrcMeasConfig;
+        @JsonProperty("L2MeasConfig")
+        private L2MeasConfig l2MeasConfig;
+
+        public MeasConfig() {
+        }
+
+        @JsonCreator
+        public MeasConfig(@JsonProperty("RRCMeasConfig") RRCMeasConfig rrcMeasConfig,
+                          @JsonProperty("L2MeasConfig") L2MeasConfig l2MeasConfig) {
+            this.rrcMeasConfig = rrcMeasConfig;
+            this.l2MeasConfig = l2MeasConfig;
+        }
+
+        public RRCMeasConfig getRrcMeasConfig() {
+            return rrcMeasConfig;
+        }
+
+        public void setRrcMeasConfig(RRCMeasConfig rrcMeasConfig) {
+            this.rrcMeasConfig = rrcMeasConfig;
+        }
+
+        public L2MeasConfig getL2MeasConfig() {
+            return l2MeasConfig;
+        }
+
+        public void setL2MeasConfig(L2MeasConfig l2MeasConfig) {
+            this.l2MeasConfig = l2MeasConfig;
+        }
+
+        public long getTimestamp() {
+            return new WallClockTimestamp().unixTimestamp() - timestamp.unixTimestamp();
+        }
+
+        public void setTimestamp(WallClockTimestamp timestamp) {
+            this.timestamp = timestamp;
+        }
+
+        @Override
+        public String toString() {
+            return "MeasConfig{" +
+                    "rrcMeasConfig=" + rrcMeasConfig +
+                    ", l2MeasConfig=" + l2MeasConfig +
+                    ", timestamp=" + getTimestamp() +
+                    '}';
+        }
+    }
+
+    /**
+     * Object class for PrbUsage.
+     */
+    @JsonPropertyOrder({
+            "UL-InterferenceMeasurement",
+            "PRB-Usage",
+    })
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class Measurements {
+        @JsonProperty("UL-InterferenceMeasurement")
+        ULInterferenceMeasurement ulInterferenceMeasurement = new ULInterferenceMeasurement();
+        @JsonProperty("PRB-Usage")
+        PrbUsage prbUsage = new PrbUsage();
+
+        public Measurements() {
+        }
+
+        @JsonCreator
+        public Measurements(
+                @JsonProperty("UL-InterferenceMeasurement") ULInterferenceMeasurement ulInterferenceMeasurement,
+                @JsonProperty("PRB-Usage") PrbUsage prbUsage
+        ) {
+            this.ulInterferenceMeasurement = ulInterferenceMeasurement;
+            this.prbUsage = prbUsage;
+        }
+
+        public ULInterferenceMeasurement getUlInterferenceMeasurement() {
+            return ulInterferenceMeasurement;
+        }
+
+        public void setUlInterferenceMeasurement(ULInterferenceMeasurement ulInterferenceMeasurement) {
+            this.ulInterferenceMeasurement = ulInterferenceMeasurement;
+        }
+
+        public PrbUsage getPrbUsage() {
+            return prbUsage;
+        }
+
+        public void setPrbUsage(PrbUsage prbUsage) {
+            this.prbUsage = prbUsage;
+        }
+
+        @Override
+        public String toString() {
+            return "Measurements{" +
+                    "ulInterferenceMeasurement=" + ulInterferenceMeasurement +
+                    ", prbUsage=" + prbUsage +
+                    '}';
+        }
+
+        /**
+         * Object class for PrbUsage.
+         */
+        @JsonPropertyOrder({
+                "PUSCH",
+                "PUCCH",
+                "timestamp"
+        })
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class ULInterferenceMeasurement {
+            @JsonProperty("PUSCH")
+            RadioMeasReportPerCell.PuschIntfPowerHist pusch;
+            @JsonProperty("PUCCH")
+            RadioMeasReportPerCell.PucchIntfPowerHist pucch;
+            @JsonProperty("timestamp")
+            WallClockTimestamp timestamp = new WallClockTimestamp();
+
+            public ULInterferenceMeasurement() {
+            }
+
+            @JsonCreator
+            public ULInterferenceMeasurement(@JsonProperty("PUSCH") RadioMeasReportPerCell.PuschIntfPowerHist pusch,
+                                             @JsonProperty("PUCCH") RadioMeasReportPerCell.PucchIntfPowerHist pucch) {
+                this.pusch = pusch;
+                this.pucch = pucch;
+            }
+
+            public RadioMeasReportPerCell.PuschIntfPowerHist getPusch() {
+                return pusch;
+            }
+
+            public void setPusch(RadioMeasReportPerCell.PuschIntfPowerHist pusch) {
+                this.pusch = pusch;
+            }
+
+            public RadioMeasReportPerCell.PucchIntfPowerHist getPucch() {
+                return pucch;
+            }
+
+            public void setPucch(RadioMeasReportPerCell.PucchIntfPowerHist pucch) {
+                this.pucch = pucch;
+            }
+
+            public long getTimestamp() {
+                return new WallClockTimestamp().unixTimestamp() - timestamp.unixTimestamp();
+            }
+
+            public void setTimestamp(WallClockTimestamp timestamp) {
+                this.timestamp = timestamp;
+            }
+
+            @Override
+            public String toString() {
+                return "ULInterferenceMeasurement{" +
+                        "pusch=" + pusch +
+                        ", pucch=" + pucch +
+                        ", timestamp=" + getTimestamp() +
+                        '}';
+            }
+        }
+
+        /**
+         * Object class for PrbUsage.
+         */
+        @JsonPropertyOrder({
+                "QCI",
+                "primary",
+                "secondary",
+                "timestamp"
+        })
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class PrbUsage {
+            @JsonProperty("QCI")
+            SchedMeasReportPerCell.QciVals qci;
+            @JsonProperty("primary")
+            PRBUsage primary;
+            @JsonProperty("secondary")
+            PRBUsage secondary;
+            @JsonProperty("timestamp")
+            WallClockTimestamp timestamp = new WallClockTimestamp();
+
+            public PrbUsage() {
+            }
+
+            @JsonCreator
+            public PrbUsage(
+                    @JsonProperty("QCI") SchedMeasReportPerCell.QciVals qci,
+                    @JsonProperty("primary") PRBUsage primary,
+                    @JsonProperty("secondary") PRBUsage secondary
+            ) {
+                this.qci = qci;
+                this.primary = primary;
+                this.secondary = secondary;
+            }
+
+            /**
+             * Get QCI
+             *
+             * @return QCI
+             */
+            public SchedMeasReportPerCell.QciVals getQci() {
+                return qci;
+            }
+
+            /**
+             * Set QCI.
+             *
+             * @param qci
+             */
+            public void setQci(SchedMeasReportPerCell.QciVals qci) {
+                this.qci = qci;
+            }
+
+            /**
+             * Get primary PrbUsage.
+             *
+             * @return PrbUsage
+             */
+            public PRBUsage getPrimary() {
+                return primary;
+            }
+
+            /**
+             * Set secondary PrbUsage.
+             *
+             * @param primary PrbUsage
+             */
+            public void setPrimary(PRBUsage primary) {
+                this.primary = primary;
+            }
+
+            /**
+             * Get secondary PrbUsage.
+             *
+             * @return PrbUsage
+             */
+            public PRBUsage getSecondary() {
+                return secondary;
+            }
+
+            /**
+             * Set secondary PrbUsage.
+             *
+             * @param secondary PrbUsage
+             */
+            public void setSecondary(PRBUsage secondary) {
+                this.secondary = secondary;
+            }
+
+            /**
+             * Get time since last update.
+             *
+             * @return long Time
+             */
+            public long getTimestamp() {
+                return new WallClockTimestamp().unixTimestamp() - timestamp.unixTimestamp();
+            }
+
+
+            /**
+             * Set time since last update.
+             *
+             * @param timestamp time since last update
+             */
+            public void setTimestamp(WallClockTimestamp timestamp) {
+                this.timestamp = timestamp;
+            }
+
+            @Override
+            public String toString() {
+                return "PrbUsage{" +
+                        "qci=" + qci +
+                        ", primary=" + primary +
+                        ", secondary=" + secondary +
+                        ", timestamp=" + getTimestamp() +
+                        '}';
+            }
+        }
+    }
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibLink.java b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibLink.java
new file mode 100644
index 0000000..8505aec
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibLink.java
@@ -0,0 +1,1418 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xran.impl.entities;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Lists;
+import org.onosproject.store.service.WallClockTimestamp;
+import org.onosproject.xran.asn1lib.api.ERABParams;
+import org.onosproject.xran.asn1lib.api.PRBUsage;
+import org.onosproject.xran.asn1lib.api.RadioRepPerServCell;
+import org.onosproject.xran.asn1lib.api.SchedMeasRepPerServCell;
+import org.onosproject.xran.asn1lib.api.TrafficSplitPercentage;
+import org.onosproject.xran.asn1lib.api.XICICPA;
+import org.onosproject.xran.asn1lib.ber.types.BerBitString;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+import org.onosproject.xran.asn1lib.pdu.PDCPMeasReportPerUe;
+import org.onosproject.xran.asn1lib.pdu.RRMConfig;
+import org.onosproject.xran.asn1lib.pdu.RXSigMeasReport;
+import org.onosproject.xran.impl.identifiers.LinkId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.xml.bind.DatatypeConverter;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+/**
+ * R-NIB Link and its properties.
+ */
+@JsonPropertyOrder({
+        "Link-ID",
+        "Type",
+        "RRMConfiguration",
+        "TrafficPercent",
+        "BearerParameters",
+        "Measurements"
+})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RnibLink {
+    @JsonIgnore
+    private static final Logger log =
+            LoggerFactory.getLogger(RnibLink.class);
+    @JsonProperty("Measurements")
+    private Measurements measurements = new Measurements();
+    @JsonProperty("Link-ID")
+    private LinkId linkId;
+    @JsonProperty("RRMConfiguration")
+    private RRMConfig rrmParameters;
+    @JsonProperty("TrafficPercent")
+    private TrafficSplitPercentage trafficPercent;
+    @JsonProperty("BearerParameters")
+    private ERABParams bearerParameters;
+    @JsonProperty("Type")
+    private Type type;
+    @JsonIgnore
+    private ScheduledExecutorService executor;
+
+    public RnibLink(RnibCell cell, RnibUe ue) {
+        trafficPercent = new TrafficSplitPercentage();
+        trafficPercent.setEcgi(cell.getEcgi());
+        trafficPercent.setTrafficPercentDl(new BerInteger(100));
+        trafficPercent.setTrafficPercentUl(new BerInteger(100));
+
+        executor = Executors.newSingleThreadScheduledExecutor();
+
+        type = Type.NON_SERVING;
+
+        linkId = LinkId.valueOf(cell, ue);
+
+        rrmParameters = new RRMConfig();
+        RRMConfig.Crnti crnti = new RRMConfig.Crnti();
+        crnti.getCRNTI().add(linkId.getUe().getCrnti());
+        rrmParameters.setCrnti(crnti);
+        rrmParameters.setEcgi(linkId.getEcgi());
+    }
+
+    /**
+     * Get executor.
+     *
+     * @return Timer
+     */
+    public ScheduledExecutorService getExecutor() {
+        return executor;
+    }
+
+    public void setExecutor(ScheduledExecutorService executor) {
+        this.executor.shutdown();
+        this.executor = executor;
+    }
+
+    /**
+     * Get Link ID.
+     *
+     * @return LinkID
+     */
+    @JsonProperty("Link-ID")
+    public LinkId getLinkId() {
+        return linkId;
+    }
+
+    /**
+     * Set the Link ID.
+     *
+     * @param linkId Link ID
+     */
+    @JsonProperty("Link-ID")
+    public void setLinkId(LinkId linkId) {
+        this.linkId = linkId;
+    }
+
+    /**
+     * Set the LINK ID with cell and ue.
+     *
+     * @param cell Rnib CELL
+     * @param ue   Rnib UE
+     */
+    public void setLinkId(RnibCell cell, RnibUe ue) {
+        this.linkId = LinkId.valueOf(cell, ue);
+        trafficPercent.setEcgi(cell.getEcgi());
+    }
+
+    /**
+     * Get the link type.
+     *
+     * @return Link-type
+     */
+    @JsonProperty("Type")
+    public Type getType() {
+        return type;
+    }
+
+    /**
+     * Set the link type.
+     *
+     * @param type Link-type
+     */
+    @JsonProperty("Type")
+    public void setType(Type type) {
+        this.type = type;
+    }
+
+    /**
+     * Get traffic percent.
+     *
+     * @return TrafficSplitPercentage
+     */
+    @JsonProperty("TrafficPercent")
+    public TrafficSplitPercentage getTrafficPercent() {
+        return trafficPercent;
+    }
+
+    /**
+     * Set traffic percent.
+     *
+     * @param trafficPercent TrafficSplitPercentage
+     */
+    @JsonProperty("TrafficPercent")
+    public void setTrafficPercent(TrafficSplitPercentage trafficPercent) {
+        this.trafficPercent = trafficPercent;
+    }
+
+    /**
+     * Get the Bearer Parameters.
+     *
+     * @return ERABParams
+     */
+    @JsonProperty("BearerParameters")
+    public ERABParams getBearerParameters() {
+        return bearerParameters;
+    }
+
+    /**
+     * Set the Bearer Parameters.
+     *
+     * @param bearerParameters ERABParams
+     */
+    @JsonProperty("BearerParameters")
+    public void setBearerParameters(ERABParams bearerParameters) {
+        this.bearerParameters = bearerParameters;
+    }
+
+    /**
+     * Get RRM Configuration.
+     *
+     * @return RRMConfig
+     */
+    @JsonProperty("RRMConfiguration")
+    public RRMConfig getRrmParameters() {
+        return rrmParameters;
+    }
+
+    /**
+     * Set RRM Configuration.
+     *
+     * @param rrmParameters RRMConfig
+     */
+    @JsonProperty("RRMConfiguration")
+    public void setRrmParameters(RRMConfig rrmParameters) {
+        this.rrmParameters = rrmParameters;
+    }
+
+    public Measurements getMeasurements() {
+        return measurements;
+    }
+
+    public void setMeasurements(Measurements measurements) {
+        this.measurements = measurements;
+    }
+
+    /**
+     * Modify the RRM Config parameters of link.
+     *
+     * @param rrmConfigNode RRMConfig parameters to modify obtained from REST call
+     */
+    public void modifyRrmParameters(JsonNode rrmConfigNode) {
+
+        JsonNode pA = rrmConfigNode.path("p_a");
+        if (!pA.isMissingNode()) {
+            RRMConfig.Pa pa = new RRMConfig.Pa();
+
+            List<XICICPA> collect = Lists.newArrayList();
+            collect.add(new XICICPA(pA.asInt()));
+            pa.getXICICPA().clear();
+            pa.getXICICPA().addAll(collect);
+
+            rrmParameters.setPa(pa);
+        }
+
+        JsonNode startPrbDl1 = rrmConfigNode.path("start_prb_dl");
+        if (!startPrbDl1.isMissingNode()) {
+            RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
+
+            List<BerInteger> collect = Lists.newArrayList();
+            collect.add(new BerInteger(startPrbDl1.asInt()));
+            startPrbDl.getBerInteger().clear();
+            startPrbDl.getBerInteger().addAll(collect);
+
+            rrmParameters.setStartPrbDl(startPrbDl);
+        }
+
+        JsonNode endPrbDl1 = rrmConfigNode.path("end_prb_dl");
+        if (!endPrbDl1.isMissingNode()) {
+            RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
+
+            List<BerInteger> collect = Lists.newArrayList();
+            collect.add(new BerInteger(endPrbDl1.asInt()));
+            endPrbDl.getBerInteger().clear();
+            endPrbDl.getBerInteger().addAll(collect);
+
+            rrmParameters.setEndPrbDl(endPrbDl);
+        }
+
+        JsonNode subFrameBitmaskDl = rrmConfigNode.path("sub_frame_bitmask_dl");
+        if (!subFrameBitmaskDl.isMissingNode()) {
+            RRMConfig.SubframeBitmaskDl subframeBitmaskDl = new RRMConfig.SubframeBitmaskDl();
+            List<BerBitString> collect = Lists.newArrayList();
+
+            byte[] hexString = DatatypeConverter.parseHexBinary(subFrameBitmaskDl.asText());
+            collect.add(new BerBitString(hexString, 10));
+            subframeBitmaskDl.getBerBitString().clear();
+            subframeBitmaskDl.getBerBitString().addAll(collect);
+
+            rrmParameters.setSubframeBitmaskDl(subframeBitmaskDl);
+        }
+
+        JsonNode startPrbUl1 = rrmConfigNode.path("start_prb_ul");
+        if (!startPrbUl1.isMissingNode()) {
+            RRMConfig.StartPrbUl startPrbUl = new RRMConfig.StartPrbUl();
+
+            List<BerInteger> collect = Lists.newArrayList();
+            collect.add(new BerInteger(startPrbUl1.asInt()));
+            startPrbUl.getBerInteger().clear();
+            startPrbUl.getBerInteger().addAll(collect);
+
+            rrmParameters.setStartPrbUl(startPrbUl);
+        }
+
+        JsonNode endPrbUl1 = rrmConfigNode.path("end_prb_ul");
+        if (!endPrbUl1.isMissingNode()) {
+            RRMConfig.EndPrbUl endPrbUl = new RRMConfig.EndPrbUl();
+
+            List<BerInteger> collect = Lists.newArrayList();
+            collect.add(new BerInteger(endPrbUl1.asInt()));
+            endPrbUl.getBerInteger().clear();
+            endPrbUl.getBerInteger().addAll(collect);
+
+            rrmParameters.setEndPrbUl(endPrbUl);
+        }
+
+
+        JsonNode p0UePusch1 = rrmConfigNode.path("p0_ue_pusch");
+        if (!p0UePusch1.isMissingNode()) {
+            RRMConfig.P0UePusch p0UePusch = new RRMConfig.P0UePusch();
+
+            List<BerInteger> collect = Lists.newArrayList();
+            collect.add(new BerInteger(p0UePusch1.asInt()));
+            p0UePusch.getBerInteger().clear();
+            p0UePusch.getBerInteger().addAll(collect);
+
+            rrmParameters.setP0UePusch(p0UePusch);
+        }
+
+        JsonNode subFrameBitmaskUl = rrmConfigNode.path("sub_frame_bitmask_ul");
+        if (!subFrameBitmaskUl.isMissingNode()) {
+            RRMConfig.SubframeBitmaskUl subframeBitmaskUl = new RRMConfig.SubframeBitmaskUl();
+            List<BerBitString> collect = Lists.newArrayList();
+
+            byte[] hexString = DatatypeConverter.parseHexBinary(subFrameBitmaskUl.asText());
+            collect.add(new BerBitString(hexString, 10));
+            subframeBitmaskUl.getBerBitString().clear();
+            subframeBitmaskUl.getBerBitString().addAll(collect);
+
+            rrmParameters.setSubframeBitmaskUl(subframeBitmaskUl);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "RnibLink{" +
+                "measurements=" + measurements +
+                ", linkId=" + linkId +
+                ", rrmParameters=" + rrmParameters +
+                ", trafficPercent=" + trafficPercent +
+                ", bearerParameters=" + bearerParameters +
+                ", type=" + type +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        RnibLink link = (RnibLink) o;
+
+        return linkId.equals(link.linkId);
+    }
+
+    @Override
+    public int hashCode() {
+        return linkId.hashCode();
+    }
+
+    /**
+     * Enum of Link-Type.
+     */
+    public enum Type {
+        SERVING_PRIMARY("serving/primary") {
+            @Override
+            public String toString() {
+                return "serving/primary";
+            }
+        },
+        SERVING_SECONDARY_CA("serving/secondary/ca") {
+            @Override
+            public String toString() {
+                return "serving/secondary/ca";
+            }
+        },
+        SERVING_SECONDARY_DC("serving/secondary/dc") {
+            @Override
+            public String toString() {
+                return "serving/secondary/dc";
+            }
+        },
+        NON_SERVING("non-serving") {
+            @Override
+            public String toString() {
+                return "non-serving";
+            }
+        };
+
+        private String name;
+
+        Type(String name) {
+            this.name = name;
+        }
+
+        /**
+         * Get enum value of link-type.
+         *
+         * @param name String representation of Enum Type
+         * @return Type
+         */
+        public static Type getEnum(String name) {
+            Optional<Type> any = Arrays.stream(Type.values()).filter(typeStr -> typeStr.name.equals(name)).findAny();
+            if (any.isPresent()) {
+                return any.get();
+            }
+            throw new IllegalArgumentException("No enum defined for string: " + name);
+        }
+    }
+
+    @JsonPropertyOrder({
+            "RXSigReport",
+            "RadioReport",
+            "SchedMeasReport",
+            "PDCPMeasReport",
+
+    })
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class Measurements {
+        @JsonProperty("RXSigReport")
+        RXSigReport rxSigReport = new RXSigReport();
+        @JsonProperty("RadioReport")
+        RadioReport radioReport = new RadioReport();
+        @JsonProperty("SchedMeasReport")
+        SchedMeasReport schedMeasReport = new SchedMeasReport();
+        @JsonProperty("PDCPMeasReport")
+        PdcpMeasReport pdcpMeasReport = new PdcpMeasReport();
+
+        public Measurements() {
+        }
+
+        @JsonCreator
+        public Measurements(@JsonProperty("RXSigReport") RXSigReport rxSigReport,
+                            @JsonProperty("RadioReport") RadioReport radioReport,
+                            @JsonProperty("SchedMeasReport") SchedMeasReport schedMeasReport,
+                            @JsonProperty("PDCPMeasReport") PdcpMeasReport pdcpMeasReport) {
+            this.rxSigReport = rxSigReport;
+            this.radioReport = radioReport;
+            this.schedMeasReport = schedMeasReport;
+            this.pdcpMeasReport = pdcpMeasReport;
+        }
+
+        public RXSigReport getRxSigReport() {
+            return rxSigReport;
+        }
+
+        public void setRxSigReport(RXSigReport rxSigReport) {
+            this.rxSigReport = rxSigReport;
+        }
+
+        public RadioReport getRadioReport() {
+            return radioReport;
+        }
+
+        public void setRadioReport(RadioReport radioReport) {
+            this.radioReport = radioReport;
+        }
+
+        public SchedMeasReport getSchedMeasReport() {
+            return schedMeasReport;
+        }
+
+        public void setSchedMeasReport(SchedMeasReport schedMeasReport) {
+            this.schedMeasReport = schedMeasReport;
+        }
+
+        public PdcpMeasReport getPdcpMeasReport() {
+            return pdcpMeasReport;
+        }
+
+        public void setPdcpMeasReport(PdcpMeasReport pdcpMeasReport) {
+            this.pdcpMeasReport = pdcpMeasReport;
+        }
+
+        @Override
+        public String toString() {
+            return "Measurements{" +
+                    "rxSigReport=" + rxSigReport +
+                    ", radioReport=" + radioReport +
+                    ", schedMeasReport=" + schedMeasReport +
+                    ", pdcpMeasReport=" + pdcpMeasReport +
+                    '}';
+        }
+
+        @JsonPropertyOrder({
+                "RSRP",
+                "RSRQ",
+                "meas-id",
+                "timestamp"
+        })
+        public static class RXSigReport {
+            @JsonProperty("RSRP")
+            double rsrp;
+            @JsonProperty("RSRQ")
+            double rsrq;
+            @JsonProperty("meas-id")
+            RXSigMeasReport.CellMeasReports measReports;
+            @JsonProperty("timestamp")
+            WallClockTimestamp timesincelastupdate = new WallClockTimestamp();
+
+            public RXSigReport() {
+            }
+
+            @JsonCreator
+            public RXSigReport(@JsonProperty("RSRP") double rsrp,
+                               @JsonProperty("RSRQ") double rsrq,
+                               @JsonProperty("meas-id") RXSigMeasReport.CellMeasReports measReports
+            ) {
+                this.rsrp = rsrp;
+                this.rsrq = rsrq;
+                this.measReports = measReports;
+            }
+
+            /**
+             * Get rsrp.
+             *
+             * @return double rsrp
+             */
+            public double getRsrp() {
+                return rsrp;
+            }
+
+            /**
+             * Set rsrp.
+             *
+             * @param rsrp rsrp
+             */
+            public void setRsrp(double rsrp) {
+                this.rsrp = rsrp;
+            }
+
+            /**
+             * Get rsrq.
+             *
+             * @return double rsrq
+             */
+            public double getRsrq() {
+                return rsrq;
+            }
+
+            /**
+             * Set rsrq.
+             *
+             * @param rsrq rsrq
+             */
+            public void setRsrq(double rsrq) {
+                this.rsrq = rsrq;
+            }
+
+            /**
+             * Get time since last update.
+             *
+             * @return long Time
+             */
+            public long getTimesincelastupdate() {
+                return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
+            }
+
+            /**
+             * Set time since last update.
+             *
+             * @param timesincelastupdate time since last update
+             */
+            public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
+                this.timesincelastupdate = timesincelastupdate;
+            }
+
+            public RXSigMeasReport.CellMeasReports getMeasReports() {
+                return measReports;
+            }
+
+            public void setMeasReports(RXSigMeasReport.CellMeasReports measReports) {
+                this.measReports = measReports;
+            }
+
+            @Override
+            public String toString() {
+                return "RXSigReport{" +
+                        "rsrp=" + rsrp +
+                        ", rsrq=" + rsrq +
+                        ", measReports=" + measReports +
+                        ", timestamp=" + getTimesincelastupdate() +
+                        '}';
+            }
+        }
+
+        @JsonPropertyOrder({
+                "CQI",
+                "Rank_hist",
+                "Pusch_sinr_hist",
+                "Pucch_sinr_hist",
+                "timestamp"
+        })
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class RadioReport {
+            @JsonProperty("CQI")
+            Cqi cqi = new Cqi();
+            @JsonProperty("Rank_hist")
+            RadioRepPerServCell.RiHist riHist;
+            @JsonProperty("Pucch_sinr_hist")
+            RadioRepPerServCell.PucchSinrHist pucchSinrHist;
+            @JsonProperty("Pusch_sinr_hist")
+            RadioRepPerServCell.PuschSinrHist puschSinrHist;
+            @JsonProperty("timestamp")
+            WallClockTimestamp timesincelastupdate = new WallClockTimestamp();
+
+            public RadioReport() {
+            }
+
+            @JsonCreator
+            public RadioReport(@JsonProperty("CQI") Cqi cqi,
+                               @JsonProperty("Rank_hist") RadioRepPerServCell.RiHist riHist,
+                               @JsonProperty("Pucch_sinr_hist") RadioRepPerServCell.PucchSinrHist pucchSinrHist,
+                               @JsonProperty("Pusch_sinr_hist") RadioRepPerServCell.PuschSinrHist puschSinrHist) {
+                this.cqi = cqi;
+                this.riHist = riHist;
+                this.pucchSinrHist = pucchSinrHist;
+                this.puschSinrHist = puschSinrHist;
+            }
+
+            public Cqi getCqi() {
+                return cqi;
+            }
+
+            public void setCqi(Cqi cqi) {
+                this.cqi = cqi;
+            }
+
+            public RadioRepPerServCell.RiHist getRiHist() {
+                return riHist;
+            }
+
+            public void setRiHist(RadioRepPerServCell.RiHist riHist) {
+                this.riHist = riHist;
+            }
+
+            public RadioRepPerServCell.PucchSinrHist getPucchSinrHist() {
+                return pucchSinrHist;
+            }
+
+            public void setPucchSinrHist(RadioRepPerServCell.PucchSinrHist pucchSinrHist) {
+                this.pucchSinrHist = pucchSinrHist;
+            }
+
+            public RadioRepPerServCell.PuschSinrHist getPuschSinrHist() {
+                return puschSinrHist;
+            }
+
+            public void setPuschSinrHist(RadioRepPerServCell.PuschSinrHist puschSinrHist) {
+                this.puschSinrHist = puschSinrHist;
+            }
+
+            /**
+             * Get time since last update.
+             *
+             * @return long Time
+             */
+            public long getTimesincelastupdate() {
+                return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
+            }
+
+            public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
+                this.timesincelastupdate = timesincelastupdate;
+            }
+
+            @Override
+            public String toString() {
+                return "RadioReport{" +
+                        "cqi=" + cqi +
+                        ", riHist=" + riHist +
+                        ", pucchSinrHist=" + pucchSinrHist +
+                        ", puschSinrHist=" + puschSinrHist +
+                        ", timestamp=" + getTimesincelastupdate() +
+                        '}';
+            }
+
+            @JsonPropertyOrder({
+                    "Hist",
+                    "Mode",
+                    "Mean",
+                    "timestamp"
+            })
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class Cqi {
+                @JsonProperty("Hist")
+                RadioRepPerServCell.CqiHist hist;
+                @JsonProperty("Mode")
+                double mode;
+                @JsonProperty("Mean")
+                double mean;
+
+                public Cqi() {
+                }
+
+                @JsonCreator
+                public Cqi(@JsonProperty("Hist") RadioRepPerServCell.CqiHist hist,
+                           @JsonProperty("Mode") double mode,
+                           @JsonProperty("Mean") double mean) {
+                    this.hist = hist;
+                    this.mode = mode;
+                    this.mean = mean;
+                }
+
+                /**
+                 * Get CQIHist.
+                 *
+                 * @return CqiHist
+                 */
+                public RadioRepPerServCell.CqiHist getHist() {
+                    return hist;
+                }
+
+                /**
+                 * Get CQIHist.
+                 *
+                 * @param hist CqiHist
+                 */
+                public void setHist(RadioRepPerServCell.CqiHist hist) {
+                    this.hist = hist;
+                }
+
+                /**
+                 * Get mode.
+                 *
+                 * @return double mode
+                 */
+                public double getMode() {
+                    return mode;
+                }
+
+                /**
+                 * Set mode.
+                 *
+                 * @param mode mode
+                 */
+                public void setMode(double mode) {
+                    this.mode = mode;
+                }
+
+                /**
+                 * Get mean.
+                 *
+                 * @return double mean
+                 */
+                public double getMean() {
+                    return mean;
+                }
+
+                /**
+                 * Set mean.
+                 *
+                 * @param mean mean
+                 */
+                public void setMean(double mean) {
+                    this.mean = mean;
+                }
+
+                @Override
+                public String toString() {
+                    return "Cqi{" +
+                            "hist=" + hist +
+                            ", mode=" + mode +
+                            ", mean=" + mean +
+                            '}';
+                }
+            }
+        }
+
+        @JsonPropertyOrder({
+                "QCI",
+                "ResourceUsage",
+                "MCS",
+                "Num_Sched_TTIs",
+                "DL_rank_stats",
+                "timestamp"
+        })
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class SchedMeasReport {
+            @JsonProperty("QCI")
+            SchedMeasRepPerServCell.QciVals qci;
+            @JsonProperty("ResourceUsage")
+            ResourceUsage resourceUsage = new ResourceUsage();
+            @JsonProperty("MCS")
+            Mcs mcs = new Mcs();
+            @JsonProperty("Num_Sched_TTIs")
+            NumSchedTtis numSchedTtis = new NumSchedTtis();
+            @JsonProperty("DL_rank_stats")
+            DlRankStats dlRankStats = new DlRankStats();
+            @JsonProperty("timestamp")
+            WallClockTimestamp timesincelastupdate = new WallClockTimestamp();
+
+            public SchedMeasReport() {
+            }
+
+            @JsonCreator
+            public SchedMeasReport(
+                    @JsonProperty("QCI") SchedMeasRepPerServCell.QciVals qci,
+                    @JsonProperty("ResourceUsage") ResourceUsage resourceUsage,
+                    @JsonProperty("MCS") Mcs mcs,
+                    @JsonProperty("Num_Sched_TTIs") NumSchedTtis numSchedTtis,
+                    @JsonProperty("DL_rank_stats") DlRankStats dlRankStats
+            ) {
+                this.qci = qci;
+                this.resourceUsage = resourceUsage;
+                this.mcs = mcs;
+                this.numSchedTtis = numSchedTtis;
+                this.dlRankStats = dlRankStats;
+            }
+
+            public SchedMeasRepPerServCell.QciVals getQci() {
+                return qci;
+            }
+
+            public void setQci(SchedMeasRepPerServCell.QciVals qci) {
+                this.qci = qci;
+            }
+
+            public ResourceUsage getResourceUsage() {
+                return resourceUsage;
+            }
+
+            public void setResourceUsage(ResourceUsage resourceUsage) {
+                this.resourceUsage = resourceUsage;
+            }
+
+            public Mcs getMcs() {
+                return mcs;
+            }
+
+            public void setMcs(Mcs mcs) {
+                this.mcs = mcs;
+            }
+
+            public NumSchedTtis getNumSchedTtis() {
+                return numSchedTtis;
+            }
+
+            public void setNumSchedTtis(NumSchedTtis numSchedTtis) {
+                this.numSchedTtis = numSchedTtis;
+            }
+
+            public DlRankStats getDlRankStats() {
+                return dlRankStats;
+            }
+
+            public void setDlRankStats(DlRankStats dlRankStats) {
+                this.dlRankStats = dlRankStats;
+            }
+
+            public long getTimesincelastupdate() {
+                return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
+            }
+
+            public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
+                this.timesincelastupdate = timesincelastupdate;
+            }
+
+            @Override
+            public String toString() {
+                return "SchedMeasReport{" +
+                        "qci=" + qci +
+                        ", resourceUsage=" + resourceUsage +
+                        ", mcs=" + mcs +
+                        ", numSchedTtis=" + numSchedTtis +
+                        ", dlRankStats=" + dlRankStats +
+                        ", timesincelastupdate=" + getTimesincelastupdate() +
+                        '}';
+            }
+
+            @JsonPropertyOrder({
+                    "dl",
+                    "ul"
+            })
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class ResourceUsage {
+                @JsonProperty("dl")
+                PRBUsage.PrbUsageDl dl;
+                @JsonProperty("ul")
+                PRBUsage.PrbUsageUl ul;
+
+                public ResourceUsage() {
+                }
+
+                @JsonCreator
+                public ResourceUsage(@JsonProperty("dl") PRBUsage.PrbUsageDl dl,
+                                     @JsonProperty("ul") PRBUsage.PrbUsageUl ul) {
+                    this.dl = dl;
+                    this.ul = ul;
+                }
+
+                /**
+                 * Get DL.
+                 *
+                 * @return Dl
+                 */
+                public PRBUsage.PrbUsageDl getDl() {
+                    return dl;
+                }
+
+                /**
+                 * Set DL.
+                 *
+                 * @param dl DL
+                 */
+                public void setDl(PRBUsage.PrbUsageDl dl) {
+                    this.dl = dl;
+                }
+
+                /**
+                 * Get UL.
+                 *
+                 * @return Ul
+                 */
+                public PRBUsage.PrbUsageUl getUl() {
+                    return ul;
+                }
+
+                /**
+                 * Set UL.
+                 *
+                 * @param ul Ul
+                 */
+                public void setUl(PRBUsage.PrbUsageUl ul) {
+                    this.ul = ul;
+                }
+
+                @Override
+                public String toString() {
+                    return "ResourceUsage{" +
+                            "dl=" + dl +
+                            ", ul=" + ul +
+                            '}';
+                }
+            }
+
+            @JsonPropertyOrder({
+                    "dl",
+                    "ul"
+            })
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class Mcs {
+                SchedMeasRepPerServCell.McsDl dl;
+                SchedMeasRepPerServCell.McsUl ul;
+
+                public Mcs() {
+                }
+
+                @JsonCreator
+                public Mcs(@JsonProperty("dl") SchedMeasRepPerServCell.McsDl dl,
+                           @JsonProperty("ul") SchedMeasRepPerServCell.McsUl ul) {
+                    this.dl = dl;
+                    this.ul = ul;
+                }
+
+                /**
+                 * Get DL.
+                 *
+                 * @return Dl
+                 */
+                public SchedMeasRepPerServCell.McsDl getDl() {
+                    return dl;
+                }
+
+                /**
+                 * Set DL.
+                 *
+                 * @param dl DL
+                 */
+                public void setDl(SchedMeasRepPerServCell.McsDl dl) {
+                    this.dl = dl;
+                }
+
+                /**
+                 * Get UL.
+                 *
+                 * @return Ul
+                 */
+                public SchedMeasRepPerServCell.McsUl getUl() {
+                    return ul;
+                }
+
+                /**
+                 * Set UL.
+                 *
+                 * @param ul Ul
+                 */
+                public void setUl(SchedMeasRepPerServCell.McsUl ul) {
+                    this.ul = ul;
+                }
+
+                @Override
+                public String toString() {
+                    return "mcs{" +
+                            "dl=" + dl +
+                            ", ul=" + ul +
+                            '}';
+                }
+            }
+
+            @JsonPropertyOrder({
+                    "dl",
+                    "ul"
+            })
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class NumSchedTtis {
+                @JsonProperty("dl")
+                SchedMeasRepPerServCell.NumSchedTtisDl dl;
+                @JsonProperty("ul")
+                SchedMeasRepPerServCell.NumSchedTtisUl ul;
+
+                public NumSchedTtis() {
+                }
+
+                @JsonCreator
+                public NumSchedTtis(@JsonProperty("dl") SchedMeasRepPerServCell.NumSchedTtisDl dl,
+                                    @JsonProperty("ul") SchedMeasRepPerServCell.NumSchedTtisUl ul) {
+                    this.dl = dl;
+                    this.ul = ul;
+                }
+
+                public SchedMeasRepPerServCell.NumSchedTtisDl getDl() {
+                    return dl;
+                }
+
+                public void setDl(SchedMeasRepPerServCell.NumSchedTtisDl dl) {
+                    this.dl = dl;
+                }
+
+                public SchedMeasRepPerServCell.NumSchedTtisUl getUl() {
+                    return ul;
+                }
+
+                public void setUl(SchedMeasRepPerServCell.NumSchedTtisUl ul) {
+                    this.ul = ul;
+                }
+
+                @Override
+                public String toString() {
+                    return "NumSchedTtis{" +
+                            "dl=" + dl +
+                            ", ul=" + ul +
+                            '}';
+                }
+            }
+
+            @JsonPropertyOrder({
+                    "Rank-1",
+                    "Rank-2"
+            })
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class DlRankStats {
+                @JsonProperty("Rank-1")
+                SchedMeasRepPerServCell.RankDl1 rankDl1;
+                @JsonProperty("Rank-2")
+                SchedMeasRepPerServCell.RankDl2 rankDl2;
+
+                public DlRankStats() {
+                }
+
+                @JsonCreator
+                public DlRankStats(@JsonProperty("Rank-1") SchedMeasRepPerServCell.RankDl1 rankDl1,
+                                   @JsonProperty("Rank-2") SchedMeasRepPerServCell.RankDl2 rankDl2) {
+                    this.rankDl1 = rankDl1;
+                    this.rankDl2 = rankDl2;
+                }
+
+                public SchedMeasRepPerServCell.RankDl1 getRankDl1() {
+                    return rankDl1;
+                }
+
+                public void setRankDl1(SchedMeasRepPerServCell.RankDl1 rankDl1) {
+                    this.rankDl1 = rankDl1;
+                }
+
+                public SchedMeasRepPerServCell.RankDl2 getRankDl2() {
+                    return rankDl2;
+                }
+
+                public void setRankDl2(SchedMeasRepPerServCell.RankDl2 rankDl2) {
+                    this.rankDl2 = rankDl2;
+                }
+
+                @Override
+                public String toString() {
+                    return "DlRankStats{" +
+                            "rankDl1=" + rankDl1 +
+                            ", rankDl2=" + rankDl2 +
+                            '}';
+                }
+            }
+        }
+
+        @JsonPropertyOrder({
+                "QCI",
+                "PDCPThroughput",
+                "Data_vol",
+                "Pkt_delay_dl",
+                "Pkt_discard_rate_dl",
+                "Pkt_loss_rate",
+                "timestamp"
+        })
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class PdcpMeasReport {
+            @JsonProperty("QCI")
+            PDCPMeasReportPerUe.QciVals qci = new PDCPMeasReportPerUe.QciVals();
+            @JsonProperty("PDCPThroughput")
+            PdcpThroughput pdcpThroughput = new PdcpThroughput();
+            @JsonProperty("Data_vol")
+            DataVol dataVol = new DataVol();
+            @JsonProperty("Pkt_delay_dl")
+            PDCPMeasReportPerUe.PktDelayDl pktDelayDl;
+            @JsonProperty("Pkt_discard_rate_dl")
+            PDCPMeasReportPerUe.PktDiscardRateDl pktDiscardRateDl;
+            @JsonProperty("Pkt_loss_rate")
+            PktLossRate pktLossRate = new PktLossRate();
+            @JsonProperty("timestamp")
+            WallClockTimestamp timesincelastupdate = new WallClockTimestamp();
+
+            public PdcpMeasReport() {
+            }
+
+            @JsonCreator
+            public PdcpMeasReport(
+                    @JsonProperty("QCI") PDCPMeasReportPerUe.QciVals qci,
+                    @JsonProperty("PDCPThroughput") PdcpThroughput pdcpThroughput,
+                    @JsonProperty("Data_vol") DataVol dataVol,
+                    @JsonProperty("Pkt_delay_dl") PDCPMeasReportPerUe.PktDelayDl pktDelayDl,
+                    @JsonProperty("Pkt_discard_rate_dl") PDCPMeasReportPerUe.PktDiscardRateDl pktDiscardRateDl,
+                    @JsonProperty("Pkt_loss_rate") PktLossRate pktLossRate
+            ) {
+                this.qci = qci;
+                this.pdcpThroughput = pdcpThroughput;
+                this.dataVol = dataVol;
+                this.pktDelayDl = pktDelayDl;
+                this.pktDiscardRateDl = pktDiscardRateDl;
+                this.pktLossRate = pktLossRate;
+            }
+
+            public PDCPMeasReportPerUe.QciVals getQci() {
+                return qci;
+            }
+
+            public void setQci(PDCPMeasReportPerUe.QciVals qci) {
+                this.qci = qci;
+            }
+
+            public PdcpThroughput getPdcpThroughput() {
+                return pdcpThroughput;
+            }
+
+            public void setPdcpThroughput(PdcpThroughput pdcpThroughput) {
+                this.pdcpThroughput = pdcpThroughput;
+            }
+
+            public DataVol getDataVol() {
+                return dataVol;
+            }
+
+            public void setDataVol(DataVol dataVol) {
+                this.dataVol = dataVol;
+            }
+
+            public PDCPMeasReportPerUe.PktDelayDl getPktDelayDl() {
+                return pktDelayDl;
+            }
+
+            public void setPktDelayDl(PDCPMeasReportPerUe.PktDelayDl pktDelayDl) {
+                this.pktDelayDl = pktDelayDl;
+            }
+
+            public PDCPMeasReportPerUe.PktDiscardRateDl getPktDiscardRateDl() {
+                return pktDiscardRateDl;
+            }
+
+            public void setPktDiscardRateDl(PDCPMeasReportPerUe.PktDiscardRateDl pktDiscardRateDl) {
+                this.pktDiscardRateDl = pktDiscardRateDl;
+            }
+
+            public PktLossRate getPktLossRate() {
+                return pktLossRate;
+            }
+
+            public void setPktLossRate(PktLossRate pktLossRate) {
+                this.pktLossRate = pktLossRate;
+            }
+
+            public long getTimesincelastupdate() {
+                return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
+            }
+
+            public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
+                this.timesincelastupdate = timesincelastupdate;
+            }
+
+            @Override
+            public String toString() {
+                return "PdcpMeasReport{" +
+                        "qci=" + qci +
+                        ", pdcpThroughput=" + pdcpThroughput +
+                        ", dataVol=" + dataVol +
+                        ", pktDelayDl=" + pktDelayDl +
+                        ", pktDiscardRateDl=" + pktDiscardRateDl +
+                        ", pktLossRate=" + pktLossRate +
+                        ", timesincelastupdate=" + getTimesincelastupdate() +
+                        '}';
+            }
+
+            @JsonPropertyOrder({
+                    "dl",
+                    "ul"
+            })
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class PdcpThroughput {
+                @JsonProperty("dl")
+                private PDCPMeasReportPerUe.ThroughputDl dl;
+                @JsonProperty("ul")
+                private PDCPMeasReportPerUe.ThroughputUl ul;
+
+                public PdcpThroughput() {
+                }
+
+                @JsonCreator
+                public PdcpThroughput(@JsonProperty("dl") PDCPMeasReportPerUe.ThroughputDl dl,
+                                      @JsonProperty("ul") PDCPMeasReportPerUe.ThroughputUl ul) {
+                    this.dl = dl;
+                    this.ul = ul;
+                }
+
+                /**
+                 * Get DL.
+                 *
+                 * @return Dl
+                 */
+                public PDCPMeasReportPerUe.ThroughputDl getDl() {
+                    return dl;
+                }
+
+                /**
+                 * Set DL.
+                 *
+                 * @param dl DL
+                 */
+                public void setDl(PDCPMeasReportPerUe.ThroughputDl dl) {
+                    this.dl = dl;
+                }
+
+                /**
+                 * Get UL.
+                 *
+                 * @return Ul
+                 */
+                public PDCPMeasReportPerUe.ThroughputUl getUl() {
+                    return ul;
+                }
+
+                /**
+                 * Set UL.
+                 *
+                 * @param ul Ul
+                 */
+                public void setUl(PDCPMeasReportPerUe.ThroughputUl ul) {
+                    this.ul = ul;
+                }
+
+                @Override
+                public String
+                toString() {
+                    return "PdcpThroughput{" +
+                            "dl=" + dl +
+                            ", ul=" + ul +
+                            '}';
+                }
+            }
+
+            @JsonPropertyOrder({
+                    "dl",
+                    "ul"
+            })
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class DataVol {
+                @JsonProperty("dl")
+                private PDCPMeasReportPerUe.DataVolDl dl;
+                @JsonProperty("ul")
+                private PDCPMeasReportPerUe.DataVolUl ul;
+
+                public DataVol() {
+                }
+
+                @JsonCreator
+                public DataVol(@JsonProperty("dl") PDCPMeasReportPerUe.DataVolDl dl,
+                               @JsonProperty("ul") PDCPMeasReportPerUe.DataVolUl ul) {
+                    this.dl = dl;
+                    this.ul = ul;
+                }
+
+                /**
+                 * Get DL.
+                 *
+                 * @return Dl
+                 */
+                public PDCPMeasReportPerUe.DataVolDl getDl() {
+                    return dl;
+                }
+
+                /**
+                 * Set DL.
+                 *
+                 * @param dl DL
+                 */
+                public void setDl(PDCPMeasReportPerUe.DataVolDl dl) {
+                    this.dl = dl;
+                }
+
+                /**
+                 * Get UL.
+                 *
+                 * @return Ul
+                 */
+                public PDCPMeasReportPerUe.DataVolUl getUl() {
+                    return ul;
+                }
+
+                /**
+                 * Set UL.
+                 *
+                 * @param ul Ul
+                 */
+                public void setUl(PDCPMeasReportPerUe.DataVolUl ul) {
+                    this.ul = ul;
+                }
+
+                @Override
+                public String
+                toString() {
+                    return "PdcpThroughput{" +
+                            "dl=" + dl +
+                            ", ul=" + ul +
+                            '}';
+                }
+            }
+
+            @JsonPropertyOrder({
+                    "dl",
+                    "ul"
+            })
+            @JsonIgnoreProperties(ignoreUnknown = true)
+            public static class PktLossRate {
+                @JsonProperty("dl")
+                PDCPMeasReportPerUe.PktLossRateDl dl;
+                @JsonProperty("ul")
+                PDCPMeasReportPerUe.PktLossRateUl ul;
+
+                public PktLossRate() {
+                }
+
+                @JsonCreator
+                public PktLossRate(@JsonProperty("dl") PDCPMeasReportPerUe.PktLossRateDl dl,
+                                   @JsonProperty("ul") PDCPMeasReportPerUe.PktLossRateUl ul) {
+                    this.dl = dl;
+                    this.ul = ul;
+                }
+
+                /**
+                 * Get DL.
+                 *
+                 * @return Dl
+                 */
+                public PDCPMeasReportPerUe.PktLossRateDl getDl() {
+                    return dl;
+                }
+
+                /**
+                 * Set DL.
+                 *
+                 * @param dl DL
+                 */
+                public void setDl(PDCPMeasReportPerUe.PktLossRateDl dl) {
+                    this.dl = dl;
+                }
+
+                /**
+                 * Get UL.
+                 *
+                 * @return Ul
+                 */
+                public PDCPMeasReportPerUe.PktLossRateUl getUl() {
+                    return ul;
+                }
+
+                /**
+                 * Set UL.
+                 *
+                 * @param ul Ul
+                 */
+                public void setUl(PDCPMeasReportPerUe.PktLossRateUl ul) {
+                    this.ul = ul;
+                }
+
+                @Override
+                public String toString() {
+                    return "PdcpPacketdelay{" +
+                            "dl=" + dl +
+                            ", ul=" + ul +
+                            '}';
+                }
+            }
+        }
+    }
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibSlice.java b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibSlice.java
new file mode 100644
index 0000000..f8cb470
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibSlice.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xran.impl.entities;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import java.util.Set;
+
+/**
+ * Created by dimitris on 7/22/17.
+ */
+@JsonPropertyOrder({
+        "Identifier",
+        "Description",
+        "UE-IDs",
+        "Links",
+        "ValidityPeriod",
+        "DesiredKPIs",
+        "DeliveredKPIs",
+        "RRMConfiguration"
+})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RnibSlice {
+    @JsonProperty("Identifier")
+    private long sliceId;
+    @JsonProperty("Description")
+    private String description;
+    @JsonProperty("UE-IDs")
+    private Set<Long> ueID;
+    @JsonProperty("Links")
+    private Set<RnibLink> links;
+    @JsonProperty("ValidityPeriod")
+    private long validityPeriod;
+    @JsonProperty("DesiredKPIs")
+    private Object desiredKpis;
+    @JsonProperty("DeliveredKPIs")
+    private Object deliveredKpis;
+    @JsonProperty("RRMConfiguration")
+    private Object rrmConfiguration;
+
+    public long getSliceId() {
+        return sliceId;
+    }
+
+    public void setSliceId(long sliceId) {
+        this.sliceId = sliceId;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Set<Long> getUeID() {
+        return ueID;
+    }
+
+    public void setUeID(Set<Long> ueID) {
+        this.ueID = ueID;
+    }
+
+    public Set<RnibLink> getLinks() {
+        return links;
+    }
+
+    public void setLinks(Set<RnibLink> links) {
+        this.links = links;
+    }
+
+    public long getValidityPeriod() {
+        return validityPeriod;
+    }
+
+    public void setValidityPeriod(long validityPeriod) {
+        this.validityPeriod = validityPeriod;
+    }
+
+    public Object getDesiredKpis() {
+        return desiredKpis;
+    }
+
+    public void setDesiredKpis(Object desiredKpis) {
+        this.desiredKpis = desiredKpis;
+    }
+
+    public Object getDeliveredKpis() {
+        return deliveredKpis;
+    }
+
+    public void setDeliveredKpis(Object deliveredKpis) {
+        this.deliveredKpis = deliveredKpis;
+    }
+
+    public Object getRrmConfiguration() {
+        return rrmConfiguration;
+    }
+
+    public void setRrmConfiguration(Object rrmConfiguration) {
+        this.rrmConfiguration = rrmConfiguration;
+    }
+}
diff --git a/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibUe.java b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibUe.java
new file mode 100644
index 0000000..714182c
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/RnibUe.java
@@ -0,0 +1,392 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xran.impl.entities;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.HostId;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ENBUES1APID;
+import org.onosproject.xran.asn1lib.api.MMEUES1APID;
+import org.onosproject.xran.asn1lib.pdu.RRCMeasConfig;
+import org.onosproject.xran.asn1lib.pdu.UECapabilityInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Objects;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.onosproject.net.HostId.hostId;
+
+/**
+ * R-NIB UE and its properties.
+ */
+@JsonPropertyOrder({
+        "Identifier",
+        "Context-IDs",
+        "RAN-ID",
+        "State",
+        "Capability",
+        "MeasurementConfiguration"
+})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RnibUe {
+    @JsonIgnore
+    private static final Logger log =
+            LoggerFactory.getLogger(RnibUe.class);
+
+    @JsonProperty("Identifier")
+    private Long id;
+    @JsonProperty("Context-IDs")
+    private ContextIds contextIds = new ContextIds();
+    @JsonProperty("RAN-ID")
+    private CRNTI crnti;
+    @JsonProperty("State")
+    private State state = State.ACTIVE;
+    @JsonProperty("Capability")
+    private UECapabilityInfo capability;
+    @JsonProperty("MeasurementConfiguration")
+    private RRCMeasConfig measConfig;
+    @JsonIgnore
+    private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+
+    /**
+     * Convert Host ID to UE ID.
+     *
+     * @param hostId hostID
+     * @return Long UE ID
+     */
+    public static Long hostIdtoUEId(HostId hostId) {
+        String mac = hostId.mac().toString();
+        mac = mac.replace(":", "");
+        return Long.parseLong(mac, 16);
+    }
+
+    /**
+     * Get timer.
+     *
+     * @return Timer
+     */
+    public ScheduledExecutorService getExecutor() {
+        return executor;
+    }
+
+    /**
+     * Set executor.
+     *
+     * @param executor executor
+     */
+    public void setExecutor(ScheduledExecutorService executor) {
+        this.executor.shutdown();
+        this.executor = executor;
+    }
+
+    /**
+     * Get CRNTI.
+     *
+     * @return CRNTI
+     */
+    public CRNTI getCrnti() {
+        return crnti;
+    }
+
+    /**
+     * Set CRNTI.
+     *
+     * @param crnti CRNTI
+     */
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
+
+    /**
+     * Get Host ID.
+     *
+     * @return HostId
+     */
+    @JsonIgnore
+    public HostId getHostId() {
+        try {
+            String text = Long.toHexString(this.id),
+                    res = "";
+            int charsLeft = 12 - text.length();
+            if (charsLeft > 0) {
+                res += Stream.generate(() -> "0").limit(charsLeft).collect(Collectors.joining(""));
+            } else if (charsLeft < 0) {
+                return null;
+            }
+            res += text;
+
+            String insert = ":";
+            int period = 2;
+
+            StringBuilder builder = new StringBuilder(
+                    res.length() + insert.length() * (res.length() / period) + 1);
+
+            int index = 0;
+            String prefix = "";
+            while (index < res.length()) {
+                // Don't putPrimaryLink the insert in the very first iteration.
+                // This is easier than appending it *after* each substring
+                builder.append(prefix);
+                prefix = insert;
+                builder.append(res.substring(index,
+                        Math.min(index + period, res.length())));
+                index += period;
+            }
+
+            return hostId(MacAddress.valueOf(builder.toString()));
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * Get RXMeasConfig Report.
+     *
+     * @return RXSigMeasConfig
+     */
+    public RRCMeasConfig getMeasConfig() {
+        return measConfig;
+    }
+
+    /**
+     * Set RXMeasConfig Report.
+     *
+     * @param measConfig RXSigMeasConfig
+     */
+    public void setMeasConfig(RRCMeasConfig measConfig) {
+        this.measConfig = measConfig;
+    }
+
+    /**
+     * Get UE Capability Info.
+     *
+     * @return UECapabilityInfo
+     */
+    public UECapabilityInfo getCapability() {
+        return capability;
+    }
+
+    /**
+     * Set UE Capability Info.
+     *
+     * @param capability UECapabilityInfo
+     */
+    public void setCapability(UECapabilityInfo capability) {
+        this.capability = capability;
+    }
+
+    /**
+     * Get State.
+     *
+     * @return State
+     */
+    public State getState() {
+        return state;
+    }
+
+    /**
+     * Set State.
+     *
+     * @param state State
+     */
+    public void setState(State state) {
+        this.state = state;
+    }
+
+    /**
+     * Get UE ID.
+     *
+     * @return Long UE ID
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * Set UE ID.
+     *
+     * @param id Long UE ID
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public ContextIds getContextIds() {
+        return contextIds;
+    }
+
+    public void setContextIds(ContextIds contextIds) {
+        this.contextIds = contextIds;
+    }
+
+    @Override
+    public String toString() {
+        return "RnibUe{" +
+                "id=" + id +
+                ", contextIds=" + contextIds +
+                ", crnti=" + crnti +
+                ", state=" + state +
+                ", capability=" + capability +
+                ", measConfig=" + measConfig +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        RnibUe rnibUe = (RnibUe) o;
+        return Objects.equals(id, rnibUe.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id);
+    }
+
+
+    /**
+     * Enum of State of UE.
+     */
+    public enum State {
+        ACTIVE {
+            @Override
+            public String toString() {
+                return "ACTIVE";
+            }
+        },
+        IDLE {
+            @Override
+            public String toString() {
+                return "IDLE";
+            }
+        }
+    }
+
+    /**
+     * Context IDs.
+     */
+    @JsonPropertyOrder({
+            "IMSI",
+            "ENBUES1APID",
+            "MMEUES1APID",
+    })
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class ContextIds {
+        @JsonProperty("IMSI")
+        private String imsi = "";
+        @JsonProperty("ENBUES1APID")
+        private ENBUES1APID enbS1apId;
+        @JsonProperty("MMEUES1APID")
+        private MMEUES1APID mmeS1apId;
+
+        public ContextIds() {
+        }
+
+        @JsonCreator
+        public ContextIds(
+                @JsonProperty("ENBUES1APID") ENBUES1APID enbS1apId,
+                @JsonProperty("MMEUES1APID") MMEUES1APID mmeS1apId
+        ) {
+            this.enbS1apId = enbS1apId;
+            this.mmeS1apId = mmeS1apId;
+        }
+
+        public ContextIds(String imsi, ENBUES1APID enbS1apId, MMEUES1APID mmeS1apId) {
+            this.imsi = imsi;
+            this.enbS1apId = enbS1apId;
+            this.mmeS1apId = mmeS1apId;
+        }
+
+        /**
+         * Get MMEUES1APID.
+         *
+         * @return MMEUES1APID
+         */
+        public MMEUES1APID getMmeS1apId() {
+            return mmeS1apId;
+        }
+
+        /**
+         * Set MMEUES1APID.
+         *
+         * @param mmeS1apId MMEUES1APID
+         */
+        public void setMmeS1apId(MMEUES1APID mmeS1apId) {
+            this.mmeS1apId = mmeS1apId;
+        }
+
+        /**
+         * Get ENBUES1APID.
+         *
+         * @return ENBUES1APID
+         */
+        public ENBUES1APID getEnbS1apId() {
+            return enbS1apId;
+        }
+
+        /**
+         * Set ENBUES1APID.
+         *
+         * @param enbS1apId ENBUES1APID
+         */
+        public void setEnbS1apId(ENBUES1APID enbS1apId) {
+            this.enbS1apId = enbS1apId;
+        }
+
+        /**
+         * Get IMSI.
+         *
+         * @return IMSI
+         */
+        public String getImsi() {
+            return imsi;
+        }
+
+        /**
+         * Set IMSI.
+         *
+         * @param imsi IMSI
+         */
+        public void setImsi(String imsi) {
+            this.imsi = imsi;
+        }
+
+        @Override
+        public String toString() {
+            return "ContextIds{" +
+                    "imsi='" + imsi + '\'' +
+                    ", enbS1apId=" + enbS1apId +
+                    ", mmeS1apId=" + mmeS1apId +
+                    '}';
+        }
+    }
+}
diff --git a/src/main/java/org.onosproject.xran/identifiers/package-info.java b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/package-info.java
similarity index 86%
rename from src/main/java/org.onosproject.xran/identifiers/package-info.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/entities/package-info.java
index d375057..0817620 100644
--- a/src/main/java/org.onosproject.xran/identifiers/package-info.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/entities/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,4 +17,4 @@
 /**
  * Created by dimitris on 7/22/17.
  */
-package org.onosproject.xran.identifiers;
\ No newline at end of file
+package org.onosproject.xran.impl.entities;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/identifiers/ContextUpdateHandler.java b/apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/ContextUpdateHandler.java
similarity index 89%
rename from src/main/java/org.onosproject.xran/identifiers/ContextUpdateHandler.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/ContextUpdateHandler.java
index 4212044..2209825 100644
--- a/src/main/java/org.onosproject.xran/identifiers/ContextUpdateHandler.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/ContextUpdateHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.identifiers;
+package org.onosproject.xran.impl.identifiers;
 
-import org.onosproject.xran.codecs.pdu.HOComplete;
-import org.onosproject.xran.codecs.pdu.UEAdmissionStatus;
-import org.onosproject.xran.codecs.pdu.UEContextUpdate;
+import org.onosproject.xran.asn1lib.pdu.HOComplete;
+import org.onosproject.xran.asn1lib.pdu.UEAdmissionStatus;
+import org.onosproject.xran.asn1lib.pdu.UEContextUpdate;
 
 /**
  * Class to handle UE Context Update packet.
@@ -91,6 +91,10 @@
         }
     }
 
+    /**
+     * Reset the values of the variables.
+     *
+     */
     public void reset() {
         synchronized (this) {
             this.hoComplete = null;
diff --git a/src/main/java/org.onosproject.xran/identifiers/EcgiCrntiPair.java b/apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/EcgiCrntiPair.java
similarity index 88%
rename from src/main/java/org.onosproject.xran/identifiers/EcgiCrntiPair.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/EcgiCrntiPair.java
index f12f62a..7e78bfa 100644
--- a/src/main/java/org.onosproject.xran/identifiers/EcgiCrntiPair.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/EcgiCrntiPair.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.identifiers;
+package org.onosproject.xran.impl.identifiers;
 
 import com.google.common.base.Objects;
 import javafx.util.Pair;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
 
 /**
  * Class to maintain pair of ECGI and CRNTI.
diff --git a/src/main/java/org.onosproject.xran/identifiers/LinkId.java b/apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/LinkId.java
similarity index 93%
rename from src/main/java/org.onosproject.xran/identifiers/LinkId.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/LinkId.java
index 7bb94f7..a439461 100644
--- a/src/main/java/org.onosproject.xran/identifiers/LinkId.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/LinkId.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.identifiers;
+package org.onosproject.xran.impl.identifiers;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibUe;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.impl.entities.RnibCell;
+import org.onosproject.xran.impl.entities.RnibUe;
 
 /**
  * Class for LinkId.
diff --git a/src/main/java/org.onosproject.xran/identifiers/package-info.java b/apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/package-info.java
similarity index 85%
copy from src/main/java/org.onosproject.xran/identifiers/package-info.java
copy to apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/package-info.java
index d375057..f5227c7 100644
--- a/src/main/java/org.onosproject.xran/identifiers/package-info.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/identifiers/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,4 +17,4 @@
 /**
  * Created by dimitris on 7/22/17.
  */
-package org.onosproject.xran.identifiers;
\ No newline at end of file
+package org.onosproject.xran.impl.identifiers;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/impl/package-info.java b/apps/xran/src/main/java/org.onosproject.xran/impl/package-info.java
similarity index 92%
rename from src/main/java/org.onosproject.xran/impl/package-info.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/package-info.java
index 83cd67e..66ce0b7 100644
--- a/src/main/java/org.onosproject.xran/impl/package-info.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/main/java/org.onosproject.xran/providers/CellDeviceProvider.java b/apps/xran/src/main/java/org.onosproject.xran/impl/providers/CellDeviceProvider.java
similarity index 91%
rename from src/main/java/org.onosproject.xran/providers/CellDeviceProvider.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/providers/CellDeviceProvider.java
index a0a5809..33b49d6 100644
--- a/src/main/java/org.onosproject.xran/providers/CellDeviceProvider.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/providers/CellDeviceProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.providers;
+package org.onosproject.xran.impl.providers;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -36,12 +36,13 @@
 import org.onosproject.net.device.DeviceProviderService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.xran.controller.XranController;
-import org.onosproject.xran.entities.RnibCell;
+import org.onosproject.xran.XranService;
+import org.onosproject.xran.XranDeviceListener;
+import org.onosproject.xran.impl.entities.RnibCell;
 import org.slf4j.Logger;
 
 import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.xran.entities.RnibCell.uri;
+import static org.onosproject.xran.impl.entities.RnibCell.uri;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -55,7 +56,7 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceProviderRegistry providerRegistry;
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected XranController controller;
+    protected XranService controller;
     private DeviceProviderService providerService;
 
     public CellDeviceProvider() {
@@ -121,6 +122,7 @@
                     .set(AnnotationKeys.PROTOCOL, "SCTP")
                     .set(AnnotationKeys.CHANNEL_ID, "xxx")
                     .set(AnnotationKeys.MANAGEMENT_ADDRESS, "127.0.0.1")
+                    .set(AnnotationKeys.UI_TYPE, "basestation")
                     .build();
 
             DeviceDescription descBase =
diff --git a/src/main/java/org.onosproject.xran/providers/UeProvider.java b/apps/xran/src/main/java/org.onosproject.xran/impl/providers/UeProvider.java
similarity index 90%
rename from src/main/java/org.onosproject.xran/providers/UeProvider.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/providers/UeProvider.java
index e84deb2..e618e3b 100644
--- a/src/main/java/org.onosproject.xran/providers/UeProvider.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/providers/UeProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.providers;
+package org.onosproject.xran.impl.providers;
 
 import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
@@ -36,15 +36,16 @@
 import org.onosproject.net.host.HostProviderService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.controller.XranController;
-import org.onosproject.xran.entities.RnibUe;
+import org.onosproject.xran.XranService;
+import org.onosproject.xran.XranHostListener;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.impl.entities.RnibUe;
 import org.slf4j.Logger;
 
 import java.util.Set;
 
 import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.xran.entities.RnibCell.uri;
+import static org.onosproject.xran.impl.entities.RnibCell.uri;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -58,7 +59,7 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private HostProviderRegistry providerRegistry;
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private XranController controller;
+    private XranService controller;
     private HostProviderService providerService;
 
     public UeProvider() {
@@ -112,6 +113,7 @@
 
                 SparseAnnotations annotations = DefaultAnnotations.builder()
                         .set(AnnotationKeys.NAME, "UE " + ue.getId())
+                        .set(AnnotationKeys.UI_TYPE, "mobile")
                         .build();
 
                 // Host ID is calculated from UE ID with some hacky function to represent a MAC address.
diff --git a/src/main/java/org.onosproject.xran/providers/package-info.java b/apps/xran/src/main/java/org.onosproject.xran/impl/providers/package-info.java
similarity index 85%
rename from src/main/java/org.onosproject.xran/providers/package-info.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/providers/package-info.java
index 608d5f6..d4679ba 100644
--- a/src/main/java/org.onosproject.xran/providers/package-info.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/providers/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,4 +17,4 @@
 /**
  * Created by dimitris on 7/27/17.
  */
-package org.onosproject.xran.providers;
\ No newline at end of file
+package org.onosproject.xran.impl.providers;
\ No newline at end of file
diff --git a/apps/xran/src/main/java/org.onosproject.xran/impl/rest/CellWebResource.java b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/CellWebResource.java
new file mode 100644
index 0000000..81ada71
--- /dev/null
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/CellWebResource.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.xran.impl.rest;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.xran.XranService;
+import org.onosproject.xran.XranStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.PATCH;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Cell web resource.
+ */
+@Path("cell")
+public class CellWebResource extends AbstractWebResource {
+
+    private static final Logger log =
+            LoggerFactory.getLogger(CellWebResource.class);
+
+    private XranStore xranStore;
+    private XranService xranService;
+
+    public CellWebResource() {
+        xranStore = get(XranStore.class);
+        xranService = get(XranService.class);
+    }
+
+    /**
+     * Lists the cell with {cellid}.
+     *
+     * @param eciHex EutranCellIdentifier in binary
+     * @return Response
+     */
+    @GET
+    @Path("{cellid}")
+    @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 404, message = "HTTP_NOT_FOUND")
+    })
+    public Response getCell(@PathParam("cellid") String eciHex) {
+        return xranStore.getCell(eciHex).map(cell -> {
+            try {
+                JsonNode jsonNode = mapper().valueToTree(cell);
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        HttpURLConnection.HTTP_OK,
+                        jsonNode
+                );
+
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
+                e.printStackTrace();
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        HttpURLConnection.HTTP_INTERNAL_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
+            }
+        }).orElse(ResponseHelper.getResponse(
+                mapper(),
+                HttpURLConnection.HTTP_NOT_FOUND,
+                "Not Found",
+                "Cell with " + eciHex + " was not found"
+        ));
+    }
+
+    /**
+     * Modify the RRMConfig parameters of the cell.
+     *
+     * @param eciHex EutranCellIdentifier in binary
+     * @param stream Parameters that you want to modify
+     * @return Response
+     */
+    @PATCH
+    @Path("{cellid}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 408, message = "HTTP_CLIENT_TIMEOUT"),
+            @ApiResponse(code = 400, message = "HTTP_BAD_REQUEST"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 404, message = "HTTP_NOT_FOUND")
+
+    })
+    public Response patchCell(@PathParam("cellid") String eciHex, InputStream stream) {
+        return xranStore.getCell(eciHex).map(cell -> {
+            try {
+                ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+
+                JsonNode rrmConf = jsonTree.path("RRMConf");
+                if (!rrmConf.isMissingNode()) {
+                    xranStore.modifyCellRrmConf(cell, rrmConf);
+
+                    return xranService.sendModifiedRrm(cell.getRrmConfig())
+                            .flatMap(queue -> {
+                                try {
+                                    return Optional.ofNullable(queue.poll(xranService
+                                            .getNorthboundTimeout(), TimeUnit.MILLISECONDS));
+                                } catch (InterruptedException e) {
+                                    log.error(ExceptionUtils.getFullStackTrace(e));
+                                    return Optional.empty();
+                                }
+                            }).map(p ->
+                                    ResponseHelper.getResponse(
+                                            mapper(),
+                                            HttpURLConnection.HTTP_OK,
+                                            "Handoff Response",
+                                            p
+                                    )
+                            ).orElse(
+                                    ResponseHelper.getResponse(
+                                            mapper(),
+                                            HttpURLConnection.HTTP_CLIENT_TIMEOUT,
+                                            "Handoff Timeout",
+                                            "eNodeB did not send a HOComplete/HOFailure on time"
+                                    )
+                            );
+                }
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        HttpURLConnection.HTTP_BAD_REQUEST,
+                        "Bad Request",
+                        "The command you specified is not implemented or doesn't exist. We support " +
+                                "RRMConf commands."
+                );
+            } catch (Exception e) {
+                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
+                log.error(fullStackTrace);
+
+                return ResponseHelper.getResponse(
+                        mapper(),
+                        HttpURLConnection.HTTP_INTERNAL_ERROR,
+                        "Exception",
+                        fullStackTrace
+                );
+            }
+        }).orElse(ResponseHelper.getResponse(
+                mapper(),
+                HttpURLConnection.HTTP_NOT_FOUND,
+                "Not Found",
+                "Cell " + eciHex + " was not found"
+        ));
+    }
+
+}
diff --git a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/LinkWebResource.java
similarity index 61%
rename from src/main/java/org.onosproject.xran/rest/LinkWebResource.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/rest/LinkWebResource.java
index 420d7b4..1c91bac 100644
--- a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/LinkWebResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,37 +13,39 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.xran.rest;
+package org.onosproject.xran.impl.rest;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.xran.XranService;
 import org.onosproject.xran.XranStore;
-import org.onosproject.xran.annotations.Patch;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.controller.XranController;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibLink;
-import org.onosproject.xran.entities.RnibUe;
+import org.onosproject.xran.asn1lib.ber.types.BerInteger;
+import org.onosproject.xran.impl.entities.RnibCell;
+import org.onosproject.xran.impl.entities.RnibLink;
+import org.onosproject.xran.impl.entities.RnibUe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.ws.rs.Consumes;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
+import javax.ws.rs.PATCH;
 import javax.ws.rs.POST;
+import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.InputStream;
+import java.net.HttpURLConnection;
 import java.util.List;
 import java.util.Optional;
-import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -55,8 +57,12 @@
     private static final Logger log =
             LoggerFactory.getLogger(LinkWebResource.class);
 
-    public LinkWebResource() {
+    private XranStore xranStore;
+    private XranService xranService;
 
+    public LinkWebResource() {
+        xranStore = get(XranStore.class);
+        xranService = get(XranService.class);
     }
 
     /**
@@ -68,20 +74,22 @@
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 404, message = "HTTP_NOT_FOUND")
+    })
     public Response getLinksBetween(@DefaultValue("") @QueryParam("cell") String eciHex,
                                     @DefaultValue("-1") @QueryParam("ue") long ue) {
         List<RnibLink> list = Lists.newArrayList();
         if (!eciHex.isEmpty() && ue != -1) {
-            RnibLink link = get(XranStore.class).getlinkbetweencellidueid(eciHex, ue);
-            if (link != null) {
-                list.add(link);
-            }
+            xranStore.getLink(eciHex, ue).ifPresent(list::add);
         } else if (!eciHex.isEmpty()) {
-            list.addAll(get(XranStore.class).getlinksbycellid(eciHex));
+            list.addAll(xranStore.getLinks(eciHex));
         } else if (ue != -1) {
-            list.addAll(get(XranStore.class).getlinksbyueid(ue));
+            list.addAll(xranStore.getLinks(ue));
         } else {
-            list.addAll(get(XranStore.class).getLinks());
+            list.addAll(xranStore.getLinks());
         }
 
         if (list.size() > 0) {
@@ -90,7 +98,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.OK,
+                        HttpURLConnection.HTTP_OK,
                         jsonNode
                 );
             } catch (Exception e) {
@@ -100,7 +108,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
+                        HttpURLConnection.HTTP_INTERNAL_ERROR,
                         "Exception",
                         fullStackTrace
                 );
@@ -109,7 +117,7 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.StatusCode.NOT_FOUND,
+                HttpURLConnection.HTTP_NOT_FOUND,
                 "Not Found",
                 "Specified links not found"
         );
@@ -123,13 +131,20 @@
      * @param stream Parameter on basis of which link is to be modified
      * @return Response
      */
-    @Patch
+    @PATCH
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 501, message = "HTTP_NOT_IMPLEMENTED"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 404, message = "HTTP_NOT_FOUND"),
+            @ApiResponse(code = 400, message = "HTTP_BAD_REQUEST"),
+            @ApiResponse(code = 408, message = "HTTP_CLIENT_TIMEOUT")
+    })
     public Response patchLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
-        RnibLink link = get(XranStore.class).getlinkbetweencellidueid(src, dst);
-        if (link != null) {
+        return xranStore.getLink(src, dst).map(link -> {
             try {
                 ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
@@ -154,7 +169,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.NOT_IMPLEMENTED,
+                        HttpURLConnection.HTTP_NOT_IMPLEMENTED,
                         "Not Implemented",
                         "The command you specified is not implemented or doesn't exist. We support " +
                                 "type/RRMConf/traficpercent commands."
@@ -167,19 +182,17 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
+                        HttpURLConnection.HTTP_INTERNAL_ERROR,
                         "Exception",
                         fullStackTrace
                 );
             }
-        }
-
-        return ResponseHelper.getResponse(
+        }).orElse(ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.StatusCode.NOT_FOUND,
+                HttpURLConnection.HTTP_NOT_FOUND,
                 "Not Found",
                 "Link not found use POST request"
-        );
+        ));
     }
 
     /**
@@ -194,32 +207,40 @@
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 501, message = "HTTP_NOT_IMPLEMENTED"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 404, message = "HTTP_NOT_FOUND"),
+            @ApiResponse(code = 400, message = "HTTP_BAD_REQUEST"),
+            @ApiResponse(code = 408, message = "HTTP_CLIENT_TIMEOUT"),
+    })
     public Response postLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
-        RnibCell cell = get(XranStore.class).getCell(src);
-        RnibUe ue = get(XranStore.class).getUe(dst);
+        Optional<RnibCell> cellOptional = xranStore.getCell(src);
+        Optional<RnibUe> ueOptional = xranStore.getUe(dst);
 
-        if (cell == null) {
+        if (!cellOptional.isPresent()) {
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.StatusCode.NOT_FOUND,
+                    HttpURLConnection.HTTP_NOT_FOUND,
                     "Not Found",
                     "Cell " + src + " was not found"
             );
         }
 
-        if (ue == null) {
+        if (!ueOptional.isPresent()) {
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.StatusCode.NOT_FOUND,
+                    HttpURLConnection.HTTP_NOT_FOUND,
                     "Not Found",
                     "Ue with " + dst + " was not found"
             );
         }
 
-        if (get(XranStore.class).getLink(cell.getEcgi(), ue.getId()) != null) {
+        if (xranStore.getLink(cellOptional.get().getEcgi(), ueOptional.get().getId()) != null) {
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.StatusCode.BAD_REQUEST,
+                    HttpURLConnection.HTTP_BAD_REQUEST,
                     "Bad Request",
                     "Link already exists use PATCH to modify"
             );
@@ -230,9 +251,9 @@
 
             JsonNode type = jsonTree.path("type");
 
-            RnibLink link = new RnibLink(cell, ue);
+            RnibLink link = new RnibLink(cellOptional.get(), ueOptional.get());
             // store it as non-serving when creating link
-            get(XranStore.class).storeLink(link);
+            xranStore.storeLink(link);
             if (!type.isMissingNode()) {
                 return handleTypeChange(link, RnibLink.Type.getEnum(type.asText()));
             }
@@ -254,7 +275,7 @@
 
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
+                    HttpURLConnection.HTTP_INTERNAL_ERROR,
                     "Exception",
                     fullStackTrace
             );
@@ -262,7 +283,7 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.StatusCode.BAD_REQUEST,
+                HttpURLConnection.HTTP_BAD_REQUEST,
                 "Bad Request",
                 "The command you specified is not implemented " +
                         "or doesn't exist. We support " +
@@ -279,17 +300,15 @@
      * @return Response
      * @throws InterruptedException Interrupted queue
      */
+
     private Response handleTypeChange(RnibLink link, RnibLink.Type newType)
             throws InterruptedException {
-        final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
-
-
         if (newType.equals(RnibLink.Type.SERVING_PRIMARY)) {
             switch (link.getType()) {
                 case SERVING_PRIMARY: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.StatusCode.BAD_REQUEST,
+                            HttpURLConnection.HTTP_BAD_REQUEST,
                             "Bad Request",
                             "Link is already a primary link"
                     );
@@ -297,41 +316,47 @@
                 case SERVING_SECONDARY_CA:
                 case SERVING_SECONDARY_DC:
                 case NON_SERVING: {
-                    List<RnibLink> linksByUeId = get(XranStore.class)
-                            .getlinksbyueid(link.getLinkId().getUeId());
+                    List<RnibLink> linksByUeId = xranStore
+                            .getLinks(link.getLinkId().getUeId());
 
-                    Optional<RnibLink> primary = linksByUeId.stream()
+                    return linksByUeId.stream()
                             .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
-                            .findFirst();
-                    if (primary.isPresent()) {
-                        queue[0] = get(XranController.class).sendHORequest(link, primary.get());
-                        String poll = queue[0].poll(get(XranController.class)
-                                .getNorthboundTimeout(), TimeUnit.MILLISECONDS);
-
-                        if (poll != null) {
-                            return ResponseHelper.getResponse(
-                                    mapper(),
-                                    ResponseHelper.StatusCode.OK,
-                                    "Handoff Response",
-                                    poll
+                            .findFirst().map(primaryLink -> xranService.sendHoRequest(link, primaryLink)
+                                    .flatMap(q -> {
+                                        try {
+                                            return Optional.ofNullable(q.poll(xranService
+                                                    .getNorthboundTimeout(), TimeUnit.MILLISECONDS));
+                                        } catch (InterruptedException e) {
+                                            log.error(ExceptionUtils.getFullStackTrace(e));
+                                            return Optional.empty();
+                                        }
+                                    }).map(poll ->
+                                            ResponseHelper.getResponse(
+                                                    mapper(),
+                                                    HttpURLConnection.HTTP_OK,
+                                                    "Handoff Response",
+                                                    poll
+                                            )
+                                    ).orElse(
+                                            ResponseHelper.getResponse(
+                                                    mapper(),
+                                                    HttpURLConnection.HTTP_CLIENT_TIMEOUT,
+                                                    "Handoff Timeout",
+                                                    "eNodeB did not send a HOComplete/HOFailure on time"
+                                            )
+                                    )
+                            )
+                            .orElseGet(
+                                    () -> {
+                                        link.setType(RnibLink.Type.SERVING_PRIMARY);
+                                        return ResponseHelper.getResponse(
+                                                mapper(),
+                                                HttpURLConnection.HTTP_OK,
+                                                "OK",
+                                                "Link set to primary"
+                                        );
+                                    }
                             );
-                        } else {
-                            return ResponseHelper.getResponse(
-                                    mapper(),
-                                    ResponseHelper.StatusCode.REQUEST_TIMEOUT,
-                                    "Handoff Timeout",
-                                    "eNodeB did not send a HOComplete/HOFailure on time"
-                            );
-                        }
-                    } else {
-                        link.setType(RnibLink.Type.SERVING_PRIMARY);
-                        return ResponseHelper.getResponse(
-                                mapper(),
-                                ResponseHelper.StatusCode.OK,
-                                "OK",
-                                "Link set to primary"
-                        );
-                    }
                 }
                 default:
             }
@@ -340,7 +365,7 @@
                 case NON_SERVING: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.StatusCode.BAD_REQUEST,
+                            HttpURLConnection.HTTP_BAD_REQUEST,
                             "Bad Request",
                             "Link is already a primary link"
                     );
@@ -348,24 +373,24 @@
                 case SERVING_PRIMARY: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.StatusCode.BAD_REQUEST,
+                            HttpURLConnection.HTTP_BAD_REQUEST,
                             "Bad Request",
                             "Cannot modify a primary link"
                     );
                 }
                 case SERVING_SECONDARY_CA:
                 case SERVING_SECONDARY_DC: {
-                    if (get(XranController.class).sendScellDelete(link)) {
+                    if (xranService.sendScellDelete(link)) {
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                ResponseHelper.StatusCode.OK,
+                                HttpURLConnection.HTTP_OK,
                                 "OK",
                                 "Link set to non-serving"
                         );
                     } else {
                         return ResponseHelper.getResponse(
                                 mapper(),
-                                ResponseHelper.StatusCode.NOT_FOUND,
+                                HttpURLConnection.HTTP_NOT_FOUND,
                                 "Not Found",
                                 "Could not find cell config report to construct Scell Delete"
                         );
@@ -378,36 +403,41 @@
                 case SERVING_PRIMARY: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.StatusCode.BAD_REQUEST,
+                            HttpURLConnection.HTTP_BAD_REQUEST,
                             "Bad Request",
                             "Cannot modify a primary link"
                     );
                 }
                 case SERVING_SECONDARY_DC:
                 case NON_SERVING: {
-                    queue[0] = get(XranController.class).sendScellAdd(link);
-                    String poll = queue[0].poll(get(XranController.class)
-                            .getNorthboundTimeout(), TimeUnit.MILLISECONDS);
-                    if (poll != null) {
-                        return ResponseHelper.getResponse(
-                                mapper(),
-                                ResponseHelper.StatusCode.OK,
-                                "ScellAdd Response",
-                                poll
-                        );
-                    } else {
-                        return ResponseHelper.getResponse(
-                                mapper(),
-                                ResponseHelper.StatusCode.REQUEST_TIMEOUT,
-                                "ScellAdd Timeout",
-                                "eNodeB did not send a ScellAddStatus on time"
-                        );
-                    }
+                    return xranService.sendScellAdd(link).flatMap(queue -> {
+                        try {
+                            return Optional.ofNullable(queue.poll(xranService
+                                    .getNorthboundTimeout(), TimeUnit.MILLISECONDS));
+                        } catch (InterruptedException e) {
+                            log.error(ExceptionUtils.getFullStackTrace(e));
+                            return Optional.empty();
+                        }
+                    }).map(poll ->
+                            ResponseHelper.getResponse(
+                                    mapper(),
+                                    HttpURLConnection.HTTP_OK,
+                                    "ScellAdd Response",
+                                    poll
+                            )
+                    ).orElse(
+                            ResponseHelper.getResponse(
+                                    mapper(),
+                                    HttpURLConnection.HTTP_CLIENT_TIMEOUT,
+                                    "ScellAdd Timeout",
+                                    "eNodeB did not send a ScellAddStatus on time"
+                            )
+                    );
                 }
                 case SERVING_SECONDARY_CA: {
                     return ResponseHelper.getResponse(
                             mapper(),
-                            ResponseHelper.StatusCode.BAD_REQUEST,
+                            HttpURLConnection.HTTP_BAD_REQUEST,
                             "Bad Request",
                             "Link is already a secondary CA link"
                     );
@@ -418,7 +448,7 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.StatusCode.BAD_REQUEST,
+                HttpURLConnection.HTTP_BAD_REQUEST,
                 "Bad Request",
                 "The command you specified is not implemented or doesn't exist."
         );
@@ -444,7 +474,7 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.StatusCode.OK,
+                HttpURLConnection.HTTP_OK,
                 "OK",
                 "Traffic Percent changed"
         );
@@ -459,38 +489,31 @@
      * @throws InterruptedException Interrupted queue
      */
     private Response handleRrmChange(RnibLink link, JsonNode rrmConf) throws InterruptedException {
-        final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
-        get(XranStore.class).modifylinkrrmconf(link, rrmConf);
-        boolean isxicic = link.getLinkId().getCell().getVersion() <= 3;
+        xranStore.modifyLinkRrmConf(link, rrmConf);
 
-        queue[0] = get(XranController.class).sendmodifiedrrmconf(link.getRrmParameters(),
-                isxicic);
-
-        if (isxicic) {
-            return ResponseHelper.getResponse(
-                    mapper(),
-                    ResponseHelper.StatusCode.OK,
-                    "OK",
-                    "xICIC was sent successfully"
-            );
-        } else {
-            String poll = queue[0].poll(get(XranController.class).getNorthboundTimeout(), TimeUnit.MILLISECONDS);
-
-            if (poll != null) {
-                return ResponseHelper.getResponse(
+        return xranService.sendModifiedRrm(link.getRrmParameters()).flatMap(queue -> {
+            try {
+                return Optional.ofNullable(queue.poll(xranService
+                        .getNorthboundTimeout(), TimeUnit.MILLISECONDS));
+            } catch (InterruptedException e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                return Optional.empty();
+            }
+        }).map(poll ->
+                ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.OK,
+                        HttpURLConnection.HTTP_OK,
                         "RRMConfig Response",
                         poll
-                );
-            } else {
-                return ResponseHelper.getResponse(
+                )
+        ).orElse(
+                ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.REQUEST_TIMEOUT,
+                        HttpURLConnection.HTTP_CLIENT_TIMEOUT,
                         "RRMConfig Timeout",
                         "eNodeB did not send a RRMConfingStatus on time"
-                );
-            }
-        }
+                )
+        );
+
     }
 }
diff --git a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/NodeWebResource.java
similarity index 75%
rename from src/main/java/org.onosproject.xran/rest/NodeWebResource.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/rest/NodeWebResource.java
index 961ed19..6c74d95 100644
--- a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/NodeWebResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,9 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.xran.rest;
+package org.onosproject.xran.impl.rest;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
@@ -26,11 +28,12 @@
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
-import javax.ws.rs.QueryParam;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.net.HttpURLConnection;
 import java.util.List;
 
 /**
@@ -43,7 +46,6 @@
             LoggerFactory.getLogger(NodeWebResource.class);
 
     public NodeWebResource() {
-
     }
 
     /**
@@ -54,21 +56,26 @@
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 404, message = "HTTP_NOT_FOUND")
+    })
     public Response getNodes(@DefaultValue("") @QueryParam("type") String type) {
         JsonNode jsonNode;
         try {
-            List<Object> nodes;
+            List<? extends Object> nodes;
             // List cell type of nodes or UE type of nodes.
             if (StringUtils.isBlank(type)) {
                 nodes = get(XranStore.class).getNodes();
             } else if (type.equals("cell")) {
-                nodes = get(XranStore.class).getcellnodes();
+                nodes = get(XranStore.class).getCellNodes();
             } else if (type.equals("ue")) {
-                nodes = get(XranStore.class).getuenodes();
+                nodes = get(XranStore.class).getUeNodes();
             } else {
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.NOT_FOUND,
+                        HttpURLConnection.HTTP_NOT_FOUND,
                         "Not Found",
                         "Type of node was not found"
                 );
@@ -77,7 +84,7 @@
             if (nodes.size() == 0) {
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.NOT_FOUND,
+                        HttpURLConnection.HTTP_NOT_FOUND,
                         "Not Found",
                         "No nodes found"
                 );
@@ -87,11 +94,10 @@
         } catch (Exception e) {
             String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
             log.error(fullStackTrace);
-            e.printStackTrace();
 
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
+                    HttpURLConnection.HTTP_INTERNAL_ERROR,
                     "Exception",
                     fullStackTrace
             );
@@ -99,7 +105,7 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.StatusCode.OK,
+                HttpURLConnection.HTTP_OK,
                 jsonNode
         );
     }
@@ -113,8 +119,13 @@
     @GET
     @Path("{nodeid}")
     @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 404, message = "HTTP_NOT_FOUND")
+    })
     public Response getNodeid(@PathParam("nodeid") String nodeid) {
-        Object node = get(XranStore.class).getbynodeid(nodeid);
+        Object node = get(XranStore.class).getNode(nodeid);
 
         if (node != null) {
             try {
@@ -122,7 +133,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.OK,
+                        HttpURLConnection.HTTP_OK,
                         jsonNode
                 );
             } catch (Exception e) {
@@ -132,7 +143,7 @@
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
+                        HttpURLConnection.HTTP_INTERNAL_ERROR,
                         "Exception",
                         fullStackTrace
                 );
@@ -141,7 +152,7 @@
 
         return ResponseHelper.getResponse(
                 mapper(),
-                ResponseHelper.StatusCode.NOT_FOUND,
+                HttpURLConnection.HTTP_NOT_FOUND,
                 "Not Found",
                 "Node " + nodeid + " was not found"
         );
diff --git a/src/main/java/org.onosproject.xran/rest/ResponseHelper.java b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/ResponseHelper.java
similarity index 62%
rename from src/main/java/org.onosproject.xran/rest/ResponseHelper.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/rest/ResponseHelper.java
index f037cee..0a3abad 100644
--- a/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/ResponseHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.rest;
+package org.onosproject.xran.impl.rest;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -31,31 +31,31 @@
     private ResponseHelper() {
     }
 
-    public static Response getResponse(ObjectMapper mapper, StatusCode status, String title, String detail) {
+    public static Response getResponse(ObjectMapper mapper, int status, String title, String detail) {
         ObjectNode rootNode = mapper.createObjectNode();
 
         switch (status) {
-            case OK: {
+            case 200: {
                 ArrayNode data = rootNode.putArray("data");
                 ObjectNode addObject = data.addObject();
-                addObject.put("status", status.status);
+                addObject.put("status", status);
                 addObject.put("title", title);
                 addObject.put("detail", detail);
-                return Response.status(status.status)
+                return Response.status(status)
                         .entity(rootNode.toString())
                         .build();
             }
-            case BAD_REQUEST:
-            case NOT_IMPLEMENTED:
-            case REQUEST_TIMEOUT:
-            case INTERNAL_SERVER_ERROR:
-            case NOT_FOUND: {
+            case 400:
+            case 501:
+            case 408:
+            case 500:
+            case 404: {
                 ArrayNode errors = rootNode.putArray("errors");
                 ObjectNode addObject = errors.addObject();
-                addObject.put("status", status.status);
+                addObject.put("status", status);
                 addObject.put("title", title);
                 addObject.put("detail", detail);
-                return Response.status(status.status)
+                return Response.status(status)
                         .entity(rootNode.toString())
                         .build();
             }
@@ -64,19 +64,19 @@
         }
     }
 
-    public static Response getResponse(ObjectMapper mapper, StatusCode status, JsonNode node) {
+    public static Response getResponse(ObjectMapper mapper, int status, JsonNode node) {
         ObjectNode rootNode = mapper.createObjectNode();
 
         switch (status) {
-            case OK:
-            case BAD_REQUEST:
-            case NOT_IMPLEMENTED:
-            case REQUEST_TIMEOUT:
-            case INTERNAL_SERVER_ERROR:
-            case NOT_FOUND: {
+            case 200:
+            case 400:
+            case 501:
+            case 408:
+            case 500:
+            case 404: {
                 ArrayNode data = rootNode.putArray("data");
                 data.add(node);
-                return Response.status(status.status)
+                return Response.status(status)
                         .entity(rootNode.toString())
                         .build();
             }
@@ -84,19 +84,4 @@
                 return Response.noContent().build();
         }
     }
-
-    public enum StatusCode {
-        OK(200),
-        BAD_REQUEST(400),
-        NOT_FOUND(404),
-        REQUEST_TIMEOUT(408),
-        INTERNAL_SERVER_ERROR(500),
-        NOT_IMPLEMENTED(501);
-
-        public int status;
-
-        StatusCode(int status) {
-            this.status = status;
-        }
-    }
 }
diff --git a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/SliceWebResource.java
similarity index 71%
rename from src/main/java/org.onosproject.xran/rest/SliceWebResource.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/rest/SliceWebResource.java
index 8817be8..10fcc5e 100644
--- a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/SliceWebResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,13 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.xran.rest;
+package org.onosproject.xran.impl.rest;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.rest.AbstractWebResource;
 import org.onosproject.xran.XranStore;
-import org.onosproject.xran.entities.RnibSlice;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,6 +33,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.InputStream;
+import java.net.HttpURLConnection;
 
 /**
  * Slice web resource.
@@ -43,7 +45,6 @@
             LoggerFactory.getLogger(SliceWebResource.class);
 
     public SliceWebResource() {
-
     }
 
     /**
@@ -55,37 +56,39 @@
     @GET
     @Path("{sliceid}")
     @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 404, message = "HTTP_NOT_FOUND")
+    })
     public Response getSlice(@PathParam("sliceid") long sliceid) {
-        RnibSlice slice = get(XranStore.class).getSlice(sliceid);
-
-        if (slice != null) {
+        return get(XranStore.class).getSlice(sliceid).map(slice -> {
             try {
                 JsonNode jsonNode = mapper().valueToTree(slice);
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.OK,
+                        HttpURLConnection.HTTP_OK,
                         jsonNode
                 );
             } catch (Exception e) {
                 String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
                 log.error(fullStackTrace);
-                e.printStackTrace();
 
                 return ResponseHelper.getResponse(
                         mapper(),
-                        ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
+                        HttpURLConnection.HTTP_INTERNAL_ERROR,
                         "Exception",
                         fullStackTrace
                 );
             }
-        }
-
-        return ResponseHelper.getResponse(
-                mapper(),
-                ResponseHelper.StatusCode.NOT_FOUND,
-                "Not Found",
-                "Slice " + sliceid + " not found"
+        }).orElse(
+                ResponseHelper.getResponse(
+                        mapper(),
+                        HttpURLConnection.HTTP_NOT_FOUND,
+                        "Not Found",
+                        "Slice " + sliceid + " not found"
+                )
         );
     }
 
@@ -98,6 +101,11 @@
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "HTTP_OK"),
+            @ApiResponse(code = 500, message = "HTTP_INTERNAL_ERROR"),
+            @ApiResponse(code = 501, message = "HTTP_NOT_IMPLEMENTED")
+    })
     public Response postSlice(InputStream stream) {
         try {
 //            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
@@ -106,7 +114,7 @@
             // FIXME: change when implemented
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.StatusCode.NOT_IMPLEMENTED,
+                    HttpURLConnection.HTTP_NOT_IMPLEMENTED,
                     "Not Implemented",
                     "POST Slice not implemented"
             );
@@ -117,7 +125,7 @@
 
             return ResponseHelper.getResponse(
                     mapper(),
-                    ResponseHelper.StatusCode.INTERNAL_SERVER_ERROR,
+                    HttpURLConnection.HTTP_INTERNAL_ERROR,
                     "Exception",
                     fullStackTrace
             );
diff --git a/src/main/java/org.onosproject.xran/rest/XranWebApplication.java b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/XranWebApplication.java
similarity index 91%
rename from src/main/java/org.onosproject.xran/rest/XranWebApplication.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/rest/XranWebApplication.java
index fff752f..add727d 100644
--- a/src/main/java/org.onosproject.xran/rest/XranWebApplication.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/XranWebApplication.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.xran.rest;
+package org.onosproject.xran.impl.rest;
 
 import org.onlab.rest.AbstractWebApplication;
 
diff --git a/src/main/java/org.onosproject.xran/rest/package-info.java b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/package-info.java
similarity index 86%
rename from src/main/java/org.onosproject.xran/rest/package-info.java
rename to apps/xran/src/main/java/org.onosproject.xran/impl/rest/package-info.java
index c08814c..7c5ca9a 100644
--- a/src/main/java/org.onosproject.xran/rest/package-info.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/impl/rest/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,4 +17,4 @@
 /**
  * Created by dimitris on 7/20/17.
  */
-package org.onosproject.xran.rest;
\ No newline at end of file
+package org.onosproject.xran.impl.rest;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/package-info.java b/apps/xran/src/main/java/org.onosproject.xran/package-info.java
similarity index 92%
rename from src/main/java/org.onosproject.xran/package-info.java
rename to apps/xran/src/main/java/org.onosproject.xran/package-info.java
index 2cb39bf..6e177d0 100644
--- a/src/main/java/org.onosproject.xran/package-info.java
+++ b/apps/xran/src/main/java/org.onosproject.xran/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Foundation
+ * Copyright 2017-present Open Networking Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/main/webapp/WEB-INF/web.xml b/apps/xran/src/main/webapp/WEB-INF/web.xml
similarity index 93%
rename from src/main/webapp/WEB-INF/web.xml
rename to apps/xran/src/main/webapp/WEB-INF/web.xml
index 4520f46..724584c 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/apps/xran/src/main/webapp/WEB-INF/web.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Copyright 2016-present Open Networking Foundation
+  ~ Copyright 2017-present Open Networking Foundation
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -45,7 +45,7 @@
         <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
         <init-param>
             <param-name>javax.ws.rs.Application</param-name>
-            <param-value>org.onosproject.xran.rest.XranWebApplication</param-value>
+            <param-value>org.onosproject.xran.impl.rest.XranWebApplication</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
     </servlet>
diff --git a/apps/xran/src/test/java/org.onosproject.xran/org/onosproject/xran/impl/DefaultXranStoreTest.java b/apps/xran/src/test/java/org.onosproject.xran/org/onosproject/xran/impl/DefaultXranStoreTest.java
new file mode 100644
index 0000000..3e49869
--- /dev/null
+++ b/apps/xran/src/test/java/org.onosproject.xran/org/onosproject/xran/impl/DefaultXranStoreTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xran.impl;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.xran.asn1lib.api.CRNTI;
+import org.onosproject.xran.asn1lib.api.ECGI;
+import org.onosproject.xran.asn1lib.api.EUTRANCellIdentifier;
+import org.onosproject.xran.asn1lib.api.PLMNIdentity;
+import org.onosproject.xran.asn1lib.util.HexConverter;
+import org.onosproject.xran.impl.entities.RnibCell;
+import org.onosproject.xran.impl.entities.RnibLink;
+import org.onosproject.xran.impl.entities.RnibUe;
+
+import javax.xml.bind.DatatypeConverter;
+import java.util.List;
+import java.util.function.Supplier;
+
+import static org.junit.Assert.assertEquals;
+
+public class DefaultXranStoreTest {
+    private static final CRNTI CRNTI0 = new CRNTI(new byte[]{(byte) 0xFF, (byte) 0xFF}, 16);
+    private static final CRNTI CRNTI1 = new CRNTI(new byte[]{(byte) 0xFA, (byte) 0xAF}, 16);
+
+    private static final RnibUe UE0 = new RnibUe();
+    private static final RnibUe UE1 = new RnibUe();
+
+    private static final RnibCell CELL0 = new RnibCell();
+    private static final RnibCell CELL1 = new RnibCell();
+    private static final String ECI0 = "00000010";
+    private static final String ECI1 = "00000020";
+    private static final long UEID0 = 0L;
+    private static final long UEID1 = 1L;
+
+    private static DefaultXranStore store = new DefaultXranStore();
+
+    private static RnibLink primaryLink0;
+    private static RnibLink primaryLink1;
+    private static RnibLink nonServingLink0;
+    private static RnibLink nonServingLink1;
+
+    private Supplier exception = () -> {
+        throw new IllegalArgumentException("item not found");
+    };
+
+    @Before
+    public void setUp() throws Exception {
+        CELL0.setEcgi(hexToEcgi("000001", ECI0));
+        CELL1.setEcgi(hexToEcgi("000002", ECI1));
+
+        UE0.setCrnti(CRNTI0);
+        UE0.setId(UEID0);
+
+        UE1.setCrnti(CRNTI1);
+        UE1.setId(UEID1);
+
+        store.storeCell(CELL0);
+        store.storeCell(CELL1);
+
+        store.storeUe(CELL0, UE0);
+        store.storeUe(CELL1, UE1);
+
+        store.putPrimaryLink(CELL0, UE0);
+        store.putPrimaryLink(CELL1, UE1);
+
+        store.putNonServingLink(CELL0, UEID1);
+        store.putNonServingLink(CELL1, UEID0);
+
+        primaryLink0 = store.getLink(CELL0.getEcgi(), UEID0).orElseThrow(exception);
+        primaryLink1 = store.getLink(CELL1.getEcgi(), UEID1).orElseThrow(exception);
+
+        nonServingLink0 = store.getLink(CELL0.getEcgi(), UEID1).orElseThrow(exception);
+        nonServingLink1 = store.getLink(CELL1.getEcgi(), UEID0).orElseThrow(exception);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        assertEquals("wrong remove", true, store.removeCell(CELL0.getEcgi()));
+        assertEquals("wrong remove", true, store.removeCell(CELL1.getEcgi()));
+
+        assertEquals("wrong remove", true, store.removeUe(UEID0));
+        assertEquals("wrong remove", true, store.removeUe(UEID1));
+
+        assertEquals("wrong remove", true, store.removeLink(primaryLink0.getLinkId()));
+        assertEquals("wrong remove", true, store.removeLink(primaryLink1.getLinkId()));
+
+        assertEquals("wrong remove", true, store.removeLink(nonServingLink0.getLinkId()));
+        assertEquals("wrong remove", true, store.removeLink(nonServingLink1.getLinkId()));
+
+        assertEquals("wrong len", 0, store.getCellNodes().size());
+        assertEquals("wrong len", 0, store.getUeNodes().size());
+        assertEquals("wrong len", 0, store.getNodes().size());
+        assertEquals("wrong len", 0, store.getLinks().size());
+    }
+
+    private ECGI hexToEcgi(String plmnId, String eci) throws Exception {
+        byte[] bytes = HexConverter.fromShortHexString(plmnId);
+        byte[] bytearray = DatatypeConverter.parseHexBinary(eci);
+
+        PLMNIdentity plmnIdentity = new PLMNIdentity(bytes);
+        EUTRANCellIdentifier eutranCellIdentifier = new EUTRANCellIdentifier(bytearray, 28);
+
+        ECGI ecgi = new ECGI();
+        ecgi.setEUTRANcellIdentifier(eutranCellIdentifier);
+        ecgi.setPLMNIdentity(plmnIdentity);
+
+        return ecgi;
+    }
+
+    @Test
+    public void getPrimaryLink() throws Exception {
+        assertEquals("wrong cell", CELL0, store.getPrimaryCell(UE0).orElseThrow(exception));
+        assertEquals("wrong cell", CELL1, store.getPrimaryCell(UE1).orElseThrow(exception));
+    }
+
+    @Test
+    public void mapSize() throws Exception {
+        assertEquals("wrong len", 2, store.getCellNodes().size());
+        assertEquals("wrong len", 2, store.getUeNodes().size());
+        assertEquals("wrong len", 4, store.getNodes().size());
+        assertEquals("wrong len", 4, store.getLinks().size());
+    }
+
+    @Test
+    public void getUe() throws Exception {
+        // GET FROM ID
+        assertEquals("wrong ue", UE0, store.getUe(UEID0).orElseThrow(exception));
+        assertEquals("wrong ue", UE1, store.getUe(UEID1).orElseThrow(exception));
+
+        // GET FROM ECGI-CRNTI
+        assertEquals("wrong ue", UE0, store.getUe(CELL0.getEcgi(), CRNTI0).orElseThrow(exception));
+        assertEquals("wrong ue", UE1, store.getUe(CELL1.getEcgi(), CRNTI1).orElseThrow(exception));
+
+        // GET FROM CRNTI
+        assertEquals("wrong crnti", CRNTI0, store.getCrnti(UEID0).orElseThrow(exception));
+        assertEquals("wrong crnti", CRNTI1, store.getCrnti(UEID1).orElseThrow(exception));
+    }
+
+    @Test
+    public void getLink() throws Exception {
+        // GET FROM ID
+        assertEquals("wrong link", primaryLink0, store.getLink(CELL0.getEcgi(), UEID0).orElseThrow(exception));
+        assertEquals("wrong link", primaryLink1, store.getLink(CELL1.getEcgi(), UEID1).orElseThrow(exception));
+        assertEquals("wrong link", nonServingLink0, store.getLink(CELL0.getEcgi(), UEID1).orElseThrow(exception));
+        assertEquals("wrong link", nonServingLink1, store.getLink(CELL1.getEcgi(), UEID0).orElseThrow(exception));
+
+        // GET FROM CRNTI
+        assertEquals("wrong link", primaryLink0, store.getLink(CELL0.getEcgi(), CRNTI0).orElseThrow(exception));
+        assertEquals("wrong link", primaryLink1, store.getLink(CELL1.getEcgi(), CRNTI1).orElseThrow(exception));
+        // GET FROM ECIHEX
+        assertEquals("wrong link", primaryLink0, store.getLink(ECI0, UEID0).orElseThrow(exception));
+        assertEquals("wrong link", primaryLink1, store.getLink(ECI1, UEID1).orElseThrow(exception));
+        assertEquals("wrong link", nonServingLink0, store.getLink(ECI0, UEID1).orElseThrow(exception));
+        assertEquals("wrong link", nonServingLink1, store.getLink(ECI1, UEID0).orElseThrow(exception));
+
+        // LINKS SIZE
+        assertEquals("wrong link", 2, store.getLinks(CELL0.getEcgi()).size());
+        assertEquals("wrong link", 2, store.getLinks(ECI0).size());
+        assertEquals("wrong link", 2, store.getLinks(UEID0).size());
+        assertEquals("wrong link", 2, store.getLinks(CELL1.getEcgi()).size());
+        assertEquals("wrong link", 2, store.getLinks(ECI1).size());
+        assertEquals("wrong link", 2, store.getLinks(UEID1).size());
+    }
+
+    @Test
+    public void getNodes() throws Exception {
+        List<RnibCell> cellNodes = store.getCellNodes();
+
+        assertEquals("wrong nodes", true, cellNodes.contains(CELL0));
+        assertEquals("wrong nodes", true, cellNodes.contains(CELL1));
+
+        List<RnibUe> ueNodes = store.getUeNodes();
+
+        assertEquals("wrong nodes", true, ueNodes.contains(UE0));
+        assertEquals("wrong nodes", true, ueNodes.contains(UE1));
+    }
+
+    @Test
+    public void crntiMap() throws Exception {
+        store.getCrnti().forEach(
+                (ecgiCrntiPair, aLong) -> assertEquals("wrong primary",
+                        store.getCell(ecgiCrntiPair.getKey()).get(),
+                        store.getPrimaryCell(store.getUe(aLong).orElseThrow(exception)).get()
+                )
+        );
+    }
+}
\ No newline at end of file
diff --git a/xran-cfg.json b/apps/xran/xran-cfg.json
similarity index 100%
rename from xran-cfg.json
rename to apps/xran/xran-cfg.json
diff --git a/src/main/java/org.onosproject.xran/XranStore.java b/src/main/java/org.onosproject.xran/XranStore.java
deleted file mode 100644
index 63a1a02..0000000
--- a/src/main/java/org.onosproject.xran/XranStore.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.store.Store;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.controller.XranController;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibLink;
-import org.onosproject.xran.entities.RnibSlice;
-import org.onosproject.xran.entities.RnibUe;
-import org.onosproject.xran.identifiers.LinkId;
-
-import java.util.List;
-
-/**
- * Created by dimitris on 7/22/17.
- */
-public interface XranStore extends Store {
-
-    // LINKS STORE
-
-    /**
-     * Get all active links.
-     *
-     * @return list of links
-     */
-    List<RnibLink> getLinks();
-
-    /**
-     * Get all links for that CELL based on ECGI.
-     *
-     * @param ecgi CELL ECGI
-     * @return list of links
-     */
-    List<RnibLink> getlinksbyecgi(ECGI ecgi);
-
-    /**
-     * Get all links for that CELL based on ECI.
-     *
-     * @param eciHex HEX string of ECI
-     * @return list of links
-     */
-    List<RnibLink> getlinksbycellid(String eciHex);
-
-    /**
-     * Get all links for the UE based on UE ID.
-     *
-     * @param ueId UE ID
-     * @return list of links
-     */
-    List<RnibLink> getlinksbyueid(long ueId);
-
-    /**
-     * Get a link between a CELL and UE.
-     *
-     * @param cellId HEX string ECI
-     * @param ueId   UE id
-     * @return link
-     */
-    RnibLink getlinkbetweencellidueid(String cellId, long ueId);
-
-    /**
-     * Get a link between a CELL's ECGI and UE's id.
-     *
-     * @param ecgi CELL ECGI
-     * @param ueId UE id
-     * @return link
-     */
-    RnibLink getLink(ECGI ecgi, Long ueId);
-
-    /**
-     * Modify specified link's RRM Configuration.
-     *
-     * @param link    LINK entity
-     * @param rrmConf json node of RRM Configuration
-     */
-    void modifylinkrrmconf(RnibLink link, JsonNode rrmConf);
-
-    /**
-     * Put new link to store.
-     *
-     * @param link LINK entity
-     */
-    void storeLink(RnibLink link);
-
-    /**
-     * Remove link from store.
-     *
-     * @param link LINK entity
-     * @return true if remove succeeded
-     */
-    boolean removeLink(LinkId link);
-
-    // NODES
-
-    /**
-     * Get all CELLs and UEs.
-     *
-     * @return list of UEs and CELLs
-     */
-    List<Object> getNodes();
-
-    /**
-     * Get all CELLs.
-     *
-     * @return list of CELLs
-     */
-    List<Object> getcellnodes();
-
-    /**
-     * Get all UEs.
-     *
-     * @return list of UEs
-     */
-    List<Object> getuenodes();
-
-    /**
-     * Get node by node id.
-     *
-     * @param nodeId HEX string ECI or UE id
-     * @return CELL or UE
-     */
-    Object getbynodeid(String nodeId);
-
-    // CELL
-
-    /**
-     * Get cell based on HEX string ECI.
-     *
-     * @param eci HEX string ECI
-     * @return CELL if found
-     */
-    RnibCell getCell(String eci);
-
-    /**
-     * Get cell based on ECGI.
-     *
-     * @param cellId CELL ECGI
-     * @return CELL if found
-     */
-    RnibCell getCell(ECGI cellId);
-
-    /**
-     * Modify CELL's RRM Configuration.
-     *
-     * @param cell    CELL entity
-     * @param rrmConf json node of RRM Configuration
-     * @throws Exception exception
-     */
-    void modifycellrrmconf(RnibCell cell, JsonNode rrmConf) throws Exception;
-
-    /**
-     * Put new CELL to the store.
-     *
-     * @param cell CELL entity
-     */
-    void storeCell(RnibCell cell);
-
-    /**
-     * Remove CELL from the store.
-     *
-     * @param ecgi CELL's ECGI
-     * @return ture if remove succeeded
-     */
-    boolean removeCell(ECGI ecgi);
-
-    // SLICE
-
-    /**
-     * Get SLICE based on SLICE id.
-     *
-     * @param sliceId SLICE id
-     * @return SLICE
-     */
-    RnibSlice getSlice(long sliceId);
-
-    /**
-     * Put new SLICE to the store.
-     *
-     * @param attributes json node of SLICE attributes
-     * @return true if put succeeded
-     */
-    boolean createSlice(ObjectNode attributes);
-
-    /**
-     * Remove SLICE based on SLICE id.
-     *
-     * @param sliceId SLICE id
-     * @return true if remove succeeded
-     */
-    boolean removeCell(long sliceId);
-
-    // CONTROLLER
-
-    /**
-     * Get the xran controller instance.
-     *
-     * @return xran controller
-     */
-    XranController getController();
-
-    /**
-     * Set the xran controller instance.
-     *
-     * @param controller xran controller
-     */
-    void setController(XranController controller);
-
-    // UE
-
-    /**
-     * Get UE based on UE id.
-     *
-     * @param euId UE id
-     * @return UE entity
-     */
-    RnibUe getUe(long euId);
-
-    /**
-     * Put new UE to store.
-     *
-     * @param ue UE entity
-     */
-    void storeUe(RnibUe ue);
-
-    /**
-     * Remove UE from store.
-     *
-     * @param ueId UE id
-     * @return true if remove succeeded
-     */
-    boolean removeUe(long ueId);
-}
diff --git a/src/main/java/org.onosproject.xran/annotations/Patch.java b/src/main/java/org.onosproject.xran/annotations/Patch.java
deleted file mode 100644
index bc882c5..0000000
--- a/src/main/java/org.onosproject.xran/annotations/Patch.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.annotations;
-
-import javax.ws.rs.HttpMethod;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * PATCH interface for swagger.
- */
-@Target({ElementType.METHOD})
-@Retention(RetentionPolicy.RUNTIME)
-@HttpMethod("Patch")
-public @interface Patch { }
diff --git a/src/main/java/org.onosproject.xran/annotations/package-info.java b/src/main/java/org.onosproject.xran/annotations/package-info.java
deleted file mode 100644
index 0f85a05..0000000
--- a/src/main/java/org.onosproject.xran/annotations/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Created by dimitris on 7/21/17.
- */
-package org.onosproject.xran.annotations;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/codecs/api/AdmEstCause.java b/src/main/java/org.onosproject.xran/codecs/api/AdmEstCause.java
deleted file mode 100644
index 7d1ffcf..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/AdmEstCause.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-
-import java.math.BigInteger;
-
-
-public class AdmEstCause extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public AdmEstCause() {
-	}
-
-	public AdmEstCause(byte[] code) {
-		super(code);
-	}
-
-	public AdmEstCause(BigInteger value) {
-		super(value);
-	}
-
-	public AdmEstCause(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/AdmEstResponse.java b/src/main/java/org.onosproject.xran/codecs/api/AdmEstResponse.java
deleted file mode 100644
index f594b70..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/AdmEstResponse.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class AdmEstResponse extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public AdmEstResponse() {
-	}
-
-	public AdmEstResponse(byte[] code) {
-		super(code);
-	}
-
-	public AdmEstResponse(BigInteger value) {
-		super(value);
-	}
-
-	public AdmEstResponse(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/AdmEstStatus.java b/src/main/java/org.onosproject.xran/codecs/api/AdmEstStatus.java
deleted file mode 100644
index 039e5e3..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/AdmEstStatus.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class AdmEstStatus extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public AdmEstStatus() {
-	}
-
-	public AdmEstStatus(byte[] code) {
-		super(code);
-	}
-
-	public AdmEstStatus(BigInteger value) {
-		super(value);
-	}
-
-	public AdmEstStatus(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/BitRate.java b/src/main/java/org.onosproject.xran/codecs/api/BitRate.java
deleted file mode 100644
index 9dd16ec..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/BitRate.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class BitRate extends BerInteger {
-
-	private static final long serialVersionUID = 1L;
-
-	public BitRate() {
-	}
-
-	public BitRate(byte[] code) {
-		super(code);
-	}
-
-	public BitRate(BigInteger value) {
-		super(value);
-	}
-
-	public BitRate(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/CACap.java b/src/main/java/org.onosproject.xran/codecs/api/CACap.java
deleted file mode 100644
index 4642978..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/CACap.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerBoolean;
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class CACap implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private BerInteger band = null;
-	private BerEnum caclassdl = null;
-	private BerEnum caclassul = null;
-	private BerBoolean crossCarrierSched = null;
-	
-	public CACap() {
-	}
-
-	public CACap(byte[] code) {
-		this.code = code;
-	}
-
-	public void setBand(BerInteger band) {
-		this.band = band;
-	}
-
-	public BerInteger getBand() {
-		return band;
-	}
-
-	public void setCaclassdl(BerEnum caclassdl) {
-		this.caclassdl = caclassdl;
-	}
-
-	public BerEnum getCaclassdl() {
-		return caclassdl;
-	}
-
-	public void setCaclassul(BerEnum caclassul) {
-		this.caclassul = caclassul;
-	}
-
-	public BerEnum getCaclassul() {
-		return caclassul;
-	}
-
-	public void setCrossCarrierSched(BerBoolean crossCarrierSched) {
-		this.crossCarrierSched = crossCarrierSched;
-	}
-
-	public BerBoolean getCrossCarrierSched() {
-		return crossCarrierSched;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += crossCarrierSched.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-		os.write(0x83);
-		codeLength += 1;
-		
-		codeLength += caclassul.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += caclassdl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += band.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			band = new BerInteger();
-			subCodeLength += band.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			caclassdl = new BerEnum();
-			subCodeLength += caclassdl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			caclassul = new BerEnum();
-			subCodeLength += caclassul.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
-			crossCarrierSched = new BerBoolean();
-			subCodeLength += crossCarrierSched.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (band != null) {
-			sb.append("band:").append(band);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (caclassdl != null) {
-			sb.append("caclassdl:").append(caclassdl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (caclassul != null) {
-			sb.append("caclassul:").append(caclassul);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crossCarrierSched != null) {
-			sb.append("crossCarrierSched:").append(crossCarrierSched);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/CRNTI.java b/src/main/java/org.onosproject.xran/codecs/api/CRNTI.java
deleted file mode 100644
index 38f893b..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/CRNTI.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-import javax.xml.bind.DatatypeConverter;
-
-
-public class CRNTI extends BerBitString {
-
-	private static final long serialVersionUID = 1L;
-
-	public CRNTI() {
-	}
-
-	public CRNTI(byte[] code) {
-		super(code);
-	}
-
-	public CRNTI(byte[] value, int numBits) {
-		super(value, numBits);
-	}
-
-	@Override
-	public int hashCode() {
-		return Arrays.hashCode(value);
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (obj instanceof CRNTI) {
-			return Arrays.equals(value, ((CRNTI) obj).value);
-		}
-		return super.equals(obj);
-	}
-
-	@Override
-	public String toString() {
-		return "" + DatatypeConverter.printHexBinary(value) + "";
-	}
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/CandScell.java b/src/main/java/org.onosproject.xran/codecs/api/CandScell.java
deleted file mode 100644
index 2113691..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/CandScell.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class CandScell implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private PhysCellId pci = null;
-	private ARFCNValue earfcnDl = null;
-	
-	public CandScell() {
-	}
-
-	public CandScell(byte[] code) {
-		this.code = code;
-	}
-
-	public void setPci(PhysCellId pci) {
-		this.pci = pci;
-	}
-
-	public PhysCellId getPci() {
-		return pci;
-	}
-
-	public void setEarfcnDl(ARFCNValue earfcnDl) {
-		this.earfcnDl = earfcnDl;
-	}
-
-	public ARFCNValue getEarfcnDl() {
-		return earfcnDl;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += earfcnDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += pci.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			pci = new PhysCellId();
-			subCodeLength += pci.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			earfcnDl = new ARFCNValue();
-			subCodeLength += earfcnDl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pci != null) {
-			sb.append("pci: ").append(pci);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (earfcnDl != null) {
-			sb.append("earfcnDl: ").append(earfcnDl);
-		}
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/DCCap.java b/src/main/java/org.onosproject.xran/codecs/api/DCCap.java
deleted file mode 100644
index ea75cfb..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/DCCap.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class DCCap implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private BerEnum drbTypeSplit = null;
-	
-	public DCCap() {
-	}
-
-	public DCCap(byte[] code) {
-		this.code = code;
-	}
-
-	public void setDrbTypeSplit(BerEnum drbTypeSplit) {
-		this.drbTypeSplit = drbTypeSplit;
-	}
-
-	public BerEnum getDrbTypeSplit() {
-		return drbTypeSplit;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += drbTypeSplit.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			drbTypeSplit = new BerEnum();
-			subCodeLength += drbTypeSplit.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (drbTypeSplit != null) {
-			sb.append("drbTypeSplit: ").append(drbTypeSplit);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/DuplexMode.java b/src/main/java/org.onosproject.xran/codecs/api/DuplexMode.java
deleted file mode 100644
index ae2d40c..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/DuplexMode.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-
-import java.math.BigInteger;
-
-
-public class DuplexMode extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public DuplexMode() {
-	}
-
-	public DuplexMode(byte[] code) {
-		super(code);
-	}
-
-	public DuplexMode(BigInteger value) {
-		super(value);
-	}
-
-	public DuplexMode(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ECGI.java b/src/main/java/org.onosproject.xran/codecs/api/ECGI.java
deleted file mode 100644
index c903fd6..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ECGI.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class ECGI implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private PLMNIdentity pLMNIdentity = null;
-	private EUTRANCellIdentifier eUTRANcellIdentifier = null;
-	
-	public ECGI() {
-	}
-
-	public ECGI(byte[] code) {
-		this.code = code;
-	}
-
-	public void setPLMNIdentity(PLMNIdentity pLMNIdentity) {
-		this.pLMNIdentity = pLMNIdentity;
-	}
-
-	public PLMNIdentity getPLMNIdentity() {
-		return pLMNIdentity;
-	}
-
-	public void setEUTRANcellIdentifier(EUTRANCellIdentifier eUTRANcellIdentifier) {
-		this.eUTRANcellIdentifier = eUTRANcellIdentifier;
-	}
-
-	public EUTRANCellIdentifier getEUTRANcellIdentifier() {
-		return eUTRANcellIdentifier;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += eUTRANcellIdentifier.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += pLMNIdentity.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			pLMNIdentity = new PLMNIdentity();
-			subCodeLength += pLMNIdentity.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			eUTRANcellIdentifier = new EUTRANCellIdentifier();
-			subCodeLength += eUTRANcellIdentifier.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pLMNIdentity != null) {
-			sb.append("pLMNIdentity: ").append(pLMNIdentity);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (eUTRANcellIdentifier != null) {
-			sb.append("eUTRANcellIdentifier: ").append(eUTRANcellIdentifier);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if (this == o) return true;
-		if (o == null || getClass() != o.getClass()) return false;
-
-		ECGI ecgi = (ECGI) o;
-
-		return eUTRANcellIdentifier.equals(ecgi.eUTRANcellIdentifier);
-	}
-
-	@Override
-	public int hashCode() {
-		return eUTRANcellIdentifier.hashCode();
-	}
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ENBUES1APID.java b/src/main/java/org.onosproject.xran/codecs/api/ENBUES1APID.java
deleted file mode 100644
index 61a9aba..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ENBUES1APID.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ENBUES1APID extends BerInteger {
-
-	private static final long serialVersionUID = 1L;
-
-	public ENBUES1APID() {
-	}
-
-	public ENBUES1APID(byte[] code) {
-		super(code);
-	}
-
-	public ENBUES1APID(BigInteger value) {
-		super(value);
-	}
-
-	public ENBUES1APID(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ERABDecision.java b/src/main/java/org.onosproject.xran/codecs/api/ERABDecision.java
deleted file mode 100644
index fb70c38..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ERABDecision.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ERABDecision extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public ERABDecision() {
-	}
-
-	public ERABDecision(byte[] code) {
-		super(code);
-	}
-
-	public ERABDecision(BigInteger value) {
-		super(value);
-	}
-
-	public ERABDecision(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ERABDirection.java b/src/main/java/org.onosproject.xran/codecs/api/ERABDirection.java
deleted file mode 100644
index 332953a..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ERABDirection.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ERABDirection extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public ERABDirection() {
-	}
-
-	public ERABDirection(byte[] code) {
-		super(code);
-	}
-
-	public ERABDirection(BigInteger value) {
-		super(value);
-	}
-
-	public ERABDirection(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ERABID.java b/src/main/java/org.onosproject.xran/codecs/api/ERABID.java
deleted file mode 100644
index 907243a..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ERABID.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ERABID extends BerInteger {
-
-	private static final long serialVersionUID = 1L;
-
-	public ERABID() {
-	}
-
-	public ERABID(byte[] code) {
-		super(code);
-	}
-
-	public ERABID(BigInteger value) {
-		super(value);
-	}
-
-	public ERABID(long value) {
-		super(value);
-	}
-
-	@Override
-	public int hashCode() {
-		return value.intValue();
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (obj instanceof ERABID) {
-			return value.intValue() == ((ERABID) obj).intValue();
-		}
-		return super.equals(obj);
-	}
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ERABParams.java b/src/main/java/org.onosproject.xran/codecs/api/ERABParams.java
deleted file mode 100644
index fafd02d..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ERABParams.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ERABParams implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-	@JsonIgnore
-	public byte[] code = null;
-	private List<ERABParamsItem> seqOf = null;
-
-	public ERABParams() {
-		seqOf = new ArrayList<ERABParamsItem>();
-	}
-
-	public ERABParams(byte[] code) {
-		this.code = code;
-	}
-
-	@JsonValue
-	public List<ERABParamsItem> getERABParamsItem() {
-		if (seqOf == null) {
-			seqOf = new ArrayList<ERABParamsItem>();
-		}
-		return seqOf;
-	}
-
-	public void setERABParamsItem(ArrayList<ERABParamsItem> erabParamsItem) {
-		seqOf = erabParamsItem;
-	}
-
-	public void addERABParamsItem(ERABParamsItem erabParamsItem) {
-		seqOf.add(erabParamsItem);
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		for (int i = (seqOf.size() - 1); i >= 0; i--) {
-			codeLength += seqOf.get(i).encode(os, true);
-		}
-
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-		int totalLength = length.val;
-
-		while (subCodeLength < totalLength) {
-			ERABParamsItem element = new ERABParamsItem();
-			subCodeLength += element.decode(is, true);
-			seqOf.add(element);
-		}
-		if (subCodeLength != totalLength) {
-			throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-		}
-		codeLength += subCodeLength;
-
-		return codeLength;
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("[\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (seqOf == null) {
-//			sb.append("null");
-		}
-		else {
-			Iterator<ERABParamsItem> it = seqOf.iterator();
-			if (it.hasNext()) {
-				it.next().appendAsString(sb, indentLevel + 1);
-				while (it.hasNext()) {
-					sb.append(",\n");
-					for (int i = 0; i < indentLevel + 1; i++) {
-						sb.append("\t");
-					}
-					it.next().appendAsString(sb, indentLevel + 1);
-				}
-			}
-		}
-
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("]");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ERABParamsItem.java b/src/main/java/org.onosproject.xran/codecs/api/ERABParamsItem.java
deleted file mode 100644
index d36acb0..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ERABParamsItem.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ERABParamsItem implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private ERABID id = null;
-	private ERABDirection direction = null;
-	private ERABType type = null;
-	private QCI qci = null;
-	private BerInteger arp = null;
-	private BitRate gbrDl = null;
-	private BitRate gbrUl = null;
-	private BitRate mbrDl = null;
-	private BitRate mbrUl = null;
-	
-	public ERABParamsItem() {
-	}
-
-	public ERABParamsItem(byte[] code) {
-		this.code = code;
-	}
-
-	public void setId(ERABID id) {
-		this.id = id;
-	}
-
-	public ERABID getId() {
-		return id;
-	}
-
-	public void setDirection(ERABDirection direction) {
-		this.direction = direction;
-	}
-
-	public ERABDirection getDirection() {
-		return direction;
-	}
-
-	public void setType(ERABType type) {
-		this.type = type;
-	}
-
-	public ERABType getType() {
-		return type;
-	}
-
-	public void setQci(QCI qci) {
-		this.qci = qci;
-	}
-
-	public QCI getQci() {
-		return qci;
-	}
-
-	public void setArp(BerInteger arp) {
-		this.arp = arp;
-	}
-
-	public BerInteger getArp() {
-		return arp;
-	}
-
-	public void setGbrDl(BitRate gbrDl) {
-		this.gbrDl = gbrDl;
-	}
-
-	public BitRate getGbrDl() {
-		return gbrDl;
-	}
-
-	public void setGbrUl(BitRate gbrUl) {
-		this.gbrUl = gbrUl;
-	}
-
-	public BitRate getGbrUl() {
-		return gbrUl;
-	}
-
-	public void setMbrDl(BitRate mbrDl) {
-		this.mbrDl = mbrDl;
-	}
-
-	public BitRate getMbrDl() {
-		return mbrDl;
-	}
-
-	public void setMbrUl(BitRate mbrUl) {
-		this.mbrUl = mbrUl;
-	}
-
-	public BitRate getMbrUl() {
-		return mbrUl;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += mbrUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 8
-		os.write(0x88);
-		codeLength += 1;
-		
-		codeLength += mbrDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 7
-		os.write(0x87);
-		codeLength += 1;
-		
-		codeLength += gbrUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 6
-		os.write(0x86);
-		codeLength += 1;
-		
-		codeLength += gbrDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 5
-		os.write(0x85);
-		codeLength += 1;
-		
-		codeLength += arp.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 4
-		os.write(0x84);
-		codeLength += 1;
-		
-		codeLength += qci.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-		os.write(0x83);
-		codeLength += 1;
-		
-		codeLength += type.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += direction.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += id.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			id = new ERABID();
-			subCodeLength += id.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			direction = new ERABDirection();
-			subCodeLength += direction.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			type = new ERABType();
-			subCodeLength += type.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
-			qci = new QCI();
-			subCodeLength += qci.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
-			arp = new BerInteger();
-			subCodeLength += arp.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 5)) {
-			gbrDl = new BitRate();
-			subCodeLength += gbrDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 6)) {
-			gbrUl = new BitRate();
-			subCodeLength += gbrUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 7)) {
-			mbrDl = new BitRate();
-			subCodeLength += mbrDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 8)) {
-			mbrUl = new BitRate();
-			subCodeLength += mbrUl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (id != null) {
-			sb.append("id: ").append(id);
-		}
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (direction != null) {
-			sb.append("direction: ").append(direction);
-		}
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (type != null) {
-			sb.append("type: ").append(type);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (qci != null) {
-			sb.append("qci: ").append(qci);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (arp != null) {
-			sb.append("arp: ").append(arp);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (gbrDl != null) {
-			sb.append("gbrDl: ").append(gbrDl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (gbrUl != null) {
-			sb.append("gbrUl: ").append(gbrUl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (mbrDl != null) {
-			sb.append("mbrDl: ").append(mbrDl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (mbrUl != null) {
-			sb.append("mbrUl: ").append(mbrUl);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ERABResponse.java b/src/main/java/org.onosproject.xran/codecs/api/ERABResponse.java
deleted file mode 100644
index eaff5a9..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ERABResponse.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ERABResponse implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-	@JsonIgnore
-	public byte[] code = null;
-	private List<ERABResponseItem> seqOf = null;
-
-	public ERABResponse() {
-		seqOf = new ArrayList<ERABResponseItem>();
-	}
-
-	public ERABResponse(byte[] code) {
-		this.code = code;
-	}
-
-	@JsonValue
-	public List<ERABResponseItem> getERABResponseItem() {
-		if (seqOf == null) {
-			seqOf = new ArrayList<ERABResponseItem>();
-		}
-		return seqOf;
-	}
-
-	public void setERABResponse(ERABResponseItem erabResponseItem) {
-		seqOf.add(erabResponseItem);
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		for (int i = (seqOf.size() - 1); i >= 0; i--) {
-			codeLength += seqOf.get(i).encode(os, true);
-		}
-
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-		int totalLength = length.val;
-
-		while (subCodeLength < totalLength) {
-			ERABResponseItem element = new ERABResponseItem();
-			subCodeLength += element.decode(is, true);
-			seqOf.add(element);
-		}
-		if (subCodeLength != totalLength) {
-			throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-		}
-		codeLength += subCodeLength;
-
-		return codeLength;
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("[\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (seqOf == null) {
-			// sb.append("null");
-		}
-		else {
-			Iterator<ERABResponseItem> it = seqOf.iterator();
-			if (it.hasNext()) {
-				it.next().appendAsString(sb, indentLevel + 1);
-				while (it.hasNext()) {
-					sb.append(",\n");
-					for (int i = 0; i < indentLevel + 1; i++) {
-						sb.append("\t");
-					}
-					it.next().appendAsString(sb, indentLevel + 1);
-				}
-			}
-		}
-
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("]");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ERABResponseItem.java b/src/main/java/org.onosproject.xran/codecs/api/ERABResponseItem.java
deleted file mode 100644
index db5181d..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ERABResponseItem.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ERABResponseItem implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private ERABID id = null;
-	private ERABDecision decision = null;
-	
-	public ERABResponseItem() {
-	}
-
-	public ERABResponseItem(byte[] code) {
-		this.code = code;
-	}
-
-	public void setId(ERABID id) {
-		this.id = id;
-	}
-
-	public ERABID getId() {
-		return id;
-	}
-
-	public void setDecision(ERABDecision decision) {
-		this.decision = decision;
-	}
-
-	public ERABDecision getDecision() {
-		return decision;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += decision.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += id.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			id = new ERABID();
-			subCodeLength += id.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			decision = new ERABDecision();
-			subCodeLength += decision.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (id != null) {
-			sb.append("id: ").append(id);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (decision != null) {
-			sb.append("decision: ").append(decision);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ERABType.java b/src/main/java/org.onosproject.xran/codecs/api/ERABType.java
deleted file mode 100644
index 7d95c98..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ERABType.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ERABType extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public ERABType() {
-	}
-
-	public ERABType(byte[] code) {
-		super(code);
-	}
-
-	public ERABType(BigInteger value) {
-		super(value);
-	}
-
-	public ERABType(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/EUTRANCellIdentifier.java b/src/main/java/org.onosproject.xran/codecs/api/EUTRANCellIdentifier.java
deleted file mode 100644
index 8dd094d..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/EUTRANCellIdentifier.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import org.onosproject.xran.codecs.ber.types.BerBitString;
-
-import javax.xml.bind.DatatypeConverter;
-import java.util.Arrays;
-
-
-public class EUTRANCellIdentifier extends BerBitString {
-
-	private static final long serialVersionUID = 1L;
-
-	public EUTRANCellIdentifier() {
-	}
-
-	public EUTRANCellIdentifier(byte[] code) {
-		super(code);
-	}
-
-	public EUTRANCellIdentifier(byte[] value, int numBits) {
-		super(value, numBits);
-	}
-
-	@Override
-	public int hashCode() {
-		return Arrays.hashCode(value);
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (obj instanceof EUTRANCellIdentifier) {
-			return Arrays.equals(value, ((EUTRANCellIdentifier) obj).value);
-		}
-		return super.equals(obj);
-	}
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/HOFailureCause.java b/src/main/java/org.onosproject.xran/codecs/api/HOFailureCause.java
deleted file mode 100644
index 5723e83..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/HOFailureCause.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-
-import java.math.BigInteger;
-
-
-public class HOFailureCause extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public HOFailureCause() {
-	}
-
-	public HOFailureCause(byte[] code) {
-		super(code);
-	}
-
-	public HOFailureCause(BigInteger value) {
-		super(value);
-	}
-
-	public HOFailureCause(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/MMEUES1APID.java b/src/main/java/org.onosproject.xran/codecs/api/MMEUES1APID.java
deleted file mode 100644
index 6edb788..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/MMEUES1APID.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import java.util.Objects;
-
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class MMEUES1APID extends BerInteger {
-
-	private static final long serialVersionUID = 1L;
-
-	public MMEUES1APID() {
-	}
-
-	public MMEUES1APID(byte[] code) {
-		super(code);
-	}
-
-	public MMEUES1APID(BigInteger value) {
-		super(value);
-	}
-
-	public MMEUES1APID(long value) {
-		super(value);
-	}
-
-	@Override
-	public int hashCode() {
-		return value.hashCode();
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (obj instanceof MMEUES1APID) {
-			return Objects.equals(value, ((MMEUES1APID) obj).value);
-		}
-		return super.equals(obj);
-	}
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PRBUsage.java b/src/main/java/org.onosproject.xran/codecs/api/PRBUsage.java
deleted file mode 100644
index ebe133f..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/PRBUsage.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class PRBUsage implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class PrbUsageDl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PrbUsageDl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PrbUsageDl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class PrbUsageUl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PrbUsageUl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PrbUsageUl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private PrbUsageDl prbUsageDl = null;
-	private PrbUsageUl prbUsageUl = null;
-	
-	public PRBUsage() {
-	}
-
-	public PRBUsage(byte[] code) {
-		this.code = code;
-	}
-
-	public void setPrbUsageDl(PrbUsageDl prbUsageDl) {
-		this.prbUsageDl = prbUsageDl;
-	}
-
-	public PrbUsageDl getPrbUsageDl() {
-		return prbUsageDl;
-	}
-
-	public void setPrbUsageUl(PrbUsageUl prbUsageUl) {
-		this.prbUsageUl = prbUsageUl;
-	}
-
-	public PrbUsageUl getPrbUsageUl() {
-		return prbUsageUl;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += prbUsageUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += prbUsageDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			prbUsageDl = new PrbUsageDl();
-			subCodeLength += prbUsageDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			prbUsageUl = new PrbUsageUl();
-			subCodeLength += prbUsageUl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (prbUsageDl != null) {
-			sb.append("prbUsageDl: ");
-			prbUsageDl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (prbUsageUl != null) {
-			sb.append("prbUsageUl: ");
-			prbUsageUl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PhysCellId.java b/src/main/java/org.onosproject.xran/codecs/api/PhysCellId.java
deleted file mode 100644
index 0c7e330..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/PhysCellId.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-
-import java.math.BigInteger;
-
-
-public class PhysCellId extends BerInteger {
-
-	private static final long serialVersionUID = 1L;
-
-	public PhysCellId() {
-	}
-
-	public PhysCellId(byte[] code) {
-		super(code);
-	}
-
-	public PhysCellId(BigInteger value) {
-		super(value);
-	}
-
-	public PhysCellId(long value) {
-		super(value);
-	}
-
-	@Override
-	public int hashCode() {
-		return value.intValue();
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (obj instanceof PhysCellId) {
-			return value.intValue() == ((PhysCellId) obj).value.intValue();
-		}
-		return super.equals(obj);
-	}
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/PropScell.java b/src/main/java/org.onosproject.xran/codecs/api/PropScell.java
deleted file mode 100644
index 2e9400b..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/PropScell.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerBoolean;
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class PropScell implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private PCIARFCN pciArfcn = null;
-	private BerBoolean crossCarrierSchedEnable = null;
-	private BerEnum caDirection = null;
-	private BerInteger deactTimer = null;
-	
-	public PropScell() {
-	}
-
-	public PropScell(byte[] code) {
-		this.code = code;
-	}
-
-	public void setPciArfcn(PCIARFCN pciArfcn) {
-		this.pciArfcn = pciArfcn;
-	}
-
-	public PCIARFCN getPciArfcn() {
-		return pciArfcn;
-	}
-
-	public void setCrossCarrierSchedEnable(BerBoolean crossCarrierSchedEnable) {
-		this.crossCarrierSchedEnable = crossCarrierSchedEnable;
-	}
-
-	public BerBoolean getCrossCarrierSchedEnable() {
-		return crossCarrierSchedEnable;
-	}
-
-	public void setCaDirection(BerEnum caDirection) {
-		this.caDirection = caDirection;
-	}
-
-	public BerEnum getCaDirection() {
-		return caDirection;
-	}
-
-	public void setDeactTimer(BerInteger deactTimer) {
-		this.deactTimer = deactTimer;
-	}
-
-	public BerInteger getDeactTimer() {
-		return deactTimer;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += deactTimer.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-		os.write(0x83);
-		codeLength += 1;
-		
-		codeLength += caDirection.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += crossCarrierSchedEnable.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += pciArfcn.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			pciArfcn = new PCIARFCN();
-			subCodeLength += pciArfcn.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			crossCarrierSchedEnable = new BerBoolean();
-			subCodeLength += crossCarrierSchedEnable.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			caDirection = new BerEnum();
-			subCodeLength += caDirection.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
-			deactTimer = new BerInteger();
-			subCodeLength += deactTimer.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pciArfcn != null) {
-			sb.append("pciArfcn: ");
-			pciArfcn.appendAsString(sb, indentLevel + 1);
-		}
-		else {
-			sb.append("pciArfcn: <empty-required-field>");
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crossCarrierSchedEnable != null) {
-			sb.append("crossCarrierSchedEnable: ").append(crossCarrierSchedEnable);
-		}
-		else {
-			sb.append("crossCarrierSchedEnable: <empty-required-field>");
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (caDirection != null) {
-			sb.append("caDirection: ").append(caDirection);
-		}
-		else {
-			sb.append("caDirection: <empty-required-field>");
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (deactTimer != null) {
-			sb.append("deactTimer: ").append(deactTimer);
-		}
-		else {
-			sb.append("deactTimer: <empty-required-field>");
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/QCI.java b/src/main/java/org.onosproject.xran/codecs/api/QCI.java
deleted file mode 100644
index c8a4e69..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/QCI.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-
-import java.math.BigInteger;
-
-
-public class QCI extends BerInteger {
-
-	private static final long serialVersionUID = 1L;
-
-	public QCI() {
-	}
-
-	public QCI(byte[] code) {
-		super(code);
-	}
-
-	public QCI(BigInteger value) {
-		super(value);
-	}
-
-	public QCI(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/RSRPRange.java b/src/main/java/org.onosproject.xran/codecs/api/RSRPRange.java
deleted file mode 100644
index c841f05..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/RSRPRange.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class RSRPRange extends BerInteger {
-
-	private static final long serialVersionUID = 1L;
-
-	public RSRPRange() {
-	}
-
-	public RSRPRange(byte[] code) {
-		super(code);
-	}
-
-	public RSRPRange(BigInteger value) {
-		super(value);
-	}
-
-	public RSRPRange(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/RSRQRange.java b/src/main/java/org.onosproject.xran/codecs/api/RSRQRange.java
deleted file mode 100644
index c0115a3..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/RSRQRange.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class RSRQRange extends BerInteger {
-
-	private static final long serialVersionUID = 1L;
-
-	public RSRQRange() {
-	}
-
-	public RSRQRange(byte[] code) {
-		super(code);
-	}
-
-	public RSRQRange(BigInteger value) {
-		super(value);
-	}
-
-	public RSRQRange(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/RXSigMeasRepInterval.java b/src/main/java/org.onosproject.xran/codecs/api/RXSigMeasRepInterval.java
deleted file mode 100644
index 55be762..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/RXSigMeasRepInterval.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class RXSigMeasRepInterval extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public RXSigMeasRepInterval() {
-	}
-
-	public RXSigMeasRepInterval(byte[] code) {
-		super(code);
-	}
-
-	public RXSigMeasRepInterval(BigInteger value) {
-		super(value);
-	}
-
-	public RXSigMeasRepInterval(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/RXSigRepQty.java b/src/main/java/org.onosproject.xran/codecs/api/RXSigRepQty.java
deleted file mode 100644
index 1c7f3ad..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/RXSigRepQty.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class RXSigRepQty extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public RXSigRepQty() {
-	}
-
-	public RXSigRepQty(byte[] code) {
-		super(code);
-	}
-
-	public RXSigRepQty(BigInteger value) {
-		super(value);
-	}
-
-	public RXSigRepQty(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/RXSigReport.java b/src/main/java/org.onosproject.xran/codecs/api/RXSigReport.java
deleted file mode 100644
index d11dc34..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/RXSigReport.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class RXSigReport implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private PCIARFCN pciArfcn = null;
-	private RSRPRange rsrp = null;
-	private RSRQRange rsrq = null;
-	
-	public RXSigReport() {
-	}
-
-	public RXSigReport(byte[] code) {
-		this.code = code;
-	}
-
-	public void setPciArfcn(PCIARFCN pciArfcn) {
-		this.pciArfcn = pciArfcn;
-	}
-
-	public PCIARFCN getPciArfcn() {
-		return pciArfcn;
-	}
-
-	public void setRsrp(RSRPRange rsrp) {
-		this.rsrp = rsrp;
-	}
-
-	public RSRPRange getRsrp() {
-		return rsrp;
-	}
-
-	public void setRsrq(RSRQRange rsrq) {
-		this.rsrq = rsrq;
-	}
-
-	public RSRQRange getRsrq() {
-		return rsrq;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += rsrq.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += rsrp.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += pciArfcn.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			pciArfcn = new PCIARFCN();
-			subCodeLength += pciArfcn.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			rsrp = new RSRPRange();
-			subCodeLength += rsrp.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			rsrq = new RSRQRange();
-			subCodeLength += rsrq.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pciArfcn != null) {
-			sb.append("pciArfcn: ");
-			pciArfcn.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (rsrp != null) {
-			sb.append("rsrp: ").append(rsrp);
-		}
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (rsrq != null) {
-			sb.append("rsrq: ").append(rsrq);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/RadioRepPerServCell.java b/src/main/java/org.onosproject.xran/codecs/api/RadioRepPerServCell.java
deleted file mode 100644
index 93d7dde..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/RadioRepPerServCell.java
+++ /dev/null
@@ -1,794 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-
-public class RadioRepPerServCell implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class CqiHist implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public CqiHist() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public CqiHist(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class RiHist implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public RiHist() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public RiHist(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class PuschSinrHist implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PuschSinrHist() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PuschSinrHist(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class PucchSinrHist implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PucchSinrHist() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PucchSinrHist(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private PCIARFCN pciArfcn = null;
-	private CqiHist cqiHist = null;
-	private RiHist riHist = null;
-	private PuschSinrHist puschSinrHist = null;
-	private PucchSinrHist pucchSinrHist = null;
-	
-	public RadioRepPerServCell() {
-	}
-
-	public RadioRepPerServCell(byte[] code) {
-		this.code = code;
-	}
-
-	public void setPciArfcn(PCIARFCN pciArfcn) {
-		this.pciArfcn = pciArfcn;
-	}
-
-	public PCIARFCN getPciArfcn() {
-		return pciArfcn;
-	}
-
-	public void setCqiHist(CqiHist cqiHist) {
-		this.cqiHist = cqiHist;
-	}
-
-	public CqiHist getCqiHist() {
-		return cqiHist;
-	}
-
-	public void setRiHist(RiHist riHist) {
-		this.riHist = riHist;
-	}
-
-	public RiHist getRiHist() {
-		return riHist;
-	}
-
-	public void setPuschSinrHist(PuschSinrHist puschSinrHist) {
-		this.puschSinrHist = puschSinrHist;
-	}
-
-	public PuschSinrHist getPuschSinrHist() {
-		return puschSinrHist;
-	}
-
-	public void setPucchSinrHist(PucchSinrHist pucchSinrHist) {
-		this.pucchSinrHist = pucchSinrHist;
-	}
-
-	public PucchSinrHist getPucchSinrHist() {
-		return pucchSinrHist;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += pucchSinrHist.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 4
-		os.write(0xA4);
-		codeLength += 1;
-		
-		codeLength += puschSinrHist.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += riHist.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += cqiHist.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += pciArfcn.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			pciArfcn = new PCIARFCN();
-			subCodeLength += pciArfcn.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			cqiHist = new CqiHist();
-			subCodeLength += cqiHist.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			riHist = new RiHist();
-			subCodeLength += riHist.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			puschSinrHist = new PuschSinrHist();
-			subCodeLength += puschSinrHist.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
-			pucchSinrHist = new PucchSinrHist();
-			subCodeLength += pucchSinrHist.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pciArfcn != null) {
-			sb.append("pciArfcn: ");
-			pciArfcn.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (cqiHist != null) {
-			sb.append("cqiHist: ");
-			cqiHist.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (riHist != null) {
-			sb.append("riHist: ");
-			riHist.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (puschSinrHist != null) {
-			sb.append("puschSinrHist: ");
-			puschSinrHist.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pucchSinrHist != null) {
-			sb.append("pucchSinrHist: ");
-			pucchSinrHist.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/ReconfIndReason.java b/src/main/java/org.onosproject.xran/codecs/api/ReconfIndReason.java
deleted file mode 100644
index 3c08c48..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/ReconfIndReason.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class ReconfIndReason extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public ReconfIndReason() {
-	}
-
-	public ReconfIndReason(byte[] code) {
-		super(code);
-	}
-
-	public ReconfIndReason(BigInteger value) {
-		super(value);
-	}
-
-	public ReconfIndReason(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/RelCause.java b/src/main/java/org.onosproject.xran/codecs/api/RelCause.java
deleted file mode 100644
index 5d1191d..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/RelCause.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class RelCause extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public RelCause() {
-	}
-
-	public RelCause(byte[] code) {
-		super(code);
-	}
-
-	public RelCause(BigInteger value) {
-		super(value);
-	}
-
-	public RelCause(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/SchedMeasRepPerServCell.java b/src/main/java/org.onosproject.xran/codecs/api/SchedMeasRepPerServCell.java
deleted file mode 100644
index 753fa5f..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/SchedMeasRepPerServCell.java
+++ /dev/null
@@ -1,1313 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class SchedMeasRepPerServCell implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class QciVals implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<QCI> seqOf = null;
-
-		public QciVals() {
-			seqOf = new ArrayList<QCI>();
-		}
-
-		public QciVals(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<QCI> getQCI() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<QCI>();
-			}
-			return seqOf;
-		}
-
-		public void setQCI(QCI qci) {
-			seqOf.add(qci);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				QCI element = new QCI();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<QCI> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class McsDl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public McsDl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public McsDl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class NumSchedTtisDl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public NumSchedTtisDl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public NumSchedTtisDl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class McsUl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public McsUl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public McsUl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class NumSchedTtisUl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public NumSchedTtisUl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public NumSchedTtisUl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class RankDl1 implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public RankDl1() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public RankDl1(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class RankDl2 implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public RankDl2() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public RankDl2(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private PCIARFCN pciArfcn = null;
-	private QciVals qciVals = null;
-	private PRBUsage prbUsage = null;
-	private McsDl mcsDl = null;
-	private NumSchedTtisDl numSchedTtisDl = null;
-	private McsUl mcsUl = null;
-	private NumSchedTtisUl numSchedTtisUl = null;
-	private RankDl1 rankDl1 = null;
-	private RankDl2 rankDl2 = null;
-	
-	public SchedMeasRepPerServCell() {
-	}
-
-	public SchedMeasRepPerServCell(byte[] code) {
-		this.code = code;
-	}
-
-	public void setPciArfcn(PCIARFCN pciArfcn) {
-		this.pciArfcn = pciArfcn;
-	}
-
-	public PCIARFCN getPciArfcn() {
-		return pciArfcn;
-	}
-
-	public void setQciVals(QciVals qciVals) {
-		this.qciVals = qciVals;
-	}
-
-	public QciVals getQciVals() {
-		return qciVals;
-	}
-
-	public void setPrbUsage(PRBUsage prbUsage) {
-		this.prbUsage = prbUsage;
-	}
-
-	public PRBUsage getPrbUsage() {
-		return prbUsage;
-	}
-
-	public void setMcsDl(McsDl mcsDl) {
-		this.mcsDl = mcsDl;
-	}
-
-	public McsDl getMcsDl() {
-		return mcsDl;
-	}
-
-	public void setNumSchedTtisDl(NumSchedTtisDl numSchedTtisDl) {
-		this.numSchedTtisDl = numSchedTtisDl;
-	}
-
-	public NumSchedTtisDl getNumSchedTtisDl() {
-		return numSchedTtisDl;
-	}
-
-	public void setMcsUl(McsUl mcsUl) {
-		this.mcsUl = mcsUl;
-	}
-
-	public McsUl getMcsUl() {
-		return mcsUl;
-	}
-
-	public void setNumSchedTtisUl(NumSchedTtisUl numSchedTtisUl) {
-		this.numSchedTtisUl = numSchedTtisUl;
-	}
-
-	public NumSchedTtisUl getNumSchedTtisUl() {
-		return numSchedTtisUl;
-	}
-
-	public void setRankDl1(RankDl1 rankDl1) {
-		this.rankDl1 = rankDl1;
-	}
-
-	public RankDl1 getRankDl1() {
-		return rankDl1;
-	}
-
-	public void setRankDl2(RankDl2 rankDl2) {
-		this.rankDl2 = rankDl2;
-	}
-
-	public RankDl2 getRankDl2() {
-		return rankDl2;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += rankDl2.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 8
-		os.write(0xA8);
-		codeLength += 1;
-		
-		codeLength += rankDl1.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 7
-		os.write(0xA7);
-		codeLength += 1;
-		
-		codeLength += numSchedTtisUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 6
-		os.write(0xA6);
-		codeLength += 1;
-		
-		codeLength += mcsUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 5
-		os.write(0xA5);
-		codeLength += 1;
-		
-		codeLength += numSchedTtisDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 4
-		os.write(0xA4);
-		codeLength += 1;
-		
-		codeLength += mcsDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += prbUsage.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += qciVals.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += pciArfcn.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			pciArfcn = new PCIARFCN();
-			subCodeLength += pciArfcn.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			qciVals = new QciVals();
-			subCodeLength += qciVals.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			prbUsage = new PRBUsage();
-			subCodeLength += prbUsage.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			mcsDl = new McsDl();
-			subCodeLength += mcsDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
-			numSchedTtisDl = new NumSchedTtisDl();
-			subCodeLength += numSchedTtisDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 5)) {
-			mcsUl = new McsUl();
-			subCodeLength += mcsUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 6)) {
-			numSchedTtisUl = new NumSchedTtisUl();
-			subCodeLength += numSchedTtisUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 7)) {
-			rankDl1 = new RankDl1();
-			subCodeLength += rankDl1.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 8)) {
-			rankDl2 = new RankDl2();
-			subCodeLength += rankDl2.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pciArfcn != null) {
-			sb.append("pciArfcn: ");
-			pciArfcn.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (qciVals != null) {
-			sb.append("qciVals: ");
-			qciVals.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (prbUsage != null) {
-			sb.append("prbUsage: ");
-			prbUsage.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (mcsDl != null) {
-			sb.append("mcsDl: ");
-			mcsDl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (numSchedTtisDl != null) {
-			sb.append("numSchedTtisDl: ");
-			numSchedTtisDl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (mcsUl != null) {
-			sb.append("mcsUl: ");
-			mcsUl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (numSchedTtisUl != null) {
-			sb.append("numSchedTtisUl: ");
-			numSchedTtisUl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (rankDl1 != null) {
-			sb.append("rankDl1: ");
-			rankDl1.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (rankDl2 != null) {
-			sb.append("rankDl2: ");
-			rankDl2.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/TrafficSplitPercentage.java b/src/main/java/org.onosproject.xran/codecs/api/TrafficSplitPercentage.java
deleted file mode 100644
index cf37663..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/TrafficSplitPercentage.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-public class TrafficSplitPercentage implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private ECGI ecgi = null;
-	private BerInteger trafficPercentDl = null;
-	private BerInteger trafficPercentUl = null;
-	
-	public TrafficSplitPercentage() {
-	}
-
-	public TrafficSplitPercentage(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setTrafficPercentDl(BerInteger trafficPercentDl) {
-		this.trafficPercentDl = trafficPercentDl;
-	}
-
-	public BerInteger getTrafficPercentDl() {
-		return trafficPercentDl;
-	}
-
-	public void setTrafficPercentUl(BerInteger trafficPercentUl) {
-		this.trafficPercentUl = trafficPercentUl;
-	}
-
-	public BerInteger getTrafficPercentUl() {
-		return trafficPercentUl;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		if (trafficPercentUl != null) {
-			codeLength += trafficPercentUl.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-			os.write(0x82);
-			codeLength += 1;
-		}
-		
-		if (trafficPercentDl != null) {
-			codeLength += trafficPercentDl.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-			os.write(0x81);
-			codeLength += 1;
-		}
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			trafficPercentDl = new BerInteger();
-			subCodeLength += trafficPercentDl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			trafficPercentUl = new BerInteger();
-			subCodeLength += trafficPercentUl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		if (trafficPercentDl != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("trafficPercentDl: ").append(trafficPercentDl);
-		}
-		
-		if (trafficPercentUl != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("trafficPercentUl: ").append(trafficPercentUl);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/UEAMBR.java b/src/main/java/org.onosproject.xran/codecs/api/UEAMBR.java
deleted file mode 100644
index 0fb8a7f..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/UEAMBR.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class UEAMBR implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private BitRate ambrDl = null;
-	private BitRate ambrUl = null;
-	
-	public UEAMBR() {
-	}
-
-	public UEAMBR(byte[] code) {
-		this.code = code;
-	}
-
-	public void setAmbrDl(BitRate ambrDl) {
-		this.ambrDl = ambrDl;
-	}
-
-	public BitRate getAmbrDl() {
-		return ambrDl;
-	}
-
-	public void setAmbrUl(BitRate ambrUl) {
-		this.ambrUl = ambrUl;
-	}
-
-	public BitRate getAmbrUl() {
-		return ambrUl;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += ambrUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += ambrDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			ambrDl = new BitRate();
-			subCodeLength += ambrDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			ambrUl = new BitRate();
-			subCodeLength += ambrUl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ambrDl != null) {
-			sb.append("ambrDl: ").append(ambrDl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ambrUl != null) {
-			sb.append("ambrUl: ").append(ambrUl);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/api/XICICPA.java b/src/main/java/org.onosproject.xran/codecs/api/XICICPA.java
deleted file mode 100644
index 5c69cfa..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/XICICPA.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.api;
-
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-
-import java.math.BigInteger;
-
-
-public class XICICPA extends BerEnum {
-
-	private static final long serialVersionUID = 1L;
-
-	public XICICPA() {
-	}
-
-	public XICICPA(byte[] code) {
-		super(code);
-	}
-
-	public XICICPA(BigInteger value) {
-		super(value);
-	}
-
-	public XICICPA(long value) {
-		super(value);
-	}
-
-}
diff --git a/src/main/java/org.onosproject.xran/codecs/api/package-info.java b/src/main/java/org.onosproject.xran/codecs/api/package-info.java
deleted file mode 100644
index ace3595..0000000
--- a/src/main/java/org.onosproject.xran/codecs/api/package-info.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.codecs.api;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/codecs/package-info.java b/src/main/java/org.onosproject.xran/codecs/package-info.java
deleted file mode 100644
index 07f89fa..0000000
--- a/src/main/java/org.onosproject.xran/codecs/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package org.onosproject.xran.codecs;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionRequest.java b/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionRequest.java
deleted file mode 100644
index 7fa0f40..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionRequest.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.ERABParams;
-import org.onosproject.xran.codecs.api.UEAMBR;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-public class BearerAdmissionRequest implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private UEAMBR ueAmbr = null;
-	private BerInteger numErabs = null;
-	private ERABParams erabParams = null;
-	
-	public BearerAdmissionRequest() {
-	}
-
-	public BearerAdmissionRequest(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setUeAmbr(UEAMBR ueAmbr) {
-		this.ueAmbr = ueAmbr;
-	}
-
-	public UEAMBR getUeAmbr() {
-		return ueAmbr;
-	}
-
-	public void setNumErabs(BerInteger numErabs) {
-		this.numErabs = numErabs;
-	}
-
-	public BerInteger getNumErabs() {
-		return numErabs;
-	}
-
-	public void setErabParams(ERABParams erabParams) {
-		this.erabParams = erabParams;
-	}
-
-	public ERABParams getErabParams() {
-		return erabParams;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += erabParams.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 4
-		os.write(0xA4);
-		codeLength += 1;
-		
-		codeLength += numErabs.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-		os.write(0x83);
-		codeLength += 1;
-		
-		codeLength += ueAmbr.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			ueAmbr = new UEAMBR();
-			subCodeLength += ueAmbr.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
-			numErabs = new BerInteger();
-			subCodeLength += numErabs.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
-			erabParams = new ERABParams();
-			subCodeLength += erabParams.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ueAmbr != null) {
-			sb.append("ueAmbr: ");
-			ueAmbr.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (numErabs != null) {
-			sb.append("numErabs: ").append(numErabs);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (erabParams != null) {
-			sb.append("erabParams: ");
-			erabParams.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionResponse.java b/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionResponse.java
deleted file mode 100644
index a4dfeb0..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionResponse.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-
-public class BearerAdmissionResponse implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private BerInteger numErabList = null;
-	private ERABResponse erabResponse = null;
-	
-	public BearerAdmissionResponse() {
-	}
-
-	public BearerAdmissionResponse(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setNumErabList(BerInteger numErabList) {
-		this.numErabList = numErabList;
-	}
-
-	public BerInteger getNumErabList() {
-		return numErabList;
-	}
-
-	public void setErabResponse(ERABResponse erabResponse) {
-		this.erabResponse = erabResponse;
-	}
-
-	public ERABResponse getErabResponse() {
-		return erabResponse;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += erabResponse.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += numErabList.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			numErabList = new BerInteger();
-			subCodeLength += numErabList.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			erabResponse = new ERABResponse();
-			subCodeLength += erabResponse.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (numErabList != null) {
-			sb.append("numErabList: ").append(numErabList);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (erabResponse != null) {
-			sb.append("erabResponse: ");
-			erabResponse.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, ERABParams erabParams, BerInteger numParams, boolean b) {
-		ERABResponse erabResponse = new ERABResponse();
-
-		for (int i = 0; i < numParams.intValue(); i++) {
-			ERABParamsItem erabParamsItem = erabParams.getERABParamsItem().get(i);
-
-			ERABResponseItem responseItem = new ERABResponseItem();
-			responseItem.setId(erabParamsItem.getId());
-
-			// FIXME: add logic
-			responseItem.setDecision(new ERABDecision(b ? 0 : 1));
-
-			erabResponse.setERABResponse(responseItem);
-		}
-
-
-		BearerAdmissionResponse bearerAdmissionResponse = new BearerAdmissionResponse();
-		bearerAdmissionResponse.setCrnti(crnti);
-		bearerAdmissionResponse.setEcgi(ecgi);
-		bearerAdmissionResponse.setErabResponse(erabResponse);
-		bearerAdmissionResponse.setNumErabList(numParams);
-
-		XrancPduBody body = new XrancPduBody();
-		body.setBearerAdmissionResponse(bearerAdmissionResponse);
-
-		BerUTF8String ver = null;
-		try {
-			ver = new BerUTF8String("3");
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-		XrancApiID apiID = new XrancApiID(9);
-		XrancPduHdr hdr = new XrancPduHdr();
-		hdr.setVer(ver);
-		hdr.setApiId(apiID);
-
-		XrancPdu pdu = new XrancPdu();
-		pdu.setHdr(hdr);
-		pdu.setBody(body);
-
-		return pdu;
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionStatus.java b/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionStatus.java
deleted file mode 100644
index f9c6476..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionStatus.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.ERABResponse;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-public class BearerAdmissionStatus implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private BerInteger numErabs = null;
-	private ERABResponse erabResponse = null;
-	
-	public BearerAdmissionStatus() {
-	}
-
-	public BearerAdmissionStatus(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setNumErabs(BerInteger numErabs) {
-		this.numErabs = numErabs;
-	}
-
-	public BerInteger getNumErabs() {
-		return numErabs;
-	}
-
-	public void setErabResponse(ERABResponse erabResponse) {
-		this.erabResponse = erabResponse;
-	}
-
-	public ERABResponse getErabResponse() {
-		return erabResponse;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += erabResponse.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += numErabs.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			numErabs = new BerInteger();
-			subCodeLength += numErabs.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			erabResponse = new ERABResponse();
-			subCodeLength += erabResponse.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (numErabs != null) {
-			sb.append("numErabs: ").append(numErabs);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (erabResponse != null) {
-			sb.append("erabResponse: ");
-			erabResponse.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/BearerReleaseInd.java b/src/main/java/org.onosproject.xran/codecs/pdu/BearerReleaseInd.java
deleted file mode 100644
index 055c8be..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/BearerReleaseInd.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.ERABID;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class BearerReleaseInd implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class ErabIds implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<ERABID> seqOf = null;
-
-		public ErabIds() {
-			seqOf = new ArrayList<ERABID>();
-		}
-
-		public ErabIds(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<ERABID> getERABID() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<ERABID>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				ERABID element = new ERABID();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<ERABID> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private BerInteger numErabs = null;
-	private ErabIds erabIds = null;
-	
-	public BearerReleaseInd() {
-	}
-
-	public BearerReleaseInd(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setNumErabs(BerInteger numErabs) {
-		this.numErabs = numErabs;
-	}
-
-	public BerInteger getNumErabs() {
-		return numErabs;
-	}
-
-	public void setErabIds(ErabIds erabIds) {
-		this.erabIds = erabIds;
-	}
-
-	public ErabIds getErabIds() {
-		return erabIds;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += erabIds.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += numErabs.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			numErabs = new BerInteger();
-			subCodeLength += numErabs.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			erabIds = new ErabIds();
-			subCodeLength += erabIds.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (numErabs != null) {
-			sb.append("numErabs: ").append(numErabs);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (erabIds != null) {
-			sb.append("erabIds: ");
-			erabIds.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigReport.java b/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigReport.java
deleted file mode 100644
index c45760d..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigReport.java
+++ /dev/null
@@ -1,739 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerBoolean;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.api.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class CellConfigReport implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class CandScells implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<CandScell> seqOf = null;
-
-		public CandScells() {
-			seqOf = new ArrayList<CandScell>();
-		}
-
-		public CandScells(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<CandScell> getCandScells() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<CandScell>();
-			}
-			return seqOf;
-		}
-
-		public void setCandScells(CandScell candScell) {
-			seqOf.add(candScell);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				CandScell element = new CandScell();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<CandScell> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private ECGI ecgi = null;
-	private PhysCellId pci = null;
-	private CandScells candScells = null;
-	private ARFCNValue earfcnDl = null;
-	private ARFCNValue earfcnUl = null;
-	private BerInteger rbsPerTtiDl = null;
-	private BerInteger rbsPerTtiUl = null;
-	private BerInteger numTxAntenna = null;
-	private DuplexMode duplexMode = null;
-	private BerInteger tddConfig = null;
-	private BerInteger tddSplSfConfig = null;
-	private BerInteger maxNumConnectedUes = null;
-	private BerInteger maxNumConnectedBearers = null;
-	private BerInteger maxNumUesSchedPerTtiDl = null;
-	private BerInteger maxNumUesSchedPerTtiUl = null;
-	private BerBoolean dlfsSchedEnable = null;
-	
-	public CellConfigReport() {
-	}
-
-	public CellConfigReport(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setPci(PhysCellId pci) {
-		this.pci = pci;
-	}
-
-	public PhysCellId getPci() {
-		return pci;
-	}
-
-	public void setCandScells(CandScells candScells) {
-		this.candScells = candScells;
-	}
-
-	public CandScells getCandScells() {
-		return candScells;
-	}
-
-	public void setEarfcnDl(ARFCNValue earfcnDl) {
-		this.earfcnDl = earfcnDl;
-	}
-
-	public ARFCNValue getEarfcnDl() {
-		return earfcnDl;
-	}
-
-	public void setEarfcnUl(ARFCNValue earfcnUl) {
-		this.earfcnUl = earfcnUl;
-	}
-
-	public ARFCNValue getEarfcnUl() {
-		return earfcnUl;
-	}
-
-	public void setRbsPerTtiDl(BerInteger rbsPerTtiDl) {
-		this.rbsPerTtiDl = rbsPerTtiDl;
-	}
-
-	public BerInteger getRbsPerTtiDl() {
-		return rbsPerTtiDl;
-	}
-
-	public void setRbsPerTtiUl(BerInteger rbsPerTtiUl) {
-		this.rbsPerTtiUl = rbsPerTtiUl;
-	}
-
-	public BerInteger getRbsPerTtiUl() {
-		return rbsPerTtiUl;
-	}
-
-	public void setNumTxAntenna(BerInteger numTxAntenna) {
-		this.numTxAntenna = numTxAntenna;
-	}
-
-	public BerInteger getNumTxAntenna() {
-		return numTxAntenna;
-	}
-
-	public void setDuplexMode(DuplexMode duplexMode) {
-		this.duplexMode = duplexMode;
-	}
-
-	public DuplexMode getDuplexMode() {
-		return duplexMode;
-	}
-
-	public void setTddConfig(BerInteger tddConfig) {
-		this.tddConfig = tddConfig;
-	}
-
-	public BerInteger getTddConfig() {
-		return tddConfig;
-	}
-
-	public void setTddSplSfConfig(BerInteger tddSplSfConfig) {
-		this.tddSplSfConfig = tddSplSfConfig;
-	}
-
-	public BerInteger getTddSplSfConfig() {
-		return tddSplSfConfig;
-	}
-
-	public void setMaxNumConnectedUes(BerInteger maxNumConnectedUes) {
-		this.maxNumConnectedUes = maxNumConnectedUes;
-	}
-
-	public BerInteger getMaxNumConnectedUes() {
-		return maxNumConnectedUes;
-	}
-
-	public void setMaxNumConnectedBearers(BerInteger maxNumConnectedBearers) {
-		this.maxNumConnectedBearers = maxNumConnectedBearers;
-	}
-
-	public BerInteger getMaxNumConnectedBearers() {
-		return maxNumConnectedBearers;
-	}
-
-	public void setMaxNumUesSchedPerTtiDl(BerInteger maxNumUesSchedPerTtiDl) {
-		this.maxNumUesSchedPerTtiDl = maxNumUesSchedPerTtiDl;
-	}
-
-	public BerInteger getMaxNumUesSchedPerTtiDl() {
-		return maxNumUesSchedPerTtiDl;
-	}
-
-	public void setMaxNumUesSchedPerTtiUl(BerInteger maxNumUesSchedPerTtiUl) {
-		this.maxNumUesSchedPerTtiUl = maxNumUesSchedPerTtiUl;
-	}
-
-	public BerInteger getMaxNumUesSchedPerTtiUl() {
-		return maxNumUesSchedPerTtiUl;
-	}
-
-	public void setDlfsSchedEnable(BerBoolean dlfsSchedEnable) {
-		this.dlfsSchedEnable = dlfsSchedEnable;
-	}
-
-	public BerBoolean getDlfsSchedEnable() {
-		return dlfsSchedEnable;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += dlfsSchedEnable.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 15
-		os.write(0x8F);
-		codeLength += 1;
-		
-		codeLength += maxNumUesSchedPerTtiUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 14
-		os.write(0x8E);
-		codeLength += 1;
-		
-		codeLength += maxNumUesSchedPerTtiDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 13
-		os.write(0x8D);
-		codeLength += 1;
-		
-		codeLength += maxNumConnectedBearers.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 12
-		os.write(0x8C);
-		codeLength += 1;
-		
-		codeLength += maxNumConnectedUes.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 11
-		os.write(0x8B);
-		codeLength += 1;
-		
-		if (tddSplSfConfig != null) {
-			codeLength += tddSplSfConfig.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 10
-			os.write(0x8A);
-			codeLength += 1;
-		}
-		
-		if (tddConfig != null) {
-			codeLength += tddConfig.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 9
-			os.write(0x89);
-			codeLength += 1;
-		}
-		
-		codeLength += duplexMode.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 8
-		os.write(0x88);
-		codeLength += 1;
-		
-		codeLength += numTxAntenna.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 7
-		os.write(0x87);
-		codeLength += 1;
-		
-		codeLength += rbsPerTtiUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 6
-		os.write(0x86);
-		codeLength += 1;
-		
-		codeLength += rbsPerTtiDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 5
-		os.write(0x85);
-		codeLength += 1;
-		
-		codeLength += earfcnUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 4
-		os.write(0x84);
-		codeLength += 1;
-		
-		codeLength += earfcnDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-		os.write(0x83);
-		codeLength += 1;
-		
-		codeLength += candScells.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += pci.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			pci = new PhysCellId();
-			subCodeLength += pci.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			candScells = new CandScells();
-			subCodeLength += candScells.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
-			earfcnDl = new ARFCNValue();
-			subCodeLength += earfcnDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
-			earfcnUl = new ARFCNValue();
-			subCodeLength += earfcnUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 5)) {
-			rbsPerTtiDl = new BerInteger();
-			subCodeLength += rbsPerTtiDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 6)) {
-			rbsPerTtiUl = new BerInteger();
-			subCodeLength += rbsPerTtiUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 7)) {
-			numTxAntenna = new BerInteger();
-			subCodeLength += numTxAntenna.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 8)) {
-			duplexMode = new DuplexMode();
-			subCodeLength += duplexMode.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 9)) {
-			tddConfig = new BerInteger();
-			subCodeLength += tddConfig.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 10)) {
-			tddSplSfConfig = new BerInteger();
-			subCodeLength += tddSplSfConfig.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 11)) {
-			maxNumConnectedUes = new BerInteger();
-			subCodeLength += maxNumConnectedUes.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 12)) {
-			maxNumConnectedBearers = new BerInteger();
-			subCodeLength += maxNumConnectedBearers.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 13)) {
-			maxNumUesSchedPerTtiDl = new BerInteger();
-			subCodeLength += maxNumUesSchedPerTtiDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 14)) {
-			maxNumUesSchedPerTtiUl = new BerInteger();
-			subCodeLength += maxNumUesSchedPerTtiUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 15)) {
-			dlfsSchedEnable = new BerBoolean();
-			subCodeLength += dlfsSchedEnable.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pci != null) {
-			sb.append("pci: ").append(pci);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (candScells != null) {
-			sb.append("candScells: ");
-			candScells.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (earfcnDl != null) {
-			sb.append("earfcnDl: ").append(earfcnDl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (earfcnUl != null) {
-			sb.append("earfcnUl: ").append(earfcnUl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (rbsPerTtiDl != null) {
-			sb.append("rbsPerTtiDl: ").append(rbsPerTtiDl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (rbsPerTtiUl != null) {
-			sb.append("rbsPerTtiUl: ").append(rbsPerTtiUl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (numTxAntenna != null) {
-			sb.append("numTxAntenna: ").append(numTxAntenna);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (duplexMode != null) {
-			sb.append("duplexMode: ").append(duplexMode);
-		}
-		
-		if (tddConfig != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("tddConfig: ").append(tddConfig);
-		}
-		
-		if (tddSplSfConfig != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("tddSplSfConfig: ").append(tddSplSfConfig);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (maxNumConnectedUes != null) {
-			sb.append("maxNumConnectedUes: ").append(maxNumConnectedUes);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (maxNumConnectedBearers != null) {
-			sb.append("maxNumConnectedBearers: ").append(maxNumConnectedBearers);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (maxNumUesSchedPerTtiDl != null) {
-			sb.append("maxNumUesSchedPerTtiDl: ").append(maxNumUesSchedPerTtiDl);
-		}
-
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (maxNumUesSchedPerTtiUl != null) {
-			sb.append("maxNumUesSchedPerTtiUl: ").append(maxNumUesSchedPerTtiUl);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (dlfsSchedEnable != null) {
-			sb.append("dlfsSchedEnable: ").append(dlfsSchedEnable);
-		}
-
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigRequest.java b/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigRequest.java
deleted file mode 100644
index 4f5e20b..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigRequest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-
-public class CellConfigRequest implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private ECGI ecgi = null;
-	
-	public CellConfigRequest() {
-	}
-
-	public CellConfigRequest(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	public static XrancPdu constructPacket(ECGI ecgi) throws UnsupportedEncodingException {
-		CellConfigRequest cellConfigRequest = new CellConfigRequest();
-		cellConfigRequest.setEcgi(ecgi);
-
-		BerUTF8String ver = new BerUTF8String("3");
-
-		XrancApiID apiID = new XrancApiID(0);
-		XrancPduBody body = new XrancPduBody();
-		body.setCellConfigRequest(cellConfigRequest);
-
-		XrancPduHdr hdr = new XrancPduHdr();
-		hdr.setVer(ver);
-		hdr.setApiId(apiID);
-
-		XrancPdu pdu = new XrancPdu();
-		pdu.setBody(body);
-		pdu.setHdr(hdr);
-
-		return pdu;
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/HOComplete.java b/src/main/java/org.onosproject.xran/codecs/pdu/HOComplete.java
deleted file mode 100644
index 68ae5c1..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/HOComplete.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class HOComplete implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private ECGI ecgiT = null;
-	private ECGI ecgiS = null;
-	private CRNTI crntiNew = null;
-	
-	public HOComplete() {
-	}
-
-	public HOComplete(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgiT(ECGI ecgiT) {
-		this.ecgiT = ecgiT;
-	}
-
-	public ECGI getEcgiT() {
-		return ecgiT;
-	}
-
-	public void setEcgiS(ECGI ecgiS) {
-		this.ecgiS = ecgiS;
-	}
-
-	public ECGI getEcgiS() {
-		return ecgiS;
-	}
-
-	public void setCrntiNew(CRNTI crntiNew) {
-		this.crntiNew = crntiNew;
-	}
-
-	public CRNTI getCrntiNew() {
-		return crntiNew;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += crntiNew.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgiS.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += ecgiT.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgiT = new ECGI();
-			subCodeLength += ecgiT.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgiS = new ECGI();
-			subCodeLength += ecgiS.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			crntiNew = new CRNTI();
-			subCodeLength += crntiNew.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgiT != null) {
-			sb.append("ecgiT: ");
-			ecgiT.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgiS != null) {
-			sb.append("ecgiS: ");
-			ecgiS.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crntiNew != null) {
-			sb.append("crntiNew: ").append(crntiNew);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/HOFailure.java b/src/main/java/org.onosproject.xran/codecs/pdu/HOFailure.java
deleted file mode 100644
index ac42dcd..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/HOFailure.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.HOFailureCause;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-public class HOFailure implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private HOFailureCause cause = null;
-	
-	public HOFailure() {
-	}
-
-	public HOFailure(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCause(HOFailureCause cause) {
-		this.cause = cause;
-	}
-
-	public HOFailureCause getCause() {
-		return cause;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += cause.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			cause = new HOFailureCause();
-			subCodeLength += cause.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (cause != null) {
-			sb.append("cause: ").append(cause);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/HORequest.java b/src/main/java/org.onosproject.xran/codecs/pdu/HORequest.java
deleted file mode 100644
index 38218d7..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/HORequest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-
-public class HORequest implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgiS = null;
-	private ECGI ecgiT = null;
-	
-	public HORequest() {
-	}
-
-	public HORequest(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgiS(ECGI ecgiS) {
-		this.ecgiS = ecgiS;
-	}
-
-	public ECGI getEcgiS() {
-		return ecgiS;
-	}
-
-	public void setEcgiT(ECGI ecgiT) {
-		this.ecgiT = ecgiT;
-	}
-
-	public ECGI getEcgiT() {
-		return ecgiT;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += ecgiT.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += ecgiS.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgiS = new ECGI();
-			subCodeLength += ecgiS.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			ecgiT = new ECGI();
-			subCodeLength += ecgiT.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgiS != null) {
-			sb.append("ecgiS: ");
-			ecgiS.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgiT != null) {
-			sb.append("ecgiT: ");
-			ecgiT.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	public static XrancPdu constructPacket(CRNTI crnti, ECGI ecgis, ECGI ecgit) throws UnsupportedEncodingException {
-		HORequest hoRequest = new HORequest();
-
-		hoRequest.setCrnti(crnti);
-		hoRequest.setEcgiS(ecgis);
-		hoRequest.setEcgiT(ecgit);
-
-		BerUTF8String ver = new BerUTF8String("3");
-
-		XrancApiID apiID = new XrancApiID(12);
-		XrancPduBody body = new XrancPduBody();
-		body.setHORequest(hoRequest);
-
-		XrancPduHdr hdr = new XrancPduHdr();
-		hdr.setVer(ver);
-		hdr.setApiId(apiID);
-
-		XrancPdu pdu = new XrancPdu();
-		pdu.setBody(body);
-		pdu.setHdr(hdr);
-
-		return pdu;
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/L2MeasConfig.java b/src/main/java/org.onosproject.xran/codecs/pdu/L2MeasConfig.java
deleted file mode 100644
index 4e1f958..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/L2MeasConfig.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-
-public class L2MeasConfig implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private ECGI ecgi = null;
-	private BerInteger  reportIntervalMs = null;
-	
-	public L2MeasConfig() {
-	}
-
-	public L2MeasConfig(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setReportIntervalMs(BerInteger reportIntervalMs) {
-		this.reportIntervalMs = reportIntervalMs;
-	}
-
-	public BerInteger getReportIntervalMs() {
-		return reportIntervalMs;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += reportIntervalMs.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			reportIntervalMs = new BerInteger();
-			subCodeLength += reportIntervalMs.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (reportIntervalMs != null) {
-			sb.append("reportIntervalMs: ").append(reportIntervalMs);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	public static XrancPdu constructPacket(ECGI ecgi, int l2MeasInterval) {
-
-		BerInteger reportIntervalMS = new BerInteger(l2MeasInterval);
-		L2MeasConfig measConfig = new L2MeasConfig();
-		measConfig.setEcgi(ecgi);
-		measConfig.setReportIntervalMs(reportIntervalMS);
-
-		BerUTF8String ver = null;
-		try {
-			ver = new BerUTF8String("3");
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-
-		XrancApiID apiID = new XrancApiID(17);
-		XrancPduBody body = new XrancPduBody();
-		body.setL2MeasConfig(measConfig);
-
-		XrancPduHdr hdr = new XrancPduHdr();
-		hdr.setVer(ver);
-		hdr.setApiId(apiID);
-
-		XrancPdu pdu = new XrancPdu();
-		pdu.setBody(body);
-		pdu.setHdr(hdr);
-
-		return pdu;
-
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/PDCPMeasReportPerUe.java b/src/main/java/org.onosproject.xran/codecs/pdu/PDCPMeasReportPerUe.java
deleted file mode 100644
index b2ed3a3..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/PDCPMeasReportPerUe.java
+++ /dev/null
@@ -1,1792 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import java.io.IOException;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.QCI;
-import org.onosproject.xran.codecs.ber.*;
-import org.onosproject.xran.codecs.ber.types.*;
-import org.onosproject.xran.codecs.ber.types.string.*;
-
-
-
-public class PDCPMeasReportPerUe implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class QciVals implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<QCI> seqOf = null;
-
-		public QciVals() {
-			seqOf = new ArrayList<QCI>();
-		}
-
-		public QciVals(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<QCI> getQCI() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<QCI>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				QCI element = new QCI();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<QCI> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setQCI(QCI qci) {
-			seqOf.add(qci);
-		}
-	}
-
-	public static class DataVolDl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public DataVolDl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public DataVolDl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class DataVolUl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public DataVolUl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public DataVolUl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class PktDelayDl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PktDelayDl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PktDelayDl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class PktDelayUl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PktDelayUl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PktDelayUl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class PktDiscardRateDl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PktDiscardRateDl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PktDiscardRateDl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class PktLossRateDl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PktLossRateDl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PktLossRateDl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class PktLossRateUl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PktLossRateUl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PktLossRateUl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class ThroughputDl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public ThroughputDl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public ThroughputDl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static class ThroughputUl implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public ThroughputUl() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public ThroughputUl(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private ECGI ecgi = null;
-	private CRNTI crnti = null;
-	private QciVals qciVals = null;
-	private DataVolDl dataVolDl = null;
-	private DataVolUl dataVolUl = null;
-	private PktDelayDl pktDelayDl = null;
-	private PktDelayUl pktDelayUl = null;
-	private PktDiscardRateDl pktDiscardRateDl = null;
-	private PktLossRateDl pktLossRateDl = null;
-	private PktLossRateUl pktLossRateUl = null;
-	private ThroughputDl throughputDl = null;
-	private ThroughputUl throughputUl = null;
-	
-	public PDCPMeasReportPerUe() {
-	}
-
-	public PDCPMeasReportPerUe(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setQciVals(QciVals qciVals) {
-		this.qciVals = qciVals;
-	}
-
-	public QciVals getQciVals() {
-		return qciVals;
-	}
-
-	public void setDataVolDl(DataVolDl dataVolDl) {
-		this.dataVolDl = dataVolDl;
-	}
-
-	public DataVolDl getDataVolDl() {
-		return dataVolDl;
-	}
-
-	public void setDataVolUl(DataVolUl dataVolUl) {
-		this.dataVolUl = dataVolUl;
-	}
-
-	public DataVolUl getDataVolUl() {
-		return dataVolUl;
-	}
-
-	public void setPktDelayDl(PktDelayDl pktDelayDl) {
-		this.pktDelayDl = pktDelayDl;
-	}
-
-	public PktDelayDl getPktDelayDl() {
-		return pktDelayDl;
-	}
-
-	public void setPktDelayUl(PktDelayUl pktDelayUl) {
-		this.pktDelayUl = pktDelayUl;
-	}
-
-	public PktDelayUl getPktDelayUl() {
-		return pktDelayUl;
-	}
-
-	public void setPktDiscardRateDl(PktDiscardRateDl pktDiscardRateDl) {
-		this.pktDiscardRateDl = pktDiscardRateDl;
-	}
-
-	public PktDiscardRateDl getPktDiscardRateDl() {
-		return pktDiscardRateDl;
-	}
-
-	public void setPktLossRateDl(PktLossRateDl pktLossRateDl) {
-		this.pktLossRateDl = pktLossRateDl;
-	}
-
-	public PktLossRateDl getPktLossRateDl() {
-		return pktLossRateDl;
-	}
-
-	public void setPktLossRateUl(PktLossRateUl pktLossRateUl) {
-		this.pktLossRateUl = pktLossRateUl;
-	}
-
-	public PktLossRateUl getPktLossRateUl() {
-		return pktLossRateUl;
-	}
-
-	public void setThroughputDl(ThroughputDl throughputDl) {
-		this.throughputDl = throughputDl;
-	}
-
-	public ThroughputDl getThroughputDl() {
-		return throughputDl;
-	}
-
-	public void setThroughputUl(ThroughputUl throughputUl) {
-		this.throughputUl = throughputUl;
-	}
-
-	public ThroughputUl getThroughputUl() {
-		return throughputUl;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += throughputUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 11
-		os.write(0xAB);
-		codeLength += 1;
-		
-		codeLength += throughputDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 10
-		os.write(0xAA);
-		codeLength += 1;
-		
-		codeLength += pktLossRateUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 9
-		os.write(0xA9);
-		codeLength += 1;
-		
-		codeLength += pktLossRateDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 8
-		os.write(0xA8);
-		codeLength += 1;
-		
-		codeLength += pktDiscardRateDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 7
-		os.write(0xA7);
-		codeLength += 1;
-		
-		codeLength += pktDelayUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 6
-		os.write(0xA6);
-		codeLength += 1;
-		
-		codeLength += pktDelayDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 5
-		os.write(0xA5);
-		codeLength += 1;
-		
-		codeLength += dataVolUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 4
-		os.write(0xA4);
-		codeLength += 1;
-		
-		codeLength += dataVolDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += qciVals.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			qciVals = new QciVals();
-			subCodeLength += qciVals.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			dataVolDl = new DataVolDl();
-			subCodeLength += dataVolDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
-			dataVolUl = new DataVolUl();
-			subCodeLength += dataVolUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 5)) {
-			pktDelayDl = new PktDelayDl();
-			subCodeLength += pktDelayDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 6)) {
-			pktDelayUl = new PktDelayUl();
-			subCodeLength += pktDelayUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 7)) {
-			pktDiscardRateDl = new PktDiscardRateDl();
-			subCodeLength += pktDiscardRateDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 8)) {
-			pktLossRateDl = new PktLossRateDl();
-			subCodeLength += pktLossRateDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 9)) {
-			pktLossRateUl = new PktLossRateUl();
-			subCodeLength += pktLossRateUl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 10)) {
-			throughputDl = new ThroughputDl();
-			subCodeLength += throughputDl.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 11)) {
-			throughputUl = new ThroughputUl();
-			subCodeLength += throughputUl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (qciVals != null) {
-			sb.append("qciVals: ");
-			qciVals.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (dataVolDl != null) {
-			sb.append("dataVolDl: ");
-			dataVolDl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (dataVolUl != null) {
-			sb.append("dataVolUl: ");
-			dataVolUl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pktDelayDl != null) {
-			sb.append("pktDelayDl: ");
-			pktDelayDl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pktDelayUl != null) {
-			sb.append("pktDelayUl: ");
-			pktDelayUl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pktDiscardRateDl != null) {
-			sb.append("pktDiscardRateDl: ");
-			pktDiscardRateDl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pktLossRateDl != null) {
-			sb.append("pktLossRateDl: ");
-			pktLossRateDl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pktLossRateUl != null) {
-			sb.append("pktLossRateUl: ");
-			pktLossRateUl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (throughputDl != null) {
-			sb.append("throughputDl: ");
-			throughputDl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (throughputUl != null) {
-			sb.append("throughputUl: ");
-			throughputUl.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfigStatus.java b/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfigStatus.java
deleted file mode 100644
index 015e8fe..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfigStatus.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-
-public class RRMConfigStatus implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class Crnti implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<CRNTI> seqOf = null;
-
-		public Crnti() {
-			seqOf = new ArrayList<CRNTI>();
-		}
-
-		public Crnti(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<CRNTI> getCRNTI() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<CRNTI>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				CRNTI element = new CRNTI();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<CRNTI> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class Status implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerEnum> seqOf = null;
-
-		public Status() {
-			seqOf = new ArrayList<BerEnum>();
-		}
-
-		public Status(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<BerEnum> getBerEnum() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerEnum>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerEnum element = new BerEnum();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerEnum> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private ECGI ecgi = null;
-	private Crnti crnti = null;
-	private Status status = null;
-	
-	public RRMConfigStatus() {
-	}
-
-	public RRMConfigStatus(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCrnti(Crnti crnti) {
-		this.crnti = crnti;
-	}
-
-	public Crnti getCrnti() {
-		return crnti;
-	}
-
-	public void setStatus(Status status) {
-		this.status = status;
-	}
-
-	public Status getStatus() {
-		return status;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += status.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		if (crnti != null) {
-			codeLength += crnti.encode(os, false);
-			// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-			os.write(0xA1);
-			codeLength += 1;
-		}
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			crnti = new Crnti();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			status = new Status();
-			subCodeLength += status.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		if (crnti != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("crnti: ");
-			crnti.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (status != null) {
-			sb.append("status: ");
-			status.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasConfig.java b/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasConfig.java
deleted file mode 100644
index 02b7cf3..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasConfig.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class RXSigMeasConfig implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class MeasCells implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<PCIARFCN> seqOf = null;
-
-		public MeasCells() {
-			seqOf = new ArrayList<PCIARFCN>();
-		}
-
-		public MeasCells(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<PCIARFCN> getPCIARFCN() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<PCIARFCN>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				PCIARFCN element = new PCIARFCN();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<PCIARFCN> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-        public void setPCIARFCN(PCIARFCN pciarfcn) {
-			seqOf.add(pciarfcn);
-        }
-    }
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private ECGI ecgi = null;
-	private CRNTI crnti = null;
-	private RXSigRepQty reportQty = null;
-	private MeasCells measCells = null;
-	private RXSigMeasRepInterval reportInterval = null;
-	
-	public RXSigMeasConfig() {
-	}
-
-	public RXSigMeasConfig(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setReportQty(RXSigRepQty reportQty) {
-		this.reportQty = reportQty;
-	}
-
-	public RXSigRepQty getReportQty() {
-		return reportQty;
-	}
-
-	public void setMeasCells(MeasCells measCells) {
-		this.measCells = measCells;
-	}
-
-	public MeasCells getMeasCells() {
-		return measCells;
-	}
-
-	public void setReportInterval(RXSigMeasRepInterval reportInterval) {
-		this.reportInterval = reportInterval;
-	}
-
-	public RXSigMeasRepInterval getReportInterval() {
-		return reportInterval;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += reportInterval.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 4
-		os.write(0x84);
-		codeLength += 1;
-		
-		codeLength += measCells.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += reportQty.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			reportQty = new RXSigRepQty();
-			subCodeLength += reportQty.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			measCells = new MeasCells();
-			subCodeLength += measCells.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
-			reportInterval = new RXSigMeasRepInterval();
-			subCodeLength += reportInterval.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (reportQty != null) {
-			sb.append("reportQty: ").append(reportQty);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (measCells != null) {
-			sb.append("measCells: ");
-			measCells.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (reportInterval != null) {
-			sb.append("reportInterval: ").append(reportInterval);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, RXSigMeasConfig.MeasCells measCells, int interval) {
-		RXSigRepQty rxSigRepQty = new RXSigRepQty(2);
-		RXSigMeasRepInterval repInterval = new RXSigMeasRepInterval(interval);
-
-		RXSigMeasConfig sigMeasConfig = new RXSigMeasConfig();
-		sigMeasConfig.setCrnti(crnti);
-		sigMeasConfig.setEcgi(ecgi);
-		sigMeasConfig.setReportQty(rxSigRepQty);
-		sigMeasConfig.setMeasCells(measCells);
-		sigMeasConfig.setReportInterval(repInterval);
-
-		XrancPduBody body = new XrancPduBody();
-		body.setRXSigMeasConfig(sigMeasConfig);
-
-		BerUTF8String ver = null;
-		try {
-			ver = new BerUTF8String("3");
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-		XrancApiID apiID = new XrancApiID(15);
-		XrancPduHdr hdr = new XrancPduHdr();
-		hdr.setVer(ver);
-		hdr.setApiId(apiID);
-
-		XrancPdu pdu = new XrancPdu();
-		pdu.setHdr(hdr);
-		pdu.setBody(body);
-
-		return pdu;
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasReport.java b/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasReport.java
deleted file mode 100644
index e6d735e..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasReport.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.RXSigReport;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class RXSigMeasReport implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class CellMeasReports implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<RXSigReport> seqOf = null;
-
-		public CellMeasReports() {
-			seqOf = new ArrayList<RXSigReport>();
-		}
-
-		public CellMeasReports(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<RXSigReport> getRXSigReport() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<RXSigReport>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				RXSigReport element = new RXSigReport();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<RXSigReport> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setRXSigReport(RXSigReport rxSigReport) {
-			seqOf.add(rxSigReport);
-		}
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private CellMeasReports cellMeasReports = null;
-	
-	public RXSigMeasReport() {
-	}
-
-	public RXSigMeasReport(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCellMeasReports(CellMeasReports cellMeasReports) {
-		this.cellMeasReports = cellMeasReports;
-	}
-
-	public CellMeasReports getCellMeasReports() {
-		return cellMeasReports;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += cellMeasReports.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			cellMeasReports = new CellMeasReports();
-			subCodeLength += cellMeasReports.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (cellMeasReports != null) {
-			sb.append("cellMeasReports: ");
-			cellMeasReports.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/RadioMeasReportPerCell.java b/src/main/java/org.onosproject.xran/codecs/pdu/RadioMeasReportPerCell.java
deleted file mode 100644
index bb1c59a..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RadioMeasReportPerCell.java
+++ /dev/null
@@ -1,468 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-
-public class RadioMeasReportPerCell implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class PuschIntfPowerHist implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PuschIntfPowerHist() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PuschIntfPowerHist(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class PucchIntfPowerHist implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerInteger> seqOf = null;
-
-		public PucchIntfPowerHist() {
-			seqOf = new ArrayList<BerInteger>();
-		}
-
-		public PucchIntfPowerHist(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<BerInteger> getBerInteger() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerInteger>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerInteger element = new BerInteger();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerInteger> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setBerInteger(BerInteger berInteger) {
-			seqOf.add(berInteger);
-		}
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private ECGI ecgi = null;
-	private PuschIntfPowerHist puschIntfPowerHist = null;
-	private PucchIntfPowerHist pucchIntfPowerHist = null;
-	
-	public RadioMeasReportPerCell() {
-	}
-
-	public RadioMeasReportPerCell(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setPuschIntfPowerHist(PuschIntfPowerHist puschIntfPowerHist) {
-		this.puschIntfPowerHist = puschIntfPowerHist;
-	}
-
-	public PuschIntfPowerHist getPuschIntfPowerHist() {
-		return puschIntfPowerHist;
-	}
-
-	public void setPucchIntfPowerHist(PucchIntfPowerHist pucchIntfPowerHist) {
-		this.pucchIntfPowerHist = pucchIntfPowerHist;
-	}
-
-	public PucchIntfPowerHist getPucchIntfPowerHist() {
-		return pucchIntfPowerHist;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += pucchIntfPowerHist.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += puschIntfPowerHist.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			puschIntfPowerHist = new PuschIntfPowerHist();
-			subCodeLength += puschIntfPowerHist.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			pucchIntfPowerHist = new PucchIntfPowerHist();
-			subCodeLength += pucchIntfPowerHist.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (puschIntfPowerHist != null) {
-			sb.append("puschIntfPowerHist: ");
-			puschIntfPowerHist.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (pucchIntfPowerHist != null) {
-			sb.append("pucchIntfPowerHist: ");
-			pucchIntfPowerHist.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/RadioMeasReportPerUE.java b/src/main/java/org.onosproject.xran/codecs/pdu/RadioMeasReportPerUE.java
deleted file mode 100644
index 7b6b17c..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RadioMeasReportPerUE.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.RadioRepPerServCell;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class RadioMeasReportPerUE implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class RadioReportServCells implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<RadioRepPerServCell> seqOf = null;
-
-		public RadioReportServCells() {
-			seqOf = new ArrayList<RadioRepPerServCell>();
-		}
-
-		public RadioReportServCells(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<RadioRepPerServCell> getRadioRepPerServCell() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<RadioRepPerServCell>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				RadioRepPerServCell element = new RadioRepPerServCell();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<RadioRepPerServCell> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-		public void setRadioRepPerServCell(RadioRepPerServCell radioRepPerServCell) {
-			seqOf.add(radioRepPerServCell);
-		}
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private ECGI ecgi = null;
-	private CRNTI crnti = null;
-	private RadioReportServCells radioReportServCells = null;
-	
-	public RadioMeasReportPerUE() {
-	}
-
-	public RadioMeasReportPerUE(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setRadioReportServCells(RadioReportServCells radioReportServCells) {
-		this.radioReportServCells = radioReportServCells;
-	}
-
-	public RadioReportServCells getRadioReportServCells() {
-		return radioReportServCells;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += radioReportServCells.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			radioReportServCells = new RadioReportServCells();
-			subCodeLength += radioReportServCells.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (radioReportServCells != null) {
-			sb.append("radioReportServCells: ");
-			radioReportServCells.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellAddStatus.java b/src/main/java/org.onosproject.xran/codecs/pdu/ScellAddStatus.java
deleted file mode 100644
index 1efc52f..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellAddStatus.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class ScellAddStatus implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class ScellsInd implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<PCIARFCN> seqOf = null;
-
-		public ScellsInd() {
-			seqOf = new ArrayList<PCIARFCN>();
-		}
-
-		public ScellsInd(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<PCIARFCN> getPCIARFCN() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<PCIARFCN>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				PCIARFCN element = new PCIARFCN();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<PCIARFCN> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static class Status implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore public byte[] code = null;
-		private List<BerEnum> seqOf = null;
-
-		public Status() {
-			seqOf = new ArrayList<BerEnum>();
-		}
-
-		public Status(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<BerEnum> getBerEnum() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<BerEnum>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				BerEnum element = new BerEnum();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<BerEnum> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private ScellsInd scellsInd = null;
-	private Status status = null;
-	
-	public ScellAddStatus() {
-	}
-
-	public ScellAddStatus(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setScellsInd(ScellsInd scellsInd) {
-		this.scellsInd = scellsInd;
-	}
-
-	public ScellsInd getScellsInd() {
-		return scellsInd;
-	}
-
-	public void setStatus(Status status) {
-		this.status = status;
-	}
-
-	public Status getStatus() {
-		return status;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += status.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += scellsInd.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			scellsInd = new ScellsInd();
-			subCodeLength += scellsInd.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			status = new Status();
-			subCodeLength += status.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (scellsInd != null) {
-			sb.append("scellsInd: ");
-			scellsInd.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (status != null) {
-			sb.append("status: ");
-			status.appendAsString(sb, indentLevel + 1);
-		}
-
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/SchedMeasReportPerCell.java b/src/main/java/org.onosproject.xran/codecs/pdu/SchedMeasReportPerCell.java
deleted file mode 100644
index 80821b8..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/SchedMeasReportPerCell.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PRBUsage;
-import org.onosproject.xran.codecs.api.QCI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-
-public class SchedMeasReportPerCell implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class QciVals implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<QCI> seqOf = null;
-
-		public QciVals() {
-			seqOf = new ArrayList<QCI>();
-		}
-
-		public QciVals(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<QCI> getQCI() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<QCI>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				QCI element = new QCI();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<QCI> it = seqOf.iterator();
-				if (it.hasNext()) {
-					sb.append(it.next());
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						sb.append(it.next());
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-        public void setQCI(QCI qci) {
-			seqOf.add(qci);
-        }
-    }
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private ECGI ecgi = null;
-	private QciVals qciVals = null;
-	private PRBUsage prbUsagePcell = null;
-	private PRBUsage prbUsageScell = null;
-	
-	public SchedMeasReportPerCell() {
-	}
-
-	public SchedMeasReportPerCell(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setQciVals(QciVals qciVals) {
-		this.qciVals = qciVals;
-	}
-
-	public QciVals getQciVals() {
-		return qciVals;
-	}
-
-	public void setPrbUsagePcell(PRBUsage prbUsagePcell) {
-		this.prbUsagePcell = prbUsagePcell;
-	}
-
-	public PRBUsage getPrbUsagePcell() {
-		return prbUsagePcell;
-	}
-
-	public void setPrbUsageScell(PRBUsage prbUsageScell) {
-		this.prbUsageScell = prbUsageScell;
-	}
-
-	public PRBUsage getPrbUsageScell() {
-		return prbUsageScell;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += prbUsageScell.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-		os.write(0xA3);
-		codeLength += 1;
-		
-		codeLength += prbUsagePcell.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += qciVals.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			qciVals = new QciVals();
-			subCodeLength += qciVals.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			prbUsagePcell = new PRBUsage();
-			subCodeLength += prbUsagePcell.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			prbUsageScell = new PRBUsage();
-			subCodeLength += prbUsageScell.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (qciVals != null) {
-			sb.append("qciVals: ");
-			qciVals.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (prbUsagePcell != null) {
-			sb.append("prbUsagePcell: ");
-			prbUsagePcell.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (prbUsageScell != null) {
-			sb.append("prbUsageScell: ");
-			prbUsageScell.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/SchedMeasReportPerUE.java b/src/main/java/org.onosproject.xran/codecs/pdu/SchedMeasReportPerUE.java
deleted file mode 100644
index 61616f4..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/SchedMeasReportPerUE.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.SchedMeasRepPerServCell;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class SchedMeasReportPerUE implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class SchedReportServCells implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<SchedMeasRepPerServCell> seqOf = null;
-
-		public SchedReportServCells() {
-			seqOf = new ArrayList<SchedMeasRepPerServCell>();
-		}
-
-		public SchedReportServCells(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<SchedMeasRepPerServCell> getSchedMeasRepPerServCell() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<SchedMeasRepPerServCell>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				SchedMeasRepPerServCell element = new SchedMeasRepPerServCell();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<SchedMeasRepPerServCell> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-        public void setSchedMeasRepPerServCell(SchedMeasRepPerServCell schedMeasRepPerServCell) {
-			seqOf.add(schedMeasRepPerServCell);
-        }
-    }
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private ECGI ecgi = null;
-	private CRNTI crnti = null;
-	private SchedReportServCells schedReportServCells = null;
-	
-	public SchedMeasReportPerUE() {
-	}
-
-	public SchedMeasReportPerUE(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setSchedReportServCells(SchedReportServCells schedReportServCells) {
-		this.schedReportServCells = schedReportServCells;
-	}
-
-	public SchedReportServCells getSchedReportServCells() {
-		return schedReportServCells;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += schedReportServCells.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 1
-		os.write(0x81);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 1)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			schedReportServCells = new SchedReportServCells();
-			subCodeLength += schedReportServCells.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (schedReportServCells != null) {
-			sb.append("schedReportServCells: ");
-			schedReportServCells.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/SeNBAdd.java b/src/main/java/org.onosproject.xran/codecs/pdu/SeNBAdd.java
deleted file mode 100644
index 5f1d1fa..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/SeNBAdd.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class SeNBAdd implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI mEcgi = null;
-	private ECGI sEcgi = null;
-	
-	public SeNBAdd() {
-	}
-
-	public SeNBAdd(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setMEcgi(ECGI mEcgi) {
-		this.mEcgi = mEcgi;
-	}
-
-	public ECGI getMEcgi() {
-		return mEcgi;
-	}
-
-	public void setSEcgi(ECGI sEcgi) {
-		this.sEcgi = sEcgi;
-	}
-
-	public ECGI getSEcgi() {
-		return sEcgi;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += sEcgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += mEcgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			mEcgi = new ECGI();
-			subCodeLength += mEcgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			sEcgi = new ECGI();
-			subCodeLength += sEcgi.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (mEcgi != null) {
-			sb.append("mEcgi: ");
-			mEcgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (sEcgi != null) {
-			sb.append("sEcgi: ");
-			sEcgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/SeNBAddStatus.java b/src/main/java/org.onosproject.xran/codecs/pdu/SeNBAddStatus.java
deleted file mode 100644
index 1548c9f..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/SeNBAddStatus.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerEnum;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class SeNBAddStatus implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private BerEnum status = null;
-	
-	public SeNBAddStatus() {
-	}
-
-	public SeNBAddStatus(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setStatus(BerEnum status) {
-		this.status = status;
-	}
-
-	public BerEnum getStatus() {
-		return status;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += status.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			status = new BerEnum();
-			subCodeLength += status.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (status != null) {
-			sb.append("status: ").append(status);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/SeNBDelete.java b/src/main/java/org.onosproject.xran/codecs/pdu/SeNBDelete.java
deleted file mode 100644
index 14b9dc5..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/SeNBDelete.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class SeNBDelete implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI mEcgi = null;
-	private ECGI sEcgi = null;
-	
-	public SeNBDelete() {
-	}
-
-	public SeNBDelete(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setMEcgi(ECGI mEcgi) {
-		this.mEcgi = mEcgi;
-	}
-
-	public ECGI getMEcgi() {
-		return mEcgi;
-	}
-
-	public void setSEcgi(ECGI sEcgi) {
-		this.sEcgi = sEcgi;
-	}
-
-	public ECGI getSEcgi() {
-		return sEcgi;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += sEcgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += mEcgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			mEcgi = new ECGI();
-			subCodeLength += mEcgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			sEcgi = new ECGI();
-			subCodeLength += sEcgi.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (mEcgi != null) {
-			sb.append("mEcgi: ");
-			mEcgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (sEcgi != null) {
-			sb.append("sEcgi: ");
-			sEcgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/TrafficSplitConfig.java b/src/main/java/org.onosproject.xran/codecs/pdu/TrafficSplitConfig.java
deleted file mode 100644
index cd68d7f..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/TrafficSplitConfig.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.TrafficSplitPercentage;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class TrafficSplitConfig implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static class TrafficSplitPercent implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		@JsonIgnore
-		public byte[] code = null;
-		private List<TrafficSplitPercentage> seqOf = null;
-
-		public TrafficSplitPercent() {
-			seqOf = new ArrayList<TrafficSplitPercentage>();
-		}
-
-		public TrafficSplitPercent(byte[] code) {
-			this.code = code;
-		}
-
-		@JsonValue
-		public List<TrafficSplitPercentage> getTrafficSplitPercentage() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<TrafficSplitPercentage>();
-			}
-			return seqOf;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
-
-			while (subCodeLength < totalLength) {
-				TrafficSplitPercentage element = new TrafficSplitPercentage();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
-
-			}
-			codeLength += subCodeLength;
-
-			return codeLength;
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
-//				sb.append("null");
-			}
-			else {
-				Iterator<TrafficSplitPercentage> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
-
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private TrafficSplitPercent trafficSplitPercent = null;
-	
-	public TrafficSplitConfig() {
-	}
-
-	public TrafficSplitConfig(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setTrafficSplitPercent(TrafficSplitPercent trafficSplitPercent) {
-		this.trafficSplitPercent = trafficSplitPercent;
-	}
-
-	public TrafficSplitPercent getTrafficSplitPercent() {
-		return trafficSplitPercent;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += trafficSplitPercent.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			trafficSplitPercent = new TrafficSplitPercent();
-			subCodeLength += trafficSplitPercent.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (trafficSplitPercent != null) {
-			sb.append("trafficSplitPercent: ");
-			trafficSplitPercent.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionResponse.java b/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionResponse.java
deleted file mode 100644
index 8600ba3..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionResponse.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.api.AdmEstResponse;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-
-public class UEAdmissionResponse implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private AdmEstResponse admEstResponse = null;
-	
-	public UEAdmissionResponse() {
-	}
-
-	public UEAdmissionResponse(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setAdmEstResponse(AdmEstResponse admEstResponse) {
-		this.admEstResponse = admEstResponse;
-	}
-
-	public AdmEstResponse getAdmEstResponse() {
-		return admEstResponse;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += admEstResponse.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			admEstResponse = new AdmEstResponse();
-			subCodeLength += admEstResponse.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (admEstResponse != null) {
-			sb.append("admEstResponse: ").append(admEstResponse);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, boolean b) {
-		AdmEstResponse response = new AdmEstResponse(b ? 0 : 1);
-
-		UEAdmissionResponse ueAdmissionResponse = new UEAdmissionResponse();
-		ueAdmissionResponse.setCrnti(crnti);
-		ueAdmissionResponse.setEcgi(ecgi);
-		ueAdmissionResponse.setAdmEstResponse(response);
-
-		XrancPduBody body = new XrancPduBody();
-		body.setUEAdmissionResponse(ueAdmissionResponse);
-
-		BerUTF8String ver = null;
-		try {
-			ver = new BerUTF8String("3");
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-		XrancApiID apiID = new XrancApiID(3);
-		XrancPduHdr hdr = new XrancPduHdr();
-		hdr.setVer(ver);
-		hdr.setApiId(apiID);
-
-		XrancPdu pdu = new XrancPdu();
-		pdu.setHdr(hdr);
-		pdu.setBody(body);
-		return pdu;
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionStatus.java b/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionStatus.java
deleted file mode 100644
index 5a06a8a..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionStatus.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.api.AdmEstStatus;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-public class UEAdmissionStatus implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private AdmEstStatus admEstStatus = null;
-	
-	public UEAdmissionStatus() {
-	}
-
-	public UEAdmissionStatus(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setAdmEstStatus(AdmEstStatus admEstStatus) {
-		this.admEstStatus = admEstStatus;
-	}
-
-	public AdmEstStatus getAdmEstStatus() {
-		return admEstStatus;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += admEstStatus.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			admEstStatus = new AdmEstStatus();
-			subCodeLength += admEstStatus.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (admEstStatus != null) {
-			sb.append("admEstStatus: ").append(admEstStatus);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityEnquiry.java b/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityEnquiry.java
deleted file mode 100644
index 01fa001..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityEnquiry.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-
-
-public class UECapabilityEnquiry implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	
-	public UECapabilityEnquiry() {
-	}
-
-	public UECapabilityEnquiry(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti) {
-		UECapabilityEnquiry capabilityEnquiry = new UECapabilityEnquiry();
-		capabilityEnquiry.setCrnti(crnti);
-		capabilityEnquiry.setEcgi(ecgi);
-
-		XrancPduBody body = new XrancPduBody();
-		body.setUECapabilityEnquiry(capabilityEnquiry);
-
-		BerUTF8String ver = null;
-		try {
-			ver = new BerUTF8String("3");
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-		XrancApiID apiID = new XrancApiID(25);
-		XrancPduHdr hdr = new XrancPduHdr();
-		hdr.setVer(ver);
-		hdr.setApiId(apiID);
-
-		XrancPdu pdu = new XrancPdu();
-		pdu.setHdr(hdr);
-		pdu.setBody(body);
-
-		return pdu;
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityInfo.java b/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityInfo.java
deleted file mode 100644
index 732b717..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityInfo.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CACap;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.DCCap;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class UECapabilityInfo implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private CACap caCap = null;
-	private DCCap dcCap = null;
-	
-	public UECapabilityInfo() {
-	}
-
-	public UECapabilityInfo(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCaCap(CACap caCap) {
-		this.caCap = caCap;
-	}
-
-	public CACap getCaCap() {
-		return caCap;
-	}
-
-	public void setDcCap(DCCap dcCap) {
-		this.dcCap = dcCap;
-	}
-
-	public DCCap getDcCap() {
-		return dcCap;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		if (dcCap != null) {
-			codeLength += dcCap.encode(os, false);
-			// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
-			os.write(0xA3);
-			codeLength += 1;
-		}
-		
-		if (caCap != null) {
-			codeLength += caCap.encode(os, false);
-			// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-			os.write(0xA2);
-			codeLength += 1;
-		}
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			caCap = new CACap();
-			subCodeLength += caCap.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 3)) {
-			dcCap = new DCCap();
-			subCodeLength += dcCap.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		if (caCap != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("caCap: ");
-			caCap.appendAsString(sb, indentLevel + 1);
-		}
-		
-		if (dcCap != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("dcCap: ");
-			dcCap.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/UEContextUpdate.java b/src/main/java/org.onosproject.xran/codecs/pdu/UEContextUpdate.java
deleted file mode 100644
index a43fc70..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UEContextUpdate.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.ENBUES1APID;
-import org.onosproject.xran.codecs.api.MMEUES1APID;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-public class UEContextUpdate implements Serializable {
-
-		private static final long serialVersionUID = 1L;
-
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-		@JsonIgnore
-		public byte[] code = null;
-		private CRNTI crnti = null;
-		private ECGI ecgi = null;
-		private MMEUES1APID mMEUES1APID = null;
-		private ENBUES1APID eNBUES1APID = null;
-		private BerUTF8String imsi = null;
-
-		public UEContextUpdate() {
-		}
-
-		public UEContextUpdate(byte[] code) {
-			this.code = code;
-		}
-
-		public void setCrnti(CRNTI crnti) {
-			this.crnti = crnti;
-		}
-
-		public CRNTI getCrnti() {
-			return crnti;
-		}
-
-		public void setEcgi(ECGI ecgi) {
-			this.ecgi = ecgi;
-		}
-
-		public ECGI getEcgi() {
-			return ecgi;
-		}
-
-		public void setMMEUES1APID(MMEUES1APID mMEUES1APID) {
-			this.mMEUES1APID = mMEUES1APID;
-		}
-
-		public MMEUES1APID getMMEUES1APID() {
-			return mMEUES1APID;
-		}
-
-		public void setENBUES1APID(ENBUES1APID eNBUES1APID) {
-			this.eNBUES1APID = eNBUES1APID;
-		}
-
-		public ENBUES1APID getENBUES1APID() {
-			return eNBUES1APID;
-		}
-
-		public void setImsi(BerUTF8String imsi) {
-			this.imsi = imsi;
-		}
-
-		public BerUTF8String getImsi() {
-			return imsi;
-		}
-
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
-
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
-
-			int codeLength = 0;
-			if (imsi != null) {
-				codeLength += imsi.encode(os, false);
-				// write tag: CONTEXT_CLASS, PRIMITIVE, 4
-				os.write(0x84);
-				codeLength += 1;
-			}
-
-			codeLength += eNBUES1APID.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-			os.write(0x83);
-			codeLength += 1;
-
-			codeLength += mMEUES1APID.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-			os.write(0x82);
-			codeLength += 1;
-
-			codeLength += ecgi.encode(os, false);
-			// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-			os.write(0xA1);
-			codeLength += 1;
-
-			codeLength += crnti.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-			os.write(0x80);
-			codeLength += 1;
-
-			codeLength += BerLength.encodeLength(os, codeLength);
-
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
-
-			return codeLength;
-
-		}
-
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
-
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			BerTag berTag = new BerTag();
-
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
-
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-
-			int totalLength = length.val;
-			codeLength += totalLength;
-
-			subCodeLength += berTag.decode(is);
-			if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-				crnti = new CRNTI();
-				subCodeLength += crnti.decode(is, false);
-				subCodeLength += berTag.decode(is);
-			}
-			else {
-				throw new IOException("Tag does not match the mandatory sequence element tag.");
-			}
-
-			if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-				ecgi = new ECGI();
-				subCodeLength += ecgi.decode(is, false);
-				subCodeLength += berTag.decode(is);
-			}
-			else {
-				throw new IOException("Tag does not match the mandatory sequence element tag.");
-			}
-
-			if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-				mMEUES1APID = new MMEUES1APID();
-				subCodeLength += mMEUES1APID.decode(is, false);
-				subCodeLength += berTag.decode(is);
-			}
-			else {
-				throw new IOException("Tag does not match the mandatory sequence element tag.");
-			}
-
-			if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
-				eNBUES1APID = new ENBUES1APID();
-				subCodeLength += eNBUES1APID.decode(is, false);
-				if (subCodeLength == totalLength) {
-					return codeLength;
-				}
-				subCodeLength += berTag.decode(is);
-			}
-			else {
-				throw new IOException("Tag does not match the mandatory sequence element tag.");
-			}
-
-			if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
-				imsi = new BerUTF8String();
-				subCodeLength += imsi.decode(is, false);
-				if (subCodeLength == totalLength) {
-					return codeLength;
-				}
-			}
-			throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-
-		}
-
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
-
-		public void appendAsString(StringBuilder sb, int indentLevel) {
-
-			sb.append("{");
-			sb.append("\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (crnti != null) {
-				sb.append("crnti: ").append(crnti);
-			}
-			else {
-				sb.append("crnti: <empty-required-field>");
-			}
-
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (ecgi != null) {
-				sb.append("ecgi: ");
-				ecgi.appendAsString(sb, indentLevel + 1);
-			}
-			else {
-				sb.append("ecgi: <empty-required-field>");
-			}
-
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (mMEUES1APID != null) {
-				sb.append("mMEUES1APID: ").append(mMEUES1APID);
-			}
-			else {
-				sb.append("mMEUES1APID: <empty-required-field>");
-			}
-
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (eNBUES1APID != null) {
-				sb.append("eNBUES1APID: ").append(eNBUES1APID);
-			}
-			else {
-				sb.append("eNBUES1APID: <empty-required-field>");
-			}
-
-			if (imsi != null) {
-				sb.append(",\n");
-				for (int i = 0; i < indentLevel + 1; i++) {
-					sb.append("\t");
-				}
-				sb.append("imsi: ").append(imsi);
-			}
-
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("}");
-		}
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/UEReconfigInd.java b/src/main/java/org.onosproject.xran/codecs/pdu/UEReconfigInd.java
deleted file mode 100644
index 6aa03ed..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UEReconfigInd.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.ReconfIndReason;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-public class UEReconfigInd implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crntiOld = null;
-	private ECGI ecgi = null;
-	private CRNTI crntiNew = null;
-	private ReconfIndReason reconfigCause = null;
-	
-	public UEReconfigInd() {
-	}
-
-	public UEReconfigInd(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrntiOld(CRNTI crntiOld) {
-		this.crntiOld = crntiOld;
-	}
-
-	public CRNTI getCrntiOld() {
-		return crntiOld;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setCrntiNew(CRNTI crntiNew) {
-		this.crntiNew = crntiNew;
-	}
-
-	public CRNTI getCrntiNew() {
-		return crntiNew;
-	}
-
-	public void setReconfigCause(ReconfIndReason reconfigCause) {
-		this.reconfigCause = reconfigCause;
-	}
-
-	public ReconfIndReason getReconfigCause() {
-		return reconfigCause;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += reconfigCause.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-		os.write(0x83);
-		codeLength += 1;
-		
-		codeLength += crntiNew.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crntiOld.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crntiOld = new CRNTI();
-			subCodeLength += crntiOld.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			crntiNew = new CRNTI();
-			subCodeLength += crntiNew.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
-			reconfigCause = new ReconfIndReason();
-			subCodeLength += reconfigCause.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crntiOld != null) {
-			sb.append("crntiOld: ").append(crntiOld);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crntiNew != null) {
-			sb.append("crntiNew: ").append(crntiNew);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (reconfigCause != null) {
-			sb.append("reconfigCause: ").append(reconfigCause);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/UEReleaseInd.java b/src/main/java/org.onosproject.xran/codecs/pdu/UEReleaseInd.java
deleted file mode 100644
index fef213f..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UEReleaseInd.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.RelCause;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-
-public class UEReleaseInd implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private RelCause releaseCause = null;
-	
-	public UEReleaseInd() {
-	}
-
-	public UEReleaseInd(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setReleaseCause(RelCause releaseCause) {
-		this.releaseCause = releaseCause;
-	}
-
-	public RelCause getReleaseCause() {
-		return releaseCause;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += releaseCause.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			releaseCause = new RelCause();
-			subCodeLength += releaseCause.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (releaseCause != null) {
-			sb.append("releaseCause: ").append(releaseCause);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java b/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java
deleted file mode 100644
index b0e2440..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/**
- * This class file was automatically generated by jASN1 v1.8.0 (http://www.openmuc.org)
- */
-package org.onosproject.xran.codecs.pdu;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.api.XICICPA;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.BerLength;
-import org.onosproject.xran.codecs.ber.BerTag;
-import org.onosproject.xran.codecs.ber.types.BerBitString;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.ber.types.string.BerUTF8String;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-
-public class XICICConfig implements Serializable {
-
-	private static final long serialVersionUID = 1L;
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	@JsonIgnore
-	public byte[] code = null;
-	private ECGI ecgi = null;
-	private PCIARFCN pciArfcn = null;
-	private CRNTI crnti = null;
-	private XICICPA pa = null;
-	private BerInteger startPrbDl = null;
-	private BerInteger endPrbDl = null;
-	private BerBitString subframeBitmaskDl = null;
-	private BerInteger p0UePusch = null;
-	private BerInteger startPrbUl = null;
-	private BerInteger endPrbUl = null;
-	private BerBitString subframeBitmaskUl = null;
-
-	public XICICConfig() {
-	}
-
-	public XICICConfig(byte[] code) {
-		this.code = code;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setPciArfcn(PCIARFCN pciArfcn) {
-		this.pciArfcn = pciArfcn;
-	}
-
-	public PCIARFCN getPciArfcn() {
-		return pciArfcn;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setPa(XICICPA pa) {
-		this.pa = pa;
-	}
-
-	public XICICPA getPa() {
-		return pa;
-	}
-
-	public void setStartPrbDl(BerInteger startPrbDl) {
-		this.startPrbDl = startPrbDl;
-	}
-
-	public BerInteger getStartPrbDl() {
-		return startPrbDl;
-	}
-
-	public void setEndPrbDl(BerInteger endPrbDl) {
-		this.endPrbDl = endPrbDl;
-	}
-
-	public BerInteger getEndPrbDl() {
-		return endPrbDl;
-	}
-
-	public void setSubframeBitmaskDl(BerBitString subframeBitmaskDl) {
-		this.subframeBitmaskDl = subframeBitmaskDl;
-	}
-
-	public BerBitString getSubframeBitmaskDl() {
-		return subframeBitmaskDl;
-	}
-
-	public void setP0UePusch(BerInteger p0UePusch) {
-		this.p0UePusch = p0UePusch;
-	}
-
-	public BerInteger getP0UePusch() {
-		return p0UePusch;
-	}
-
-	public void setStartPrbUl(BerInteger startPrbUl) {
-		this.startPrbUl = startPrbUl;
-	}
-
-	public BerInteger getStartPrbUl() {
-		return startPrbUl;
-	}
-
-	public void setEndPrbUl(BerInteger endPrbUl) {
-		this.endPrbUl = endPrbUl;
-	}
-
-	public BerInteger getEndPrbUl() {
-		return endPrbUl;
-	}
-
-	public void setSubframeBitmaskUl(BerBitString subframeBitmaskUl) {
-		this.subframeBitmaskUl = subframeBitmaskUl;
-	}
-
-	public BerBitString getSubframeBitmaskUl() {
-		return subframeBitmaskUl;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		if (subframeBitmaskUl != null) {
-			codeLength += subframeBitmaskUl.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 10
-			os.write(0x8A);
-			codeLength += 1;
-		}
-
-		if (endPrbUl != null) {
-			codeLength += endPrbUl.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 9
-			os.write(0x89);
-			codeLength += 1;
-		}
-
-		if (startPrbUl != null) {
-			codeLength += startPrbUl.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 8
-			os.write(0x88);
-			codeLength += 1;
-		}
-
-		if (p0UePusch != null) {
-			codeLength += p0UePusch.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 7
-			os.write(0x87);
-			codeLength += 1;
-		}
-
-		if (subframeBitmaskDl != null) {
-			codeLength += subframeBitmaskDl.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 6
-			os.write(0x86);
-			codeLength += 1;
-		}
-
-		if (endPrbDl != null) {
-			codeLength += endPrbDl.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 5
-			os.write(0x85);
-			codeLength += 1;
-		}
-
-		if (startPrbDl != null) {
-			codeLength += startPrbDl.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 4
-			os.write(0x84);
-			codeLength += 1;
-		}
-
-		if (pa != null) {
-			codeLength += pa.encode(os, false);
-			// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-			os.write(0x83);
-			codeLength += 1;
-		}
-
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
-		os.write(0x82);
-		codeLength += 1;
-
-		if (pciArfcn != null) {
-			codeLength += pciArfcn.encode(os, false);
-			// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-			os.write(0xA1);
-			codeLength += 1;
-		}
-
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
-		os.write(0xA0);
-		codeLength += 1;
-
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 0)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			pciArfcn = new PCIARFCN();
-			subCodeLength += pciArfcn.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
-			pa = new XICICPA();
-			subCodeLength += pa.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
-			startPrbDl = new BerInteger();
-			subCodeLength += startPrbDl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 5)) {
-			endPrbDl = new BerInteger();
-			subCodeLength += endPrbDl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 6)) {
-			subframeBitmaskDl = new BerBitString();
-			subCodeLength += subframeBitmaskDl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 7)) {
-			p0UePusch = new BerInteger();
-			subCodeLength += p0UePusch.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 8)) {
-			startPrbUl = new BerInteger();
-			subCodeLength += startPrbUl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 9)) {
-			endPrbUl = new BerInteger();
-			subCodeLength += endPrbUl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-			subCodeLength += berTag.decode(is);
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 10)) {
-			subframeBitmaskUl = new BerBitString();
-			subCodeLength += subframeBitmaskUl.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("ecgi: ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-
-		if (pciArfcn != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("pciArfcn: ");
-			pciArfcn.appendAsString(sb, indentLevel + 1);
-		}
-
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("crnti: ").append(crnti);
-		}
-
-		if (pa != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("pa: ").append(pa);
-		}
-
-		if (startPrbDl != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("startPrbDl: ").append(startPrbDl);
-		}
-
-		if (endPrbDl != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("endPrbDl: ").append(endPrbDl);
-		}
-
-		if (subframeBitmaskDl != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("subframeBitmaskDl: ").append(subframeBitmaskDl);
-		}
-
-		if (p0UePusch != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("p0UePusch: ").append(p0UePusch);
-		}
-
-		if (startPrbUl != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("startPrbUl: ").append(startPrbUl);
-		}
-
-		if (endPrbUl != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("endPrbUl: ").append(endPrbUl);
-		}
-
-		if (subframeBitmaskUl != null) {
-			sb.append(",\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			sb.append("subframeBitmaskUl: ").append(subframeBitmaskUl);
-		}
-
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
-
-	public static XrancPdu constructPacket(RRMConfig config, CellConfigReport cellConfigReport) {
-		XrancPduBody body = new XrancPduBody();
-        
-		XICICConfig xicicConfig = new XICICConfig();
-
-		xicicConfig.setEcgi(config.getEcgi());
-		xicicConfig.setCrnti(config.getCrnti().getCRNTI().get(0));
-
-		try {
-			PCIARFCN pciarfcn = new PCIARFCN();
-			pciarfcn.setPci(cellConfigReport.getPci());
-			pciarfcn.setEarfcnDl(cellConfigReport.getEarfcnDl());
-			xicicConfig.setPciArfcn(pciarfcn);
-		} catch (Exception ignored) {}
-
-		try {
-			xicicConfig.setPa(config.getPa().getXICICPA().get(0));
-		} catch (Exception ignored) {}
-
-		try {
-			xicicConfig.setStartPrbDl(config.getStartPrbDl().getSeqOf().get(0));
-		} catch (Exception ignored) {}
-
-		try {
-			xicicConfig.setEndPrbDl(config.getEndPrbDl().getSeqOf().get(0));
-		} catch (Exception ignored) {}
-
-		try {
-			xicicConfig.setSubframeBitmaskDl(config.getSubframeBitmaskDl().getBerBitString().get(0));
-		} catch (Exception ignored) {}
-
-		try {
-			xicicConfig.setSubframeBitmaskUl(config.getSubframeBitmaskUl().getBerBitString().get(0));
-		} catch (Exception ignored) {}
-
-		try {
-			xicicConfig.setP0UePusch(config.getP0UePusch().getBerInteger().get(0));
-		} catch (Exception ignored) {}
-
-		try {
-			xicicConfig.setEndPrbUl(config.getEndPrbUl().getSeqOf().get(0));
-		} catch (Exception ignored) {}
-
-        try {
-            xicicConfig.setEndPrbUl(config.getStartPrbUl().getSeqOf().get(0));
-        } catch (Exception ignored) {}
-
-        body.setXICICConfig(xicicConfig);
-
-		BerUTF8String ver = null;
-		try {
-			ver = new BerUTF8String("3");
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-
-		XrancApiID apiID = new XrancApiID(23);
-		XrancPduHdr hdr = new XrancPduHdr();
-		hdr.setVer(ver);
-		hdr.setApiId(apiID);
-
-		XrancPdu pdu = new XrancPdu();
-		pdu.setHdr(hdr);
-		pdu.setBody(body);
-		return pdu;
-	}
-}
-
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/package-info.java b/src/main/java/org.onosproject.xran/codecs/pdu/package-info.java
deleted file mode 100644
index f258255..0000000
--- a/src/main/java/org.onosproject.xran/codecs/pdu/package-info.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.codecs.pdu;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
deleted file mode 100644
index 0aac291..0000000
--- a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
+++ /dev/null
@@ -1,1463 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.controller;
-
-import com.google.common.collect.Sets;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.sctp.SctpMessage;
-import org.apache.commons.lang.exception.ExceptionUtils;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.packet.IpAddress;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.config.Config;
-import org.onosproject.net.config.ConfigFactory;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.config.NetworkConfigListener;
-import org.onosproject.net.config.NetworkConfigRegistry;
-import org.onosproject.net.config.NetworkConfigService;
-import org.onosproject.net.config.basics.SubjectFactories;
-import org.onosproject.net.device.DeviceEvent;
-import org.onosproject.net.device.DeviceListener;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.host.HostEvent;
-import org.onosproject.net.host.HostListener;
-import org.onosproject.net.host.HostService;
-import org.onosproject.xran.XranStore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.ERABID;
-import org.onosproject.xran.codecs.api.ERABParams;
-import org.onosproject.xran.codecs.api.ERABParamsItem;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.codecs.api.PropScell;
-import org.onosproject.xran.codecs.api.RSRPRange;
-import org.onosproject.xran.codecs.api.RSRQRange;
-import org.onosproject.xran.codecs.api.RXSigReport;
-import org.onosproject.xran.codecs.api.RadioRepPerServCell;
-import org.onosproject.xran.codecs.api.SchedMeasRepPerServCell;
-import org.onosproject.xran.codecs.api.TrafficSplitPercentage;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.pdu.BearerAdmissionRequest;
-import org.onosproject.xran.codecs.pdu.BearerAdmissionResponse;
-import org.onosproject.xran.codecs.pdu.BearerAdmissionStatus;
-import org.onosproject.xran.codecs.pdu.BearerReleaseInd;
-import org.onosproject.xran.codecs.pdu.CellConfigReport;
-import org.onosproject.xran.codecs.pdu.CellConfigRequest;
-import org.onosproject.xran.codecs.pdu.HOComplete;
-import org.onosproject.xran.codecs.pdu.HOFailure;
-import org.onosproject.xran.codecs.pdu.HORequest;
-import org.onosproject.xran.codecs.pdu.L2MeasConfig;
-import org.onosproject.xran.codecs.pdu.PDCPMeasReportPerUe;
-import org.onosproject.xran.codecs.pdu.RRMConfig;
-import org.onosproject.xran.codecs.pdu.RRMConfigStatus;
-import org.onosproject.xran.codecs.pdu.RXSigMeasConfig;
-import org.onosproject.xran.codecs.pdu.RXSigMeasReport;
-import org.onosproject.xran.codecs.pdu.RadioMeasReportPerCell;
-import org.onosproject.xran.codecs.pdu.RadioMeasReportPerUE;
-import org.onosproject.xran.codecs.pdu.ScellAdd;
-import org.onosproject.xran.codecs.pdu.ScellAddStatus;
-import org.onosproject.xran.codecs.pdu.ScellDelete;
-import org.onosproject.xran.codecs.pdu.SchedMeasReportPerCell;
-import org.onosproject.xran.codecs.pdu.SchedMeasReportPerUE;
-import org.onosproject.xran.codecs.pdu.TrafficSplitConfig;
-import org.onosproject.xran.codecs.pdu.UEAdmissionRequest;
-import org.onosproject.xran.codecs.pdu.UEAdmissionResponse;
-import org.onosproject.xran.codecs.pdu.UEAdmissionStatus;
-import org.onosproject.xran.codecs.pdu.UECapabilityEnquiry;
-import org.onosproject.xran.codecs.pdu.UECapabilityInfo;
-import org.onosproject.xran.codecs.pdu.UEContextUpdate;
-import org.onosproject.xran.codecs.pdu.UEReconfigInd;
-import org.onosproject.xran.codecs.pdu.UEReleaseInd;
-import org.onosproject.xran.codecs.pdu.XICICConfig;
-import org.onosproject.xran.codecs.pdu.XrancPdu;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibLink;
-import org.onosproject.xran.entities.RnibUe;
-import org.onosproject.xran.identifiers.ContextUpdateHandler;
-import org.onosproject.xran.identifiers.EcgiCrntiPair;
-import org.onosproject.xran.identifiers.LinkId;
-import org.onosproject.xran.impl.XranConfig;
-import org.onosproject.xran.providers.XranDeviceListener;
-import org.onosproject.xran.providers.XranHostListener;
-import org.onosproject.xran.wrapper.CellMap;
-import org.onosproject.xran.wrapper.LinkMap;
-import org.onosproject.xran.wrapper.UeMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.SynchronousQueue;
-import java.util.stream.Collectors;
-
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.xran.controller.XranChannelHandler.getSctpMessage;
-import static org.onosproject.xran.entities.RnibCell.decodeDeviceId;
-import static org.onosproject.xran.entities.RnibCell.uri;
-import static org.onosproject.xran.entities.RnibUe.hostIdtoUEId;
-
-/**
- * Created by dimitris on 7/20/17.
- */
-@Component(immediate = true)
-@Service
-public class XranControllerImpl implements XranController {
-    private static final String XRAN_APP_ID = "org.onosproject.xran";
-    private static final Class<XranConfig> CONFIG_CLASS = XranConfig.class;
-
-    private static final Logger log =
-            LoggerFactory.getLogger(XranControllerImpl.class);
-    /* CONFIG */
-    private final InternalNetworkConfigListener configListener =
-            new InternalNetworkConfigListener();
-    /* VARIABLES */
-    private final Controller controller = new Controller();
-    private XranConfig xranConfig;
-    private ApplicationId appId;
-    private int northboundTimeout;
-    /* Services */
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private DeviceService deviceService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private HostService hostService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private NetworkConfigRegistry registry;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private NetworkConfigService configService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private XranStore xranStore;
-    private ConfigFactory<ApplicationId, XranConfig> xranConfigFactory =
-            new ConfigFactory<ApplicationId, XranConfig>(
-                    SubjectFactories.APP_SUBJECT_FACTORY, CONFIG_CLASS, "xran") {
-                @Override
-                public XranConfig createConfig() {
-                    return new XranConfig();
-                }
-            };
-    /* WRAPPERS */
-    private CellMap cellMap;
-    private UeMap ueMap;
-    private LinkMap linkMap;
-    /* MAPS */
-    private ConcurrentMap<IpAddress, ECGI> legitCells = new ConcurrentHashMap<>();
-    private ConcurrentMap<ECGI, SynchronousQueue<String>> hoMap = new ConcurrentHashMap<>();
-    private ConcurrentMap<ECGI, SynchronousQueue<String>> rrmcellMap = new ConcurrentHashMap<>();
-    private ConcurrentMap<CRNTI, SynchronousQueue<String>> scellAddMap = new ConcurrentHashMap<>();
-    // Map used to keep messages in pairs (HO Complete - CTX Update, Adm Status - CTX Update)
-    private ConcurrentMap<EcgiCrntiPair, ContextUpdateHandler> contextUpdateMap = new ConcurrentHashMap<>();
-    /* QUEUE */
-    private BlockingQueue<Long> ueIdQueue = new LinkedBlockingQueue<>();
-    /* AGENTS */
-    private InternalXranDeviceAgent deviceAgent = new InternalXranDeviceAgent();
-    private InternalXranHostAgent hostAgent = new InternalXranHostAgent();
-    private InternalXranPacketAgent packetAgent = new InternalXranPacketAgent();
-    /* LISTENERS */
-    private Set<XranDeviceListener> xranDeviceListeners = new CopyOnWriteArraySet<>();
-    private Set<XranHostListener> xranHostListeners = new CopyOnWriteArraySet<>();
-    private InternalDeviceListener deviceListener = new InternalDeviceListener();
-    private InternalHostListener hostListener = new InternalHostListener();
-
-    @Activate
-    public void activate() {
-        appId = coreService.registerApplication(XRAN_APP_ID);
-
-        configService.addListener(configListener);
-        registry.registerConfigFactory(xranConfigFactory);
-        deviceService.addListener(deviceListener);
-        hostService.addListener(hostListener);
-
-        cellMap = new CellMap(xranStore);
-        ueMap = new UeMap(xranStore);
-        linkMap = new LinkMap(xranStore, ueMap);
-
-        xranStore.setController(this);
-
-        log.info("XRAN Controller Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        deviceService.removeListener(deviceListener);
-        hostService.removeListener(hostListener);
-        configService.removeListener(configListener);
-        registry.unregisterConfigFactory(xranConfigFactory);
-
-        cleanup();
-
-        log.info("XRAN Controller Stopped");
-    }
-
-    private void cleanup() {
-        xranStore.getuenodes().forEach(ue -> {
-            for (XranHostListener l : xranHostListeners) {
-                l.hostRemoved(((RnibUe) ue).getHostId());
-            }
-        });
-
-        xranStore.getcellnodes().forEach(cell -> {
-            for (XranDeviceListener l : xranDeviceListeners) {
-                l.deviceRemoved(deviceId(uri(((RnibCell) cell).getEcgi())));
-            }
-        });
-
-        controller.stop();
-
-        legitCells.clear();
-        hoMap.clear();
-        rrmcellMap.clear();
-        scellAddMap.clear();
-        contextUpdateMap.clear();
-        ueIdQueue.clear();
-        xranDeviceListeners.clear();
-        xranHostListeners.clear();
-
-        cellMap = null;
-        ueMap = null;
-        linkMap = null;
-    }
-
-    @Override
-    public SynchronousQueue<String> sendHORequest(RnibLink linkT, RnibLink linkS) throws InterruptedException {
-        ECGI ecgiT = linkT.getLinkId().getEcgi(),
-                ecgiS = linkS.getLinkId().getEcgi();
-
-        CRNTI crnti = linkMap.getCrnti(linkT.getLinkId().getUeId());
-        ChannelHandlerContext ctxT = cellMap.getCtx(ecgiT),
-                ctxS = cellMap.getCtx(ecgiS);
-
-        SynchronousQueue<String> queue = new SynchronousQueue<>();
-        try {
-            XrancPdu xrancPdu = HORequest.constructPacket(crnti, ecgiS, ecgiT);
-
-            // temporary map that has ECGI source of a handoff to a queue waiting for REST response.
-            hoMap.put(ecgiS, queue);
-
-            ctxT.writeAndFlush(getSctpMessage(xrancPdu));
-            ctxS.writeAndFlush(getSctpMessage(xrancPdu));
-
-            // FIXME: only works for one HO at a time.
-            ueIdQueue.put(linkT.getLinkId().getUeId());
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        return queue;
-    }
-
-    @Override
-    public void addListener(XranDeviceListener listener) {
-        xranDeviceListeners.add(listener);
-    }
-
-    @Override
-    public void addListener(XranHostListener listener) {
-        xranHostListeners.add(listener);
-    }
-
-    @Override
-    public void removeListener(XranDeviceListener listener) {
-        xranDeviceListeners.remove(listener);
-    }
-
-    @Override
-    public void removeListener(XranHostListener listener) {
-        xranHostListeners.remove(listener);
-    }
-
-    @Override
-    public int getNorthboundTimeout() {
-        return northboundTimeout;
-    }
-
-    @Override
-    public SynchronousQueue<String> sendmodifiedrrmconf(RRMConfig rrmConfig, boolean xicic) {
-        ECGI ecgi = rrmConfig.getEcgi();
-        ChannelHandlerContext ctx = cellMap.getCtx(ecgi);
-        try {
-            XrancPdu pdu;
-
-            if (xicic) {
-                CellConfigReport cellConfigReport = cellMap.get(ecgi).getConf();
-                if (cellConfigReport != null) {
-                    pdu = XICICConfig.constructPacket(rrmConfig, cellConfigReport);
-                    ctx.writeAndFlush(getSctpMessage(pdu));
-                }
-            } else {
-                pdu = RRMConfig.constructPacket(rrmConfig);
-                ctx.writeAndFlush(getSctpMessage(pdu));
-                SynchronousQueue<String> queue = new SynchronousQueue<>();
-                rrmcellMap.put(ecgi, queue);
-                return queue;
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-
-    @Override
-    public SynchronousQueue<String> sendScellAdd(RnibLink link) {
-        RnibCell secondaryCell = link.getLinkId().getCell(),
-                primaryCell = linkMap.getPrimaryCell(link.getLinkId().getUe());
-        ECGI primaryEcgi = primaryCell.getEcgi();
-        ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
-
-        CRNTI crnti = linkMap.getCrnti(link.getLinkId().getUeId());
-
-        CellConfigReport cellReport = secondaryCell.getConf();
-
-        if (cellReport != null) {
-            PCIARFCN pciarfcn = new PCIARFCN();
-            pciarfcn.setPci(cellReport.getPci());
-            pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
-
-            PropScell propScell = new PropScell();
-            propScell.setPciArfcn(pciarfcn);
-
-            XrancPdu pdu = ScellAdd.constructPacket(primaryEcgi, crnti, propScell);
-            try {
-                ctx.writeAndFlush(getSctpMessage(pdu));
-                SynchronousQueue<String> queue = new SynchronousQueue<>();
-                scellAddMap.put(crnti, queue);
-
-                return queue;
-            } catch (IOException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
-                e.printStackTrace();
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public boolean sendScellDelete(RnibLink link) {
-        RnibCell secondaryCell = link.getLinkId().getCell(),
-                primaryCell = linkMap.getPrimaryCell(link.getLinkId().getUe());
-        ECGI primaryEcgi = primaryCell.getEcgi();
-        ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
-
-        CRNTI crnti = linkMap.getCrnti(link.getLinkId().getUeId());
-
-        CellConfigReport cellReport = secondaryCell.getConf();
-
-        if (cellReport != null) {
-            PCIARFCN pciarfcn = new PCIARFCN();
-            pciarfcn.setPci(cellReport.getPci());
-            pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
-
-            XrancPdu pdu = ScellDelete.constructPacket(primaryEcgi, crnti, pciarfcn);
-
-            try {
-                ctx.writeAndFlush(getSctpMessage(pdu));
-                link.setType(RnibLink.Type.NON_SERVING);
-                return true;
-            } catch (IOException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
-                e.printStackTrace();
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Timer to delete UE after being IDLE.
-     *
-     * @param ue UE entity
-     */
-    private void restartTimer(RnibUe ue) {
-        Timer timer = new Timer();
-        ue.setTimer(timer);
-        timer.schedule(new TimerTask() {
-            @Override
-            public void run() {
-                if (ue.getState() == RnibUe.State.IDLE) {
-                    hostAgent.removeConnectedHost(ue);
-                    log.info("UE is removed after {} ms of IDLE", xranConfig.getIdleUeRemoval());
-                } else {
-                    log.info("UE not removed cause its ACTIVE");
-                }
-            }
-        }, xranConfig.getIdleUeRemoval());
-    }
-
-    /**
-     * Timer to delete LINK after not receiving measurements.
-     *
-     * @param link LINK entity
-     */
-    private void restartTimer(RnibLink link) {
-        Timer timer = new Timer();
-        link.setTimer(timer);
-        timer.schedule(new TimerTask() {
-            @Override
-            public void run() {
-                LinkId linkId = link.getLinkId();
-                xranStore.removeLink(linkId);
-                log.info("Link is removed after not receiving Meas Reports for {} ms",
-                        xranConfig.getNoMeasLinkRemoval());
-            }
-        }, xranConfig.getNoMeasLinkRemoval());
-
-    }
-
-    /**
-     * Request measurement configuration field of specified UE.
-     *
-     * @param primary primary CELL
-     * @param ue      UE entity
-     */
-    private void populateMeasConfig(RnibCell primary, RnibUe ue) {
-        try {
-            ChannelHandlerContext ctx = cellMap.getCtx(primary.getEcgi());
-            RXSigMeasConfig.MeasCells measCells = new RXSigMeasConfig.MeasCells();
-            xranStore.getcellnodes().forEach(cell -> {
-                CellConfigReport cellReport = ((RnibCell) cell).getConf();
-                if (cellReport != null) {
-                    PCIARFCN pciarfcn = new PCIARFCN();
-                    pciarfcn.setPci(cellReport.getPci());
-                    pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
-                    measCells.setPCIARFCN(pciarfcn);
-                }
-            });
-            XrancPdu xrancPdu = RXSigMeasConfig.constructPacket(
-                    primary.getEcgi(),
-                    ue.getCrnti(),
-                    measCells,
-                    xranConfig.getRxSignalInterval()
-            );
-            ue.setMeasConfig(xrancPdu.getBody().getRXSigMeasConfig());
-            ctx.writeAndFlush(getSctpMessage(xrancPdu));
-        } catch (IOException e) {
-            log.warn(ExceptionUtils.getFullStackTrace(e));
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Internal device listener.
-     */
-    class InternalDeviceListener implements DeviceListener {
-
-        @Override
-        public void event(DeviceEvent event) {
-            log.info("Device Event {}", event);
-            switch (event.type()) {
-                case DEVICE_ADDED: {
-                    try {
-                        ECGI ecgi = decodeDeviceId(event.subject().id());
-                        RnibCell cell = cellMap.get(ecgi);
-                        if (cell != null) {
-                            Timer timer = new Timer();
-                            timer.scheduleAtFixedRate(
-                                    new TimerTask() {
-                                        @Override
-                                        public void run() {
-                                            CellConfigReport conf = cell.getConf();
-                                            if (conf == null) {
-                                                try {
-                                                    ChannelHandlerContext ctx = cellMap.getCtx(ecgi);
-                                                    XrancPdu xrancPdu = CellConfigRequest.constructPacket(ecgi);
-                                                    ctx.writeAndFlush(getSctpMessage(xrancPdu));
-                                                } catch (IOException e) {
-                                                    log.error(ExceptionUtils.getFullStackTrace(e));
-                                                    e.printStackTrace();
-                                                }
-                                            } else {
-                                                List<Object> ueNodes = xranStore.getuenodes();
-                                                ueNodes.forEach(object -> {
-                                                    RnibUe ue = (RnibUe) object;
-                                                    try {
-                                                        ECGI primaryEcgi = linkMap.getPrimaryCell(ue).getEcgi();
-                                                        ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
-                                                        RXSigMeasConfig.MeasCells measCells =
-                                                                new RXSigMeasConfig.MeasCells();
-                                                        xranStore.getcellnodes().forEach(cell -> {
-                                                            CellConfigReport cellReport = ((RnibCell) cell).getConf();
-                                                            if (cellReport != null) {
-                                                                PCIARFCN pciarfcn = new PCIARFCN();
-                                                                pciarfcn.setPci(cellReport.getPci());
-                                                                pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
-                                                                measCells.setPCIARFCN(pciarfcn);
-                                                            }
-                                                        });
-                                                        XrancPdu xrancPdu = RXSigMeasConfig.constructPacket(
-                                                                primaryEcgi,
-                                                                ue.getCrnti(),
-                                                                measCells,
-                                                                xranConfig.getRxSignalInterval()
-                                                        );
-                                                        ue.setMeasConfig(xrancPdu.getBody().getRXSigMeasConfig());
-                                                        ctx.writeAndFlush(getSctpMessage(xrancPdu));
-                                                    } catch (IOException e) {
-                                                        log.warn(ExceptionUtils.getFullStackTrace(e));
-                                                        e.printStackTrace();
-                                                    }
-                                                });
-
-                                                try {
-                                                    ChannelHandlerContext ctx = cellMap.getCtx(ecgi);
-                                                    XrancPdu xrancPdu = L2MeasConfig
-                                                            .constructPacket(ecgi, xranConfig.getL2MeasInterval());
-                                                    cell.setMeasConfig(xrancPdu.getBody().getL2MeasConfig());
-                                                    SctpMessage sctpMessage = getSctpMessage(xrancPdu);
-                                                    ctx.writeAndFlush(sctpMessage);
-                                                } catch (IOException e) {
-                                                    log.error(ExceptionUtils.getFullStackTrace(e));
-                                                    e.printStackTrace();
-                                                }
-                                                timer.cancel();
-                                                timer.purge();
-                                            }
-                                        }
-                                    },
-                                    0,
-                                    xranConfig.getConfigRequestInterval() * 1000
-                            );
-                        }
-                    } catch (IOException e) {
-                        log.error(ExceptionUtils.getFullStackTrace(e));
-                        e.printStackTrace();
-                    }
-                    break;
-                }
-                default: {
-                    break;
-                }
-            }
-        }
-    }
-
-    /**
-     * Internal host listener.
-     */
-    class InternalHostListener implements HostListener {
-
-        @Override
-        public void event(HostEvent event) {
-            log.info("Host Event {}", event);
-            switch (event.type()) {
-                case HOST_ADDED:
-                case HOST_MOVED: {
-                    RnibUe ue = ueMap.get(hostIdtoUEId(event.subject().id()));
-                    if (ue != null) {
-                        ECGI ecgiPrimary = linkMap.getPrimaryCell(ue).getEcgi();
-                        RnibCell primary = cellMap.get(ecgiPrimary);
-                        ue.setMeasConfig(null);
-                        if (primary != null) {
-                            Timer timer = new Timer();
-                            timer.scheduleAtFixedRate(
-                                    new TimerTask() {
-                                        @Override
-                                        public void run() {
-                                            if (ue.getCapability() == null && primary.getVersion() >= 3) {
-                                                try {
-                                                    ChannelHandlerContext ctx = cellMap.getCtx(primary.getEcgi());
-                                                    XrancPdu xrancPdu = UECapabilityEnquiry.constructPacket(
-                                                            primary.getEcgi(),
-                                                            ue.getCrnti());
-                                                    ctx.writeAndFlush(getSctpMessage(xrancPdu));
-                                                } catch (IOException e) {
-                                                    log.warn(ExceptionUtils.getFullStackTrace(e));
-                                                    e.printStackTrace();
-                                                }
-                                            } else {
-                                                timer.cancel();
-                                                timer.purge();
-                                            }
-                                        }
-                                    },
-                                    0,
-                                    xranConfig.getConfigRequestInterval() * 1000
-                            );
-                            if (ue.getMeasConfig() == null) {
-                                populateMeasConfig(primary, ue);
-                            }
-                        }
-                    }
-                    break;
-                }
-                default: {
-                    break;
-                }
-            }
-        }
-    }
-
-    /**
-     * Internal xran device agent.
-     */
-    public class InternalXranDeviceAgent implements XranDeviceAgent {
-
-        private final Logger log = LoggerFactory.getLogger(InternalXranDeviceAgent.class);
-
-        @Override
-        public boolean addConnectedCell(String host, ChannelHandlerContext ctx) {
-            ECGI ecgi = legitCells.get(IpAddress.valueOf(host));
-
-            if (ecgi == null) {
-                log.error("Device is not a legit source; ignoring...");
-            } else {
-                log.info("Device exists in configuration; registering...");
-                RnibCell storeCell = cellMap.get(ecgi);
-                if (storeCell == null) {
-                    storeCell = new RnibCell();
-                    storeCell.setEcgi(ecgi);
-                    cellMap.put(storeCell, ctx);
-
-                    for (XranDeviceListener l : xranDeviceListeners) {
-                        l.deviceAdded(storeCell);
-                    }
-                    return true;
-                } else {
-                    log.error("Device already registered; ignoring...");
-                }
-            }
-            ctx.close();
-            return false;
-        }
-
-        @Override
-        public boolean removeConnectedCell(String host) {
-            ECGI ecgi = legitCells.get(IpAddress.valueOf(host));
-            List<RnibLink> linksbyecgi = xranStore.getlinksbyecgi(ecgi);
-
-            linksbyecgi.forEach(rnibLink -> xranStore.removeLink(rnibLink.getLinkId()));
-
-            if (cellMap.remove(ecgi)) {
-                for (XranDeviceListener l : xranDeviceListeners) {
-                    l.deviceRemoved(deviceId(uri(ecgi)));
-                }
-                return true;
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Internal xran host agent.
-     */
-    public class InternalXranHostAgent implements XranHostAgent {
-
-        @Override
-        public boolean addConnectedHost(RnibUe ue, RnibCell cell, ChannelHandlerContext ctx) {
-
-            if (ue.getId() != null && ueMap.get(ue.getId()) != null) {
-                linkMap.putPrimaryLink(cell, ue);
-
-                Set<ECGI> ecgiSet = Sets.newConcurrentHashSet();
-
-                xranStore.getlinksbyueid(ue.getId())
-                        .stream()
-                        .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
-                        .findFirst()
-                        .ifPresent(l -> ecgiSet.add(l.getLinkId().getEcgi()));
-
-                for (XranHostListener l : xranHostListeners) {
-                    l.hostAdded(ue, ecgiSet);
-                }
-                return true;
-            } else {
-                ueMap.put(cell, ue);
-                linkMap.putPrimaryLink(cell, ue);
-
-                Set<ECGI> ecgiSet = Sets.newConcurrentHashSet();
-                ecgiSet.add(cell.getEcgi());
-                for (XranHostListener l : xranHostListeners) {
-                    l.hostAdded(ue, ecgiSet);
-                }
-                return true;
-            }
-
-        }
-
-        @Override
-        public boolean removeConnectedHost(RnibUe ue) {
-            List<RnibLink> links = xranStore.getlinksbyueid(ue.getId());
-            links.forEach(rnibLink -> xranStore.removeLink(rnibLink.getLinkId()));
-            if (ueMap.remove(ue.getId())) {
-                for (XranHostListener l : xranHostListeners) {
-                    l.hostRemoved(ue.getHostId());
-                }
-                return true;
-            }
-            return false;
-        }
-    }
-
-    public class InternalXranPacketAgent implements XranPacketProcessor {
-        @Override
-        public void handlePacket(XrancPdu recvPdu, ChannelHandlerContext ctx)
-                throws IOException, InterruptedException {
-            XrancPdu sendPdu;
-
-            int apiID = recvPdu.getHdr().getApiId().intValue();
-            log.debug("Received message: {}", recvPdu);
-            switch (apiID) {
-                case 1: {
-                    // Decode Cell config report.
-                    CellConfigReport report = recvPdu.getBody().getCellConfigReport();
-                    handleCellconfigreport(report, recvPdu.getHdr().getVer().toString());
-                    break;
-                }
-                case 2: {
-                    // Decode UE Admission Request.
-                    UEAdmissionRequest ueAdmissionRequest = recvPdu.getBody().getUEAdmissionRequest();
-                    handleUeadmissionrequest(ueAdmissionRequest, ctx);
-                    break;
-                }
-                case 4: {
-                    // Decode UE Admission Status.
-                    UEAdmissionStatus ueAdmissionStatus = recvPdu.getBody().getUEAdmissionStatus();
-                    handleAdmissionstatus(ueAdmissionStatus, ctx);
-                    break;
-                }
-                case 5: {
-                    // Decode UE Context Update.
-                    UEContextUpdate ueContextUpdate = recvPdu.getBody().getUEContextUpdate();
-                    handleUecontextupdate(ueContextUpdate, ctx);
-
-                    break;
-                }
-                case 6: {
-                    // Decode UE Reconfig_Ind.
-                    UEReconfigInd ueReconfigInd = recvPdu.getBody().getUEReconfigInd();
-                    handleUereconfigind(ueReconfigInd);
-                    break;
-                }
-                case 7: {
-                    // If xRANc wants to deactivate UE, we pass UEReleaseInd from xRANc to eNB.
-                    // Decode UE Release_Ind.
-                    UEReleaseInd ueReleaseInd = recvPdu.getBody().getUEReleaseInd();
-                    handleUereleaseind(ueReleaseInd);
-                    break;
-                }
-                case 8: {
-                    // Decode Bearer Adm Request
-                    BearerAdmissionRequest bearerAdmissionRequest = recvPdu.getBody().getBearerAdmissionRequest();
-                    handleBeareradmissionrequest(bearerAdmissionRequest, ctx);
-                    break;
-                }
-                case 10: {
-                    //Decode Bearer Admission Status
-                    BearerAdmissionStatus bearerAdmissionStatus = recvPdu.getBody().getBearerAdmissionStatus();
-                    break;
-                }
-                case 11: {
-                    //Decode Bearer Release Ind
-                    BearerReleaseInd bearerReleaseInd = recvPdu.getBody().getBearerReleaseInd();
-                    handleBearerreleaseind(bearerReleaseInd);
-                    break;
-                }
-                case 13: {
-                    HOFailure hoFailure = recvPdu.getBody().getHOFailure();
-                    handleHofailure(hoFailure);
-                    break;
-
-                }
-                case 14: {
-                    HOComplete hoComplete = recvPdu.getBody().getHOComplete();
-                    handleHocomplete(hoComplete, ctx);
-                    break;
-                }
-
-                case 16: {
-                    // Decode Rx Sig Meas Report.
-                    RXSigMeasReport rxSigMeasReport = recvPdu.getBody().getRXSigMeasReport();
-                    handleRxsigmeasreport(rxSigMeasReport);
-                    break;
-                }
-                case 18: {
-                    RadioMeasReportPerUE radioMeasReportPerUE = recvPdu.getBody().getRadioMeasReportPerUE();
-                    handleRadionmeasreportperue(radioMeasReportPerUE);
-                    break;
-                }
-                case 19: {
-                    RadioMeasReportPerCell radioMeasReportPerCell = recvPdu.getBody().getRadioMeasReportPerCell();
-                    break;
-                }
-                case 20: {
-                    SchedMeasReportPerUE schedMeasReportPerUE = recvPdu.getBody().getSchedMeasReportPerUE();
-                    handleSchedmeasreportperue(schedMeasReportPerUE);
-                    break;
-                }
-                case 21: {
-                    SchedMeasReportPerCell schedMeasReportPerCell = recvPdu.getBody().getSchedMeasReportPerCell();
-                    handleSchedmeasreportpercell(schedMeasReportPerCell);
-                    break;
-                }
-                case 22: {
-                    PDCPMeasReportPerUe pdcpMeasReportPerUe = recvPdu.getBody().getPDCPMeasReportPerUe();
-                    handlePdcpmeasreportperue(pdcpMeasReportPerUe);
-                    break;
-                }
-                case 24: {
-                    // Decode UE Capability Info
-                    UECapabilityInfo capabilityInfo = recvPdu.getBody().getUECapabilityInfo();
-                    handleCapabilityinfo(capabilityInfo);
-                    break;
-                }
-                case 25: {
-                    // Don't know what will invoke sending UE CAPABILITY ENQUIRY
-                    // Encode and send UE CAPABILITY ENQUIRY
-                    UECapabilityEnquiry ueCapabilityEnquiry = recvPdu.getBody().getUECapabilityEnquiry();
-                    handleUecapabilityenquiry(ueCapabilityEnquiry, ctx);
-                    break;
-                }
-                case 27: {
-                    //Decode ScellAddStatus
-                    ScellAddStatus scellAddStatus = recvPdu.getBody().getScellAddStatus();
-                    handleScelladdstatus(scellAddStatus);
-                    break;
-                }
-                case 30: {
-                    // Decode RRMConfig Status
-                    RRMConfigStatus rrmConfigStatus = recvPdu.getBody().getRRMConfigStatus();
-                    handleRrmconfigstatus(rrmConfigStatus);
-                    break;
-                }
-                //TODO Case 31: SeNBAdd 32: SeNBAddStatus 33: SeNBDelete
-                case 34: {
-                    TrafficSplitConfig trafficSplitConfig = recvPdu.getBody().getTrafficSplitConfig();
-                    handleTrafficSplitConfig(trafficSplitConfig);
-                    break;
-                }
-                default: {
-                    log.warn("Wrong API ID: {}", recvPdu);
-                    break;
-                }
-            }
-
-        }
-
-        /**
-         * Handle Cellconfigreport.
-         *
-         * @param report  CellConfigReport
-         * @param version String version ID
-         */
-        private void handleCellconfigreport(CellConfigReport report, String version) {
-            ECGI ecgi = report.getEcgi();
-
-            RnibCell cell = xranStore.getCell(ecgi);
-            cell.setVersion(version);
-            cell.setConf(report);
-            cellMap.putPciArfcn(cell);
-        }
-
-        /**
-         * Handle Ueadmissionrequest.
-         *
-         * @param ueAdmissionRequest UEAdmissionRequest
-         * @param ctx                ChannelHandlerContext
-         * @throws IOException IO Exception
-         */
-        private void handleUeadmissionrequest(UEAdmissionRequest ueAdmissionRequest, ChannelHandlerContext ctx)
-                throws IOException {
-            ECGI ecgi = ueAdmissionRequest.getEcgi();
-            if (xranStore.getCell(ecgi) != null) {
-                CRNTI crnti = ueAdmissionRequest.getCrnti();
-                XrancPdu sendPdu = UEAdmissionResponse.constructPacket(ecgi, crnti, xranConfig.admissionFlag());
-                ctx.writeAndFlush(getSctpMessage(sendPdu));
-            } else {
-                log.warn("Could not find ECGI in registered cells: {}", ecgi);
-            }
-        }
-
-        /**
-         * Handle UEAdmissionStatus.
-         *
-         * @param ueAdmissionStatus UEAdmissionStatus
-         * @param ctx               ChannelHandlerContext
-         */
-        private void handleAdmissionstatus(UEAdmissionStatus ueAdmissionStatus, ChannelHandlerContext ctx) {
-            RnibUe ue = ueMap.get(ueAdmissionStatus.getEcgi(), ueAdmissionStatus.getCrnti());
-            if (ue != null) {
-                if (ueAdmissionStatus.getAdmEstStatus().value.intValue() == 0) {
-                    ue.setState(RnibUe.State.ACTIVE);
-                } else {
-                    ue.setState(RnibUe.State.IDLE);
-                }
-            }
-
-            if (ueAdmissionStatus.getAdmEstStatus().value.intValue() == 0) {
-                EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair
-                        .valueOf(ueAdmissionStatus.getEcgi(), ueAdmissionStatus.getCrnti());
-                contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
-                    if (v == null) {
-                        v = new ContextUpdateHandler();
-                    }
-                    if (v.setAdmissionStatus(ueAdmissionStatus)) {
-                        handlePairedPackets(v.getContextUpdate(), ctx, false);
-                        v.reset();
-                    }
-                    return v;
-                });
-            }
-        }
-
-        /**
-         * Handle UEContextUpdate.
-         *
-         * @param ueContextUpdate UEContextUpdate
-         * @param ctx             ChannelHandlerContext
-         */
-        private void handleUecontextupdate(UEContextUpdate ueContextUpdate, ChannelHandlerContext ctx) {
-            EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair
-                    .valueOf(ueContextUpdate.getEcgi(), ueContextUpdate.getCrnti());
-
-            contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
-                if (v == null) {
-                    v = new ContextUpdateHandler();
-                }
-                if (v.setContextUpdate(ueContextUpdate)) {
-                    HOComplete hoComplete = v.getHoComplete();
-                    handlePairedPackets(ueContextUpdate, ctx, hoComplete != null);
-                    if (hoComplete != null) {
-                        try {
-                            hoMap.get(hoComplete.getEcgiS()).put("Hand Over Completed");
-                        } catch (InterruptedException e) {
-                            log.error(ExceptionUtils.getFullStackTrace(e));
-                            e.printStackTrace();
-                        } finally {
-                            hoMap.remove(hoComplete.getEcgiS());
-                        }
-                    }
-                    v.reset();
-                }
-                return v;
-            });
-        }
-
-        /**
-         * Handle UEReconfigInd.
-         *
-         * @param ueReconfigInd UEReconfigInd
-         */
-        private void handleUereconfigind(UEReconfigInd ueReconfigInd) {
-            RnibUe ue = ueMap.get(ueReconfigInd.getEcgi(), ueReconfigInd.getCrntiOld());
-            RnibCell cell = cellMap.get(ueReconfigInd.getEcgi());
-
-            if (ue != null && cell != null) {
-                ue.setCrnti(ueReconfigInd.getCrntiNew());
-                ueMap.putCrnti(cell, ue);
-            } else {
-                log.warn("Could not find UE with this CRNTI: {}", ueReconfigInd.getCrntiOld());
-            }
-        }
-
-        /**
-         * Handle UEReleaseInd.
-         *
-         * @param ueReleaseInd UEReleaseInd
-         */
-        private void handleUereleaseind(UEReleaseInd ueReleaseInd) {
-            ECGI ecgi = ueReleaseInd.getEcgi();
-            CRNTI crnti = ueReleaseInd.getCrnti();
-            RnibUe ue = ueMap.get(ecgi, crnti);
-
-            // Check if there is an ongoing handoff and only remove if ue is not part of the handoff.
-            Long peek = ueIdQueue.peek();
-            if (peek != null) {
-                EcgiCrntiPair ecgiCrntiPair = ueMap.getCrntUe().inverse().get(peek);
-                if (ecgiCrntiPair != null && ecgiCrntiPair.equals(EcgiCrntiPair.valueOf(ecgi, crnti))) {
-                    return;
-                }
-            }
-
-            if (ue != null) {
-                ue.setState(RnibUe.State.IDLE);
-                restartTimer(ue);
-            } else {
-                log.warn("Cannot release UE from non primary link.");
-            }
-        }
-
-        /**
-         * Handle BearerAdmissionRequest.
-         *
-         * @param bearerAdmissionRequest BearerAdmissionRequest
-         * @param ctx                    ChannelHandlerContext
-         * @throws IOException IO Exception
-         */
-        private void handleBeareradmissionrequest(BearerAdmissionRequest bearerAdmissionRequest,
-                                                  ChannelHandlerContext ctx) throws IOException {
-            ECGI ecgi = bearerAdmissionRequest.getEcgi();
-            CRNTI crnti = bearerAdmissionRequest.getCrnti();
-            ERABParams erabParams = bearerAdmissionRequest.getErabParams();
-            RnibLink link = linkMap.get(ecgi, crnti);
-            if (link != null) {
-                link.setBearerParameters(erabParams);
-            } else {
-                log.warn("Could not find link between {}-{}", ecgi, crnti);
-            }
-
-            BerInteger numErabs = bearerAdmissionRequest.getNumErabs();
-            // Encode and send Bearer Admission Response
-            XrancPdu sendPdu = BearerAdmissionResponse
-                    .constructPacket(ecgi, crnti, erabParams, numErabs, xranConfig.bearerFlag());
-            ctx.writeAndFlush(getSctpMessage(sendPdu));
-        }
-
-        /**
-         * Handle BearerReleaseInd.
-         *
-         * @param bearerReleaseInd
-         */
-        private void handleBearerreleaseind(BearerReleaseInd bearerReleaseInd) {
-            ECGI ecgi = bearerReleaseInd.getEcgi();
-            CRNTI crnti = bearerReleaseInd.getCrnti();
-            RnibLink link = linkMap.get(ecgi, crnti);
-
-            List<ERABID> erabidsRelease = bearerReleaseInd.getErabIds().getERABID();
-            List<ERABParamsItem> erabParamsItem = link.getBearerParameters().getERABParamsItem();
-
-            List<ERABParamsItem> unreleased = erabParamsItem
-                    .stream()
-                    .filter(item -> {
-                        Optional<ERABID> any = erabidsRelease.stream()
-                                .filter(id -> id.equals(item.getId())).findAny();
-                        return !any.isPresent();
-                    }).collect(Collectors.toList());
-
-            link.getBearerParameters().setERABParamsItem(new ArrayList<>(unreleased));
-        }
-
-        /**
-         * Handle HOFailure.
-         *
-         * @param hoFailure HOFailure
-         * @throws InterruptedException ueIdQueue interruption
-         */
-        private void handleHofailure(HOFailure hoFailure) throws InterruptedException {
-            try {
-                hoMap.get(hoFailure.getEcgi())
-                        .put("Hand Over Failed with cause: " + hoFailure.getCause());
-            } catch (InterruptedException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
-                e.printStackTrace();
-            } finally {
-                hoMap.remove(hoFailure.getEcgi());
-                ueIdQueue.take();
-            }
-        }
-
-        /**
-         * Handle HOComplete.
-         *
-         * @param hoComplete HOComplete
-         * @param ctx        ChannelHandlerContext
-         */
-        private void handleHocomplete(HOComplete hoComplete, ChannelHandlerContext ctx) {
-            EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair.valueOf(hoComplete.getEcgiT(),
-                    hoComplete.getCrntiNew());
-            contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
-                if (v == null) {
-                    v = new ContextUpdateHandler();
-                }
-                if (v.setHoComplete(hoComplete)) {
-                    handlePairedPackets(v.getContextUpdate(), ctx, true);
-
-                    try {
-                        hoMap.get(hoComplete.getEcgiS()).put("Hand Over Completed");
-                    } catch (InterruptedException e) {
-                        log.error(ExceptionUtils.getFullStackTrace(e));
-                        e.printStackTrace();
-                    } finally {
-                        hoMap.remove(hoComplete.getEcgiS());
-                    }
-                    v.reset();
-                }
-                return v;
-            });
-        }
-
-        /**
-         * Handle RXSigMeasReport.
-         *
-         * @param rxSigMeasReport RXSigMeasReport
-         */
-        private void handleRxsigmeasreport(RXSigMeasReport rxSigMeasReport) {
-            List<RXSigReport> rxSigReportList = rxSigMeasReport.getCellMeasReports().getRXSigReport();
-
-            RnibUe ue = ueMap.get(rxSigMeasReport.getEcgi(), rxSigMeasReport.getCrnti());
-            if (ue != null) {
-                Long ueId = ue.getId();
-
-                if (!rxSigReportList.isEmpty()) {
-                    rxSigReportList.forEach(rxSigReport -> {
-                        RnibCell cell = cellMap.get(rxSigReport.getPciArfcn());
-                        if (cell != null) {
-                            ECGI ecgi = cell.getEcgi();
-
-                            RnibLink link = linkMap.get(ecgi, ueId);
-                            if (link == null) {
-                                log.warn("Could not find link between: {}-{} | Creating non-serving link..",
-                                        ecgi, ueId);
-                                link = linkMap.putNonServingLink(cell, ueId);
-                            }
-
-                            if (link != null) {
-                                if (link.getType().equals(RnibLink.Type.NON_SERVING)) {
-                                    restartTimer(link);
-                                }
-
-                                RSRQRange rsrq = rxSigReport.getRsrq();
-                                RSRPRange rsrp = rxSigReport.getRsrp();
-
-                                RnibLink.LinkQuality quality = link.getQuality();
-                                quality.setRx(new RnibLink.LinkQuality.Rx(
-                                        rsrp.value.intValue() - 140,
-                                        (rsrq.value.intValue() * 0.5) - 19.5
-                                ));
-                            }
-                        } else {
-                            log.warn("case 16: Could not find cell with PCI-ARFCN: {}",
-                                    rxSigReport.getPciArfcn());
-                        }
-                    });
-                }
-            }
-        }
-
-        /**
-         * Handle RadioMeasReportPerUE.
-         *
-         * @param radioMeasReportPerUE RadioMeasReportPerUE
-         */
-        private void handleRadionmeasreportperue(RadioMeasReportPerUE radioMeasReportPerUE) {
-            RnibUe ue = ueMap.get(radioMeasReportPerUE.getEcgi(), radioMeasReportPerUE.getCrnti());
-            if (ue != null) {
-                Long ueId = ue.getId();
-                List<RadioRepPerServCell> servCells = radioMeasReportPerUE.getRadioReportServCells()
-                        .getRadioRepPerServCell();
-
-                servCells.forEach(servCell -> {
-                    RnibCell cell = cellMap.get(servCell.getPciArfcn());
-                    if (cell != null) {
-                        RnibLink link = linkMap.get(cell.getEcgi(), ueId);
-                        if (link != null) {
-                            RadioRepPerServCell.CqiHist cqiHist = servCell.getCqiHist();
-                            RnibLink.LinkQuality quality = link.getQuality();
-
-                            final double[] values = {0, 0, 0};
-                            final int[] i = {1};
-                            cqiHist.getBerInteger().forEach(value -> {
-                                values[0] = Math.max(values[0], value.intValue());
-                                values[1] += i[0] * value.intValue();
-                                values[2] += value.intValue();
-                                i[0]++;
-                            });
-
-                            quality.setCqi(new RnibLink.LinkQuality.Cqi(
-                                    cqiHist,
-                                    values[0],
-                                    values[1] / values[0]
-                            ));
-
-                        } else {
-                            log.warn("Could not find link between: {}-{}", cell.getEcgi(), ueId);
-                        }
-                    } else {
-                        log.warn("case 18: Could not find cell with PCI-ARFCN: {}", servCell.getPciArfcn());
-                    }
-                });
-            }
-        }
-
-        /**
-         * Handle SchedMeasReportPerUE.
-         *
-         * @param schedMeasReportPerUE SchedMeasReportPerUE
-         */
-        private void handleSchedmeasreportperue(SchedMeasReportPerUE schedMeasReportPerUE) {
-            RnibUe ue = ueMap.get(schedMeasReportPerUE.getEcgi(), schedMeasReportPerUE.getCrnti());
-            if (ue != null) {
-                Long ueId = ue.getId();
-
-                List<SchedMeasRepPerServCell> servCells = schedMeasReportPerUE.getSchedReportServCells()
-                        .getSchedMeasRepPerServCell();
-
-                servCells.forEach(servCell -> {
-                    RnibCell cell = cellMap.get(servCell.getPciArfcn());
-                    if (cell != null) {
-                        RnibLink link = linkMap.get(cell.getEcgi(), ueId);
-                        if (link != null) {
-                            link.getQuality().setMcs(new RnibLink.LinkQuality.Mcs(
-                                    servCell.getMcsDl(),
-                                    servCell.getMcsUl()
-                            ));
-
-                            link.setResourceUsage(new RnibLink.ResourceUsage(
-                                    servCell.getPrbUsage().getPrbUsageDl(),
-                                    servCell.getPrbUsage().getPrbUsageUl()
-                            ));
-                        } else {
-                            log.warn("Could not find link between: {}-{}", cell.getEcgi(), ueId);
-                        }
-                    } else {
-                        log.warn("case 20: Could not find cell with PCI-ARFCN: {}", servCell.getPciArfcn());
-                    }
-                });
-            }
-        }
-
-        /**
-         * Handle SchedMeasReportPerCell.
-         *
-         * @param schedMeasReportPerCell SchedMeasReportPerCell
-         */
-        private void handleSchedmeasreportpercell(SchedMeasReportPerCell schedMeasReportPerCell) {
-            RnibCell cell = cellMap.get(schedMeasReportPerCell.getEcgi());
-            if (cell != null) {
-                cell.setPrbUsage(new RnibCell.PrbUsageContainer(
-                        schedMeasReportPerCell.getPrbUsagePcell(),
-                        schedMeasReportPerCell.getPrbUsageScell()
-                ));
-
-                cell.setQci(schedMeasReportPerCell.getQciVals());
-            } else {
-                log.warn("Could not find cell with ECGI: {}", schedMeasReportPerCell.getEcgi());
-            }
-        }
-
-        /**
-         * Handle PDCPMeasReportPerUe.
-         *
-         * @param pdcpMeasReportPerUe PDCPMeasReportPerUe
-         */
-        private void handlePdcpmeasreportperue(PDCPMeasReportPerUe pdcpMeasReportPerUe) {
-            RnibUe ue = ueMap.get(pdcpMeasReportPerUe.getEcgi(), pdcpMeasReportPerUe.getCrnti());
-            if (ue != null) {
-                Long ueId = ue.getId();
-                RnibLink link = linkMap.get(pdcpMeasReportPerUe.getEcgi(), ueId);
-                if (link != null) {
-                    link.setPdcpThroughput(new RnibLink.PdcpThroughput(
-                            pdcpMeasReportPerUe.getThroughputDl(),
-                            pdcpMeasReportPerUe.getThroughputUl()
-                    ));
-
-                    link.setPdcpPackDelay(new RnibLink.PdcpPacketdelay(
-                            pdcpMeasReportPerUe.getPktDelayDl(),
-                            pdcpMeasReportPerUe.getPktDelayUl()
-                    ));
-                } else {
-                    log.warn("Could not find link between: {}-{}", pdcpMeasReportPerUe.getEcgi(), ueId);
-                }
-            }
-        }
-
-        /**
-         * Handle UECapabilityInfo.
-         *
-         * @param capabilityInfo UECapabilityInfo
-         */
-        private void handleCapabilityinfo(UECapabilityInfo capabilityInfo) {
-            RnibUe ue = ueMap.get(capabilityInfo.getEcgi(), capabilityInfo.getCrnti());
-            if (ue != null) {
-                ue.setCapability(capabilityInfo);
-            } else {
-                log.warn("Could not find UE with this CRNTI: {}", capabilityInfo.getCrnti());
-            }
-        }
-
-        /**
-         * Handle UECapabilityEnquiry.
-         *
-         * @param ueCapabilityEnquiry UECapabilityEnquiry
-         * @param ctx                 ChannelHandlerContext
-         * @throws IOException IO Exception
-         */
-        private void handleUecapabilityenquiry(UECapabilityEnquiry ueCapabilityEnquiry, ChannelHandlerContext ctx)
-                throws IOException {
-            XrancPdu xrancPdu = UECapabilityEnquiry.constructPacket(ueCapabilityEnquiry.getEcgi(),
-                    ueCapabilityEnquiry.getCrnti());
-            ctx.writeAndFlush(getSctpMessage(xrancPdu));
-        }
-
-        /**
-         * Handle ScellAddStatus.
-         *
-         * @param scellAddStatus ScellAddStatus
-         */
-        private void handleScelladdstatus(ScellAddStatus scellAddStatus) {
-            RnibUe ue = ueMap.get(scellAddStatus.getEcgi(), scellAddStatus.getCrnti());
-            if (ue != null) {
-                Long ueId = ue.getId();
-                try {
-                    scellAddMap.get(scellAddStatus.getCrnti()).put("Scell's status: " +
-                            scellAddStatus.getStatus());
-                    final int[] i = {0};
-                    scellAddStatus.getScellsInd().getPCIARFCN().forEach(
-                            pciarfcn -> {
-                                if (scellAddStatus.getStatus().getBerEnum().get(i[0]).value.intValue() == 0) {
-                                    RnibCell cell = cellMap.get(pciarfcn);
-                                    RnibLink link = linkMap.get(cell.getEcgi(), ueId);
-                                    link.setType(RnibLink.Type.SERVING_SECONDARY_CA);
-                                }
-                                i[0]++;
-                            }
-                    );
-
-                } catch (InterruptedException e) {
-                    log.error(ExceptionUtils.getFullStackTrace(e));
-                    e.printStackTrace();
-                } finally {
-                    scellAddMap.remove(scellAddStatus.getCrnti());
-                }
-            }
-        }
-
-        /**
-         * Handle RRMConfigStatus.
-         *
-         * @param rrmConfigStatus RRMConfigStatus
-         */
-        private void handleRrmconfigstatus(RRMConfigStatus rrmConfigStatus) {
-            try {
-                rrmcellMap.get(rrmConfigStatus.getEcgi())
-                        .put("RRM Config's status: " + rrmConfigStatus.getStatus());
-            } catch (InterruptedException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
-                e.printStackTrace();
-            } finally {
-                rrmcellMap.remove(rrmConfigStatus.getEcgi());
-            }
-        }
-
-        /**
-         * Handle TrafficSplitConfig.
-         *
-         * @param trafficSplitConfig TrafficSplitConfig
-         */
-        private void handleTrafficSplitConfig(TrafficSplitConfig trafficSplitConfig) {
-            RnibUe ue = ueMap.get(trafficSplitConfig.getEcgi(), trafficSplitConfig.getCrnti());
-            if (ue != null) {
-                Long ueId = ue.getId();
-                List<TrafficSplitPercentage> splitPercentages = trafficSplitConfig
-                        .getTrafficSplitPercent().getTrafficSplitPercentage();
-
-                splitPercentages.forEach(trafficSplitPercentage -> {
-                    RnibCell cell = cellMap.get(trafficSplitPercentage.getEcgi());
-                    if (cell != null) {
-                        RnibLink link = linkMap.get(cell.getEcgi(), ueId);
-                        if (link != null) {
-                            link.setTrafficPercent(trafficSplitPercentage);
-                        } else {
-                            log.warn("Could not find link between: {}-{}", cell.getEcgi(), ueId);
-                        }
-                    } else {
-                        log.warn("Could not find cell with ECGI: {}", trafficSplitConfig.getEcgi());
-                    }
-                });
-            }
-        }
-
-        /**
-         * Handle context update depending if its handoff or not.
-         *
-         * @param contextUpdate context update packet
-         * @param ctx           channel context for the CELL
-         * @param handoff       true if we handle a Hand Off
-         */
-        private void handlePairedPackets(UEContextUpdate contextUpdate, ChannelHandlerContext ctx, boolean handoff) {
-            RnibUe ue;
-            RnibCell cell = xranStore.getCell(contextUpdate.getEcgi());
-
-            if (handoff) {
-                try {
-                    ue = ueMap.get(ueIdQueue.take());
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                    log.error(ExceptionUtils.getFullStackTrace(e));
-                    ue = new RnibUe();
-                }
-            } else {
-                ue = new RnibUe();
-            }
-
-            ue.setMmeS1apId(contextUpdate.getMMEUES1APID());
-            ue.setEnbS1apId(contextUpdate.getENBUES1APID());
-            ue.setCrnti(contextUpdate.getCrnti());
-
-            hostAgent.addConnectedHost(ue, cell, ctx);
-        }
-    }
-
-    /**
-     * Internal class for NetworkConfigListener.
-     */
-    class InternalNetworkConfigListener implements NetworkConfigListener {
-
-        @Override
-        public void event(NetworkConfigEvent event) {
-            switch (event.type()) {
-                case CONFIG_REGISTERED:
-                    break;
-                case CONFIG_UNREGISTERED:
-                    break;
-                case CONFIG_ADDED:
-                case CONFIG_UPDATED:
-                    if (event.configClass() == CONFIG_CLASS) {
-                        handleConfigEvent(event.config());
-                    }
-                    break;
-                case CONFIG_REMOVED:
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        /**
-         * Handle config event.
-         *
-         * @param config
-         */
-        private void handleConfigEvent(Optional<Config> config) {
-            if (!config.isPresent()) {
-                return;
-            }
-
-            xranConfig = (XranConfig) config.get();
-
-            northboundTimeout = xranConfig.getNorthBoundTimeout();
-
-            legitCells.putAll(xranConfig.activeCellSet());
-
-            controller.start(deviceAgent, hostAgent, packetAgent, xranConfig.getXrancIp(), xranConfig.getXrancPort());
-        }
-    }
-}
diff --git a/src/main/java/org.onosproject.xran/entities/RnibCell.java b/src/main/java/org.onosproject.xran/entities/RnibCell.java
deleted file mode 100644
index c7ffe69..0000000
--- a/src/main/java/org.onosproject.xran/entities/RnibCell.java
+++ /dev/null
@@ -1,533 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.entities;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import com.fasterxml.jackson.databind.JsonNode;
-import org.onosproject.net.DeviceId;
-import org.onosproject.store.service.WallClockTimestamp;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PRBUsage;
-import org.onosproject.xran.codecs.api.XICICPA;
-import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
-import org.onosproject.xran.codecs.ber.types.BerBitString;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.pdu.CellConfigReport;
-import org.onosproject.xran.codecs.pdu.L2MeasConfig;
-import org.onosproject.xran.codecs.pdu.RRMConfig;
-import org.onosproject.xran.codecs.pdu.SchedMeasReportPerCell;
-
-import javax.xml.bind.DatatypeConverter;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-
-/**
- * R-NIB Cell and its properties.
- */
-@JsonPropertyOrder({
-        "ECGI",
-        "Configuration",
-        "PRB-Usage",
-        "QCI",
-        "RRMConfiguration",
-        "MeasurementConfiguration"
-})
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class RnibCell {
-    @JsonIgnore
-    private static final String SCHEME = "xran";
-
-    @JsonProperty("ECGI")
-    private ECGI ecgi;
-    @JsonProperty("Configuration")
-    private CellConfigReport conf;
-    @JsonProperty("PRB-Usage")
-    private PrbUsageContainer prbUsage;
-    @JsonProperty("QCI")
-    private SchedMeasReportPerCell.QciVals qci;
-    @JsonProperty("RRMConfiguration")
-    private RRMConfig rrmConfig;
-    @JsonProperty("MeasurementConfiguration")
-    private L2MeasConfig measConfig;
-
-    @JsonIgnore
-    private String version;
-
-    public RnibCell() {
-        version = "3";
-
-        rrmConfig = new RRMConfig();
-        rrmConfig.setEcgi(ecgi);
-    }
-
-    /**
-     * Encode ECGI and obtain its URI.
-     *
-     * @param ecgi ECGI
-     * @return URI
-     */
-    public static URI uri(ECGI ecgi) {
-        if (ecgi != null) {
-            try {
-                BerByteArrayOutputStream os = new BerByteArrayOutputStream(4096);
-                ecgi.encode(os);
-                String message = DatatypeConverter.printHexBinary(os.getArray());
-                return new URI(SCHEME, message, null);
-            } catch (URISyntaxException | IOException e) {
-                return null;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Obtain ECGI from the device ID.
-     *
-     * @param deviceId ID of the device
-     * @return ECGI
-     * @throws IOException I0 Exception for ByteArrayInputStream
-     */
-    public static ECGI decodeDeviceId(DeviceId deviceId) throws IOException {
-        String uri = deviceId.toString();
-        String hexEcgi = uri.substring(uri.lastIndexOf("xran:") + 5);
-
-        ECGI ecgi = new ECGI();
-        byte[] bytearray = DatatypeConverter.parseHexBinary(hexEcgi);
-        InputStream inputStream = new ByteArrayInputStream(bytearray);
-
-        ecgi.decode(inputStream);
-        return ecgi;
-    }
-
-    /**
-     * Get version ID.
-     *
-     * @return version ID
-     */
-    public int getVersion() {
-        return Integer.parseInt(version);
-    }
-
-    /**
-     * Set version ID.
-     *
-     * @param version version ID
-     */
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    /**
-     * Get RRMConfig.
-     *
-     * @return RRMConfig
-     */
-    @JsonProperty("RRMConfiguration")
-    public RRMConfig getRrmConfig() {
-        return rrmConfig;
-    }
-
-    /**
-     * Set RRMConfig properties.
-     *
-     * @param rrmConfig RRMConfig
-     */
-    @JsonProperty("RRMConfiguration")
-    public void setRrmConfig(RRMConfig rrmConfig) {
-        this.rrmConfig = rrmConfig;
-    }
-
-    /**
-     * Get PRB Usage.
-     * @return prb usage
-     */
-    @JsonProperty("PRB-Usage")
-    public PrbUsageContainer getPrbUsage() {
-        return prbUsage;
-    }
-
-    /**
-     * Set PRB Usage.
-     *
-     * @param prbUsage prb Usage
-     */
-    @JsonProperty("PRB-Usage")
-    public void setPrbUsage(PrbUsageContainer prbUsage) {
-        this.prbUsage = prbUsage;
-    }
-
-    /**
-     * Get ECGI.
-     *
-     * @return ECGI
-     */
-    @JsonProperty("ECGI")
-    public ECGI getEcgi() {
-        return ecgi;
-    }
-
-    /**
-     * Set ECGI.
-     *
-     * @param ecgi ECGI
-     */
-    @JsonProperty("ECGI")
-    public void setEcgi(ECGI ecgi) {
-        this.ecgi = ecgi;
-    }
-
-    /**
-     * Get cell config report.
-     *
-     * @return CellConfig Report
-     */
-    @JsonProperty("Configuration")
-    public CellConfigReport getConf() {
-        return conf;
-    }
-
-    /**
-     * Set cell config report.
-     *
-     * @param conf Cell config report
-     */
-    @JsonProperty("Configuration")
-    public void setConf(CellConfigReport conf) {
-        this.conf = conf;
-    }
-
-    /**
-     * Modify the RRM Config parameters of cell.
-     *
-     * @param rrmConfigNode RRMConfig parameters to modify obtained from REST call
-     * @param ueList List of all UEs
-     * @throws Exception p_a size not equal to UE size
-     */
-    public void modifyRrmConfig(JsonNode rrmConfigNode, List<RnibUe> ueList) throws Exception {
-        RRMConfig.Crnti crnti = new RRMConfig.Crnti();
-        ueList.forEach(ue -> crnti.addCRNTI(ue.getCrnti()));
-
-            JsonNode pA = rrmConfigNode.path("p_a");
-            if (!pA.isMissingNode()) {
-                RRMConfig.Pa pa = new RRMConfig.Pa();
-                if (pA.isArray()) {
-                    if (ueList.size() == pA.size()) {
-                        List<XICICPA> collect = Stream.of(pA)
-                                .map(val -> new XICICPA(val.asInt()))
-                                .collect(Collectors.toList());
-                        pa.setXICICPA(collect);
-                    } else {
-                        throw new Exception("p_a size is not the same as UE size");
-                    }
-                }
-                rrmConfig.setPa(pa);
-            }
-
-            JsonNode startPrbDl1 = rrmConfigNode.path("start_prb_dl");
-            if (!startPrbDl1.isMissingNode()) {
-                RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
-                if (startPrbDl1.isArray()) {
-                    if (ueList.size() == startPrbDl1.size()) {
-                        List<BerInteger> collect = Stream.of(startPrbDl1)
-                                .map(val -> new BerInteger(val.asInt()))
-                                .collect(Collectors.toList());
-                        startPrbDl.setSeqOf(collect);
-                    } else {
-                        throw new Exception("start_prb_dl size is not the same as UE size");
-                    }
-                }
-                rrmConfig.setStartPrbDl(startPrbDl);
-            }
-
-            JsonNode endPrbDl1 = rrmConfigNode.path("end_prb_dl");
-            if (!endPrbDl1.isMissingNode()) {
-                RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
-                if (endPrbDl1.isArray()) {
-                    if (ueList.size() == endPrbDl1.size()) {
-                        List<BerInteger> collect = Stream.of(endPrbDl1)
-                                .map(val -> new BerInteger(val.asInt()))
-                                .collect(Collectors.toList());
-                        endPrbDl.setSeqOf(collect);
-                    } else {
-                        throw new Exception("end_prb_dl size is not the same as UE size");
-                    }
-                }
-                rrmConfig.setEndPrbDl(endPrbDl);
-            }
-
-            JsonNode frameBitmaskDl = rrmConfigNode.path("sub_frame_bitmask_dl");
-            if (!frameBitmaskDl.isMissingNode()) {
-                RRMConfig.SubframeBitmaskDl subframeBitmaskDl = new RRMConfig.SubframeBitmaskDl();
-                if (frameBitmaskDl.isArray()) {
-                    List<BerBitString> collect = Stream.of(frameBitmaskDl)
-                            .map(val -> new BerBitString(DatatypeConverter.parseHexBinary(val.asText()), 10))
-                            .collect(Collectors.toList());
-
-                    subframeBitmaskDl.setSeqOf(collect);
-                } else {
-                    throw new Exception("sub_frame_bitmask_dl size is not the same as UE size");
-                }
-                rrmConfig.setSubframeBitmaskDl(subframeBitmaskDl);
-            }
-
-            JsonNode startPrbUl1 = rrmConfigNode.path("start_prb_ul");
-            if (!startPrbUl1.isMissingNode()) {
-                RRMConfig.StartPrbUl startPrbUl = new RRMConfig.StartPrbUl();
-                if (startPrbUl1.isArray()) {
-                    if (ueList.size() == startPrbUl1.size()) {
-                        List<BerInteger> collect = Stream.of(startPrbUl1)
-                                .map(val -> new BerInteger(val.asInt()))
-                                .collect(Collectors.toList());
-                        startPrbUl.setSeqOf(collect);
-                    } else {
-                        throw new Exception("start_prb_ul size is not the same as UE size");
-                    }
-                }
-                rrmConfig.setStartPrbUl(startPrbUl);
-            }
-
-            JsonNode endPrbUl1 = rrmConfigNode.path("end_prb_ul");
-            if (!endPrbUl1.isMissingNode()) {
-                RRMConfig.EndPrbUl endPrbUl = new RRMConfig.EndPrbUl();
-                if (endPrbUl1.isArray()) {
-                    if (ueList.size() == endPrbUl1.size()) {
-                        List<BerInteger> collect = Stream.of(endPrbUl1)
-                                .map(val -> new BerInteger(val.asInt()))
-                                .collect(Collectors.toList());
-                        endPrbUl.setSeqOf(collect);
-                    } else {
-                        throw new Exception("end_prb_ul size is not the same as UE size");
-                    }
-                }
-                rrmConfig.setEndPrbUl(endPrbUl);
-            }
-
-            JsonNode uePusch = rrmConfigNode.path("p0_ue_pusch");
-            if (!uePusch.isMissingNode()) {
-                RRMConfig.P0UePusch p0UePusch = new RRMConfig.P0UePusch();
-                if (uePusch.isArray()) {
-                    if (ueList.size() == uePusch.size()) {
-                        List<BerInteger> collect = Stream.of(uePusch)
-                                .map(val -> new BerInteger(val.asInt()))
-                                .collect(Collectors.toList());
-                        p0UePusch.setSeqOf(collect);
-                    } else {
-                        throw new Exception("p0_ue_pusch size is not the same as UE size");
-                    }
-                }
-                rrmConfig.setP0UePusch(p0UePusch);
-            }
-
-            JsonNode frameBitmaskUl = rrmConfigNode.path("sub_frame_bitmask_ul");
-            if (!frameBitmaskUl.isMissingNode()) {
-                RRMConfig.SubframeBitmaskUl subframeBitmaskUl = new RRMConfig.SubframeBitmaskUl();
-                if (frameBitmaskUl.isArray()) {
-                    List<BerBitString> collect = Stream.of(frameBitmaskUl)
-                            .map(val -> new BerBitString(DatatypeConverter.parseHexBinary(val.asText()), 10))
-                            .collect(Collectors.toList());
-
-                    subframeBitmaskUl.setSeqOf(collect);
-                } else {
-                    throw new Exception("sub_frame_bitmask_ul size is not the same as UE size");
-                }
-                rrmConfig.setSubframeBitmaskUl(subframeBitmaskUl);
-            }
-
-        rrmConfig.setCrnti(crnti);
-    }
-
-    /**
-     * Get QCI values.
-     *
-     * @return QCI values
-     */
-    @JsonProperty("QCI")
-    public SchedMeasReportPerCell.QciVals getQci() {
-        return qci;
-    }
-
-    /**
-     * Set QCI values.
-     *
-     * @param qci QCI
-     */
-    @JsonProperty("QCI")
-    public void setQci(SchedMeasReportPerCell.QciVals qci) {
-        this.qci = qci;
-    }
-
-    /**
-     * Get L2 measurement config.
-     *
-     * @return L2MeasConfig
-     */
-    @JsonProperty("MeasurementConfiguration")
-    public L2MeasConfig getMeasConfig() {
-        return measConfig;
-    }
-
-    /**
-     * Set L2 measurement config.
-     *
-     * @param measConfig l2MeasConfig
-     */
-    @JsonProperty("MeasurementConfiguration")
-    public void setMeasConfig(L2MeasConfig measConfig) {
-        this.measConfig = measConfig;
-    }
-
-    @Override
-    public String toString() {
-        return "RnibCell{" +
-                "ecgi=" + ecgi +
-                ", conf=" + conf +
-                ", prbUsage=" + prbUsage +
-                ", qci=" + qci +
-                ", rrmConfig=" + rrmConfig +
-                ", measConfig=" + measConfig +
-                ", version='" + version + '\'' +
-                '}';
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Object#equals()
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        RnibCell rnibCell = (RnibCell) o;
-
-        return ecgi.equals(rnibCell.ecgi);
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return ecgi.hashCode();
-    }
-
-    /**
-     * Container class for PRBUsage.
-     */
-    @JsonPropertyOrder({
-            "primary",
-            "secondary",
-            "timesincelastupdate"
-    })
-    @JsonIgnoreProperties(ignoreUnknown = true)
-    public static class PrbUsageContainer {
-        PRBUsage primary;
-        PRBUsage secondary;
-        WallClockTimestamp timesincelastupdate;
-
-        @JsonCreator
-        public PrbUsageContainer(@JsonProperty("primary") PRBUsage primary,
-                                 @JsonProperty("secondary") PRBUsage secondary) {
-            this.primary = primary;
-            this.secondary = secondary;
-            this.timesincelastupdate = new WallClockTimestamp();
-        }
-
-        /**
-         * Get primary PRBUsage.
-         *
-         * @return PRBUsage
-         */
-        public PRBUsage getPrimary() {
-            return primary;
-        }
-
-        /**
-         * Set secondary PRBUsage.
-         *
-         * @param primary PRBUsage
-         */
-        public void setPrimary(PRBUsage primary) {
-            this.primary = primary;
-        }
-
-        /**
-         * Get secondary PRBUsage.
-         *
-         * @return PRBUsage
-         */
-        public PRBUsage getSecondary() {
-            return secondary;
-        }
-
-        /**
-         * Set secondary PRBUsage.
-         *
-         * @param secondary PRBUsage
-         */
-        public void setSecondary(PRBUsage secondary) {
-            this.secondary = secondary;
-        }
-
-        /**
-         * Get time since last update.
-         *
-         * @return long Time
-         */
-        public long getTimeSinceLastUpdate() {
-            return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
-        }
-
-
-        /**
-         * Set time since last update.
-         *
-         * @param timesincelastupdate time since last update
-         */
-        public void setTimeSinceLastUpdate(WallClockTimestamp timesincelastupdate) {
-            this.timesincelastupdate = timesincelastupdate;
-        }
-
-        @Override
-        public String toString() {
-            return "PrbUsageContainer{" +
-                    "primary=" + primary +
-                    ", secondary=" + secondary +
-                    ", timesincelastupdate=" + (new WallClockTimestamp().unixTimestamp() -
-                    timesincelastupdate.unixTimestamp()) +
-                    '}';
-        }
-    }
-}
diff --git a/src/main/java/org.onosproject.xran/entities/RnibLink.java b/src/main/java/org.onosproject.xran/entities/RnibLink.java
deleted file mode 100644
index 4eb18a8..0000000
--- a/src/main/java/org.onosproject.xran/entities/RnibLink.java
+++ /dev/null
@@ -1,1041 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.entities;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.Lists;
-import org.onosproject.store.service.WallClockTimestamp;
-import org.onosproject.xran.codecs.api.ERABParams;
-import org.onosproject.xran.codecs.api.RadioRepPerServCell;
-import org.onosproject.xran.codecs.api.TrafficSplitPercentage;
-import org.onosproject.xran.codecs.api.XICICPA;
-import org.onosproject.xran.codecs.api.SchedMeasRepPerServCell;
-import org.onosproject.xran.codecs.api.PRBUsage;
-import org.onosproject.xran.codecs.ber.types.BerBitString;
-import org.onosproject.xran.codecs.ber.types.BerInteger;
-import org.onosproject.xran.codecs.pdu.PDCPMeasReportPerUe;
-import org.onosproject.xran.codecs.pdu.RRMConfig;
-import org.onosproject.xran.identifiers.LinkId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.xml.bind.DatatypeConverter;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import java.util.Timer;
-
-/**
- * R-NIB Link and its properties.
- */
-@JsonPropertyOrder({
-        "Link-ID",
-        "Type",
-        "RRMConfiguration",
-        "TrafficPercent",
-        "BearerParameters",
-        "Quality",
-        "PDCP-Throughput",
-        "PDCP-Packet-Delay",
-        "Resource-Usage"
-})
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class RnibLink {
-    @JsonIgnore
-    private static final Logger log =
-            LoggerFactory.getLogger(RnibLink.class);
-
-    @JsonProperty("Link-ID")
-    private LinkId linkId;
-    @JsonProperty("RRMConfiguration")
-    private RRMConfig rrmParameters;
-    @JsonProperty("TrafficPercent")
-    private TrafficSplitPercentage trafficPercent;
-    @JsonProperty("BearerParameters")
-    private ERABParams bearerParameters;
-    @JsonProperty("Quality")
-    private LinkQuality quality;
-    @JsonProperty("PDCP-Throughput")
-    private PdcpThroughput pdcpThroughput;
-    @JsonProperty("PDCP-Packet-Delay")
-    private PdcpPacketdelay pdcpPackDelay;
-    @JsonProperty("Resource-Usage")
-    private ResourceUsage resourceUsage;
-    @JsonProperty("Type")
-    private Type type;
-    @JsonIgnore
-    private Timer timer;
-
-    public RnibLink(RnibCell cell, RnibUe ue) {
-        trafficPercent = new TrafficSplitPercentage();
-        trafficPercent.setEcgi(cell.getEcgi());
-        trafficPercent.setTrafficPercentDl(new BerInteger(100));
-        trafficPercent.setTrafficPercentUl(new BerInteger(100));
-
-        timer = new Timer();
-
-        type = Type.NON_SERVING;
-
-        linkId = LinkId.valueOf(cell, ue);
-
-        quality = new LinkQuality();
-
-        rrmParameters = new RRMConfig();
-        RRMConfig.Crnti crnti = new RRMConfig.Crnti();
-        crnti.addCRNTI(linkId.getUe().getCrnti());
-        rrmParameters.setCrnti(crnti);
-        rrmParameters.setEcgi(linkId.getEcgi());
-    }
-
-    /**
-     * Get timer.
-     *
-     * @return Timer
-     */
-    public Timer getTimer() {
-        return timer;
-    }
-
-    public void setTimer(Timer timer) {
-        this.timer.cancel();
-        this.timer.purge();
-        this.timer = timer;
-    }
-
-    /**
-     * Get Link ID.
-     * @return LinkID
-     */
-    @JsonProperty("Link-ID")
-    public LinkId getLinkId() {
-        return linkId;
-    }
-
-    /**
-     * Set the Link ID.
-     * @param linkId Link ID
-     */
-    @JsonProperty("Link-ID")
-    public void setLinkId(LinkId linkId) {
-        this.linkId = linkId;
-    }
-
-    /**
-     * Set the LINK ID with cell and ue.
-     * @param cell Rnib CELL
-     * @param ue Rnib UE
-     */
-    public void setLinkId(RnibCell cell, RnibUe ue) {
-        this.linkId = LinkId.valueOf(cell, ue);
-        trafficPercent.setEcgi(cell.getEcgi());
-    }
-
-    /**
-     * Get the link type.
-     *
-     * @return Link-type
-     */
-    @JsonProperty("Type")
-    public Type getType() {
-        return type;
-    }
-
-    /**
-     * Set the link type.
-     * @param type Link-type
-     */
-    @JsonProperty("Type")
-    public void setType(Type type) {
-        this.type = type;
-    }
-
-    /**
-     * Get traffic percent.
-     * @return TrafficSplitPercentage
-     */
-    @JsonProperty("TrafficPercent")
-    public TrafficSplitPercentage getTrafficPercent() {
-        return trafficPercent;
-    }
-
-    /**
-     * Set traffic percent.
-     * @param trafficPercent TrafficSplitPercentage
-     */
-    @JsonProperty("TrafficPercent")
-    public void setTrafficPercent(TrafficSplitPercentage trafficPercent) {
-        this.trafficPercent = trafficPercent;
-    }
-
-    /**
-     * Get the Bearer Parameters.
-     * @return ERABParams
-     */
-    @JsonProperty("BearerParameters")
-    public ERABParams getBearerParameters() {
-        return bearerParameters;
-    }
-
-    /**
-     * Set the Bearer Parameters.
-     * @param bearerParameters ERABParams
-     */
-    @JsonProperty("BearerParameters")
-    public void setBearerParameters(ERABParams bearerParameters) {
-        this.bearerParameters = bearerParameters;
-    }
-
-    /**
-     * Get Quality.
-     * @return LinkQuality
-     */
-    @JsonProperty("Quality")
-    public LinkQuality getQuality() {
-        return quality;
-    }
-
-    /**
-     * Set Quality.
-     * @param quality LinkQuality
-     */
-    @JsonProperty("Quality")
-    public void setQuality(LinkQuality quality) {
-        this.quality = quality;
-    }
-
-    /**
-     * Get RRM Configuration.
-     * @return RRMConfig
-     */
-    @JsonProperty("RRMConfiguration")
-    public RRMConfig getRrmParameters() {
-        return rrmParameters;
-    }
-
-    /**
-     * Set RRM Configuration.
-     * @param rrmParameters RRMConfig
-     */
-    @JsonProperty("RRMConfiguration")
-    public void setRrmParameters(RRMConfig rrmParameters) {
-        this.rrmParameters = rrmParameters;
-    }
-
-    /**
-     * Modify the RRM Config parameters of link.
-     *
-     * @param rrmConfigNode RRMConfig parameters to modify obtained from REST call
-     */
-    public void modifyRrmParameters(JsonNode rrmConfigNode) {
-
-        JsonNode pA = rrmConfigNode.path("p_a");
-        if (!pA.isMissingNode()) {
-            RRMConfig.Pa pa = new RRMConfig.Pa();
-
-            List<XICICPA> collect = Lists.newArrayList();
-            collect.add(new XICICPA(pA.asInt()));
-            pa.setXICICPA(collect);
-            rrmParameters.setPa(pa);
-        }
-
-        JsonNode startPrbDl1 = rrmConfigNode.path("start_prb_dl");
-        if (!startPrbDl1.isMissingNode()) {
-            RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
-
-            List<BerInteger> collect = Lists.newArrayList();
-            collect.add(new BerInteger(startPrbDl1.asInt()));
-            startPrbDl.setSeqOf(collect);
-
-            rrmParameters.setStartPrbDl(startPrbDl);
-        }
-
-        JsonNode endPrbDl1 = rrmConfigNode.path("end_prb_dl");
-        if (!endPrbDl1.isMissingNode()) {
-            RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
-
-            List<BerInteger> collect = Lists.newArrayList();
-            collect.add(new BerInteger(endPrbDl1.asInt()));
-            endPrbDl.setSeqOf(collect);
-
-            rrmParameters.setEndPrbDl(endPrbDl);
-        }
-
-        JsonNode subFrameBitmaskDl = rrmConfigNode.path("sub_frame_bitmask_dl");
-        if (!subFrameBitmaskDl.isMissingNode()) {
-            RRMConfig.SubframeBitmaskDl subframeBitmaskDl = new RRMConfig.SubframeBitmaskDl();
-            List<BerBitString> collect = Lists.newArrayList();
-
-            byte[] hexString = DatatypeConverter.parseHexBinary(subFrameBitmaskDl.asText());
-            collect.add(new BerBitString(hexString, 10));
-            subframeBitmaskDl.setSeqOf(collect);
-            rrmParameters.setSubframeBitmaskDl(subframeBitmaskDl);
-        }
-
-        JsonNode startPrbUl1 = rrmConfigNode.path("start_prb_ul");
-        if (!startPrbUl1.isMissingNode()) {
-            RRMConfig.StartPrbUl startPrbUl = new RRMConfig.StartPrbUl();
-
-            List<BerInteger> collect = Lists.newArrayList();
-            collect.add(new BerInteger(startPrbUl1.asInt()));
-            startPrbUl.setSeqOf(collect);
-
-            rrmParameters.setStartPrbUl(startPrbUl);
-        }
-
-        JsonNode endPrbUl1 = rrmConfigNode.path("end_prb_ul");
-        if (!endPrbUl1.isMissingNode()) {
-            RRMConfig.EndPrbUl endPrbUl = new RRMConfig.EndPrbUl();
-
-            List<BerInteger> collect = Lists.newArrayList();
-            collect.add(new BerInteger(endPrbUl1.asInt()));
-            endPrbUl.setSeqOf(collect);
-
-            rrmParameters.setEndPrbUl(endPrbUl);
-        }
-
-
-        JsonNode p0UePusch1 = rrmConfigNode.path("p0_ue_pusch");
-        if (!p0UePusch1.isMissingNode()) {
-            RRMConfig.P0UePusch p0UePusch = new RRMConfig.P0UePusch();
-
-            List<BerInteger> collect = Lists.newArrayList();
-            collect.add(new BerInteger(p0UePusch1.asInt()));
-            p0UePusch.setSeqOf(collect);
-
-            rrmParameters.setP0UePusch(p0UePusch);
-        }
-
-        JsonNode subFrameBitmaskUl = rrmConfigNode.path("sub_frame_bitmask_ul");
-        if (!subFrameBitmaskUl.isMissingNode()) {
-            RRMConfig.SubframeBitmaskUl subframeBitmaskUl = new RRMConfig.SubframeBitmaskUl();
-            List<BerBitString> collect = Lists.newArrayList();
-
-            byte[] hexString = DatatypeConverter.parseHexBinary(subFrameBitmaskUl.asText());
-            collect.add(new BerBitString(hexString, 10));
-            subframeBitmaskUl.setSeqOf(collect);
-            rrmParameters.setSubframeBitmaskUl(subframeBitmaskUl);
-        }
-    }
-
-    /**
-     * Get PDCP Throughput.
-     * @return PdcpThroughput
-     */
-    @JsonProperty("PDCP-Throughput")
-    public PdcpThroughput getPdcpThroughput() {
-        return pdcpThroughput;
-    }
-
-    /**
-     * Set PDCP Throughput.
-     * @param pdcpThroughput PdcpThroughput
-     */
-    @JsonProperty("PDCP-Throughput")
-    public void setPdcpThroughput(PdcpThroughput pdcpThroughput) {
-        this.pdcpThroughput = pdcpThroughput;
-    }
-
-    /**
-     * Get PdcpPackDelay.
-     * @return PdcpPacketdelay
-     */
-    @JsonProperty("PDCP-Packet-Delay")
-    public PdcpPacketdelay getPdcpPackDelay() {
-        return pdcpPackDelay;
-    }
-
-    /**
-     * Set PdcpPackDelay.
-     * @param pdcpPackDelay PdcpPacketdelay
-     */
-    @JsonProperty("PDCP-Packet-Delay")
-    public void setPdcpPackDelay(PdcpPacketdelay pdcpPackDelay) {
-        this.pdcpPackDelay = pdcpPackDelay;
-    }
-
-    /**
-     * Get ResourceUsage.
-     * @return ResourceUsage
-     */
-    @JsonProperty("Resource-Usage")
-    public ResourceUsage getResourceUsage() {
-        return resourceUsage;
-    }
-
-    /**
-     * Set ResourceUsage.
-     * @param resourceUsage ResourceUsage
-     */
-    @JsonProperty("Resource-Usage")
-    public void setResourceUsage(ResourceUsage resourceUsage) {
-        this.resourceUsage = resourceUsage;
-    }
-
-    @Override
-    public String toString() {
-        return "RnibLink{" +
-                "linkId=" + linkId +
-                ", rrmParameters=" + rrmParameters +
-                ", trafficPercent=" + trafficPercent +
-                ", bearerParameters=" + bearerParameters +
-                ", quality=" + quality +
-                ", pdcpThroughput=" + pdcpThroughput +
-                ", pdcpPackDelay=" + pdcpPackDelay +
-                ", resourceUsage=" + resourceUsage +
-                ", type=" + type +
-                ", timer=" + timer +
-                '}';
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        RnibLink link = (RnibLink) o;
-
-        return linkId.equals(link.linkId);
-    }
-
-    @Override
-    public int hashCode() {
-        return linkId.hashCode();
-    }
-
-    /**
-     * Enum of Link-Type.
-     */
-    public enum Type {
-        SERVING_PRIMARY("serving/primary") {
-            @Override
-            public String toString() {
-                return "serving/primary";
-            }
-        },
-        SERVING_SECONDARY_CA("serving/secondary/ca") {
-            @Override
-            public String toString() {
-                return "serving/secondary/ca";
-            }
-        },
-        SERVING_SECONDARY_DC("serving/secondary/dc") {
-            @Override
-            public String toString() {
-                return "serving/secondary/dc";
-            }
-        },
-        NON_SERVING("non-serving") {
-            @Override
-            public String toString() {
-                return "non-serving";
-            }
-        };
-
-        private String name;
-
-        Type(String name) {
-            this.name = name;
-        }
-
-        /**
-         * Get enum value of link-type.
-         * @param name String representation of Enum Type
-         * @return Type
-         */
-        public static Type getEnum(String name) {
-            Optional<Type> any = Arrays.stream(Type.values()).filter(typeStr -> typeStr.name.equals(name)).findAny();
-            if (any.isPresent()) {
-                return any.get();
-            }
-            throw new IllegalArgumentException("No enum defined for string: " + name);
-        }
-    }
-
-    /**
-     * Quality of Link.
-     */
-    @JsonPropertyOrder({
-            "rx",
-            "cqi",
-            "mcs"
-    })
-    @JsonIgnoreProperties(ignoreUnknown = true)
-    public static class LinkQuality {
-        Rx rx = null;
-        Cqi cqi = null;
-        Mcs mcs = null;
-
-        /**
-         * Get rx.
-         * @return rx
-         */
-        public Rx getRx() {
-            return rx;
-        }
-
-        /**
-         * Set rx.
-         * @param rx rx
-         */
-        public void setRx(Rx rx) {
-            this.rx = rx;
-        }
-
-        /**
-         * Get cqi.
-         * @return cqi
-         */
-        public Cqi getCqi() {
-            return cqi;
-        }
-
-        /**
-         * Set cqi.
-         * @param cqi cqi
-         */
-        public void setCqi(Cqi cqi) {
-            this.cqi = cqi;
-        }
-
-        /**
-         * Get mcs.
-         * @return mcs
-         */
-        public Mcs getMcs() {
-            return mcs;
-        }
-
-        /**
-         * Set mcs.
-         * @param mcs mcs
-         */
-        public void setMcs(Mcs mcs) {
-            this.mcs = mcs;
-        }
-
-        /**
-         * Class to represent rx.
-         */
-        @JsonPropertyOrder({
-                "rsrp",
-                "rsrq",
-                "timesincelastupdate"
-        })
-        @JsonIgnoreProperties(ignoreUnknown = true)
-        public static class Rx {
-            double rsrp;
-            double rsrq;
-            WallClockTimestamp timesincelastupdate;
-
-            @JsonCreator
-            public Rx(@JsonProperty("rsrp") double rsrp, @JsonProperty("rsrq") double rsrq) {
-                this.rsrp = rsrp;
-                this.rsrq = rsrq;
-                this.timesincelastupdate = new WallClockTimestamp();
-            }
-
-            /**
-             * Get rsrp.
-             * @return double rsrp
-             */
-            public double getRsrp() {
-                return rsrp;
-            }
-
-            /**
-             * Set rsrp.
-             * @param rsrp rsrp
-             */
-            public void setRsrp(double rsrp) {
-                this.rsrp = rsrp;
-            }
-
-            /**
-             * Get rsrq.
-             * @return double rsrq
-             */
-            public double getRsrq() {
-                return rsrq;
-            }
-
-            /**
-             * Set rsrq.
-             * @param rsrq rsrq
-             */
-            public void setRsrq(double rsrq) {
-                this.rsrq = rsrq;
-            }
-
-            /**
-             * Get time since last update.
-             *
-             * @return long Time
-             */
-            public long getTimesincelastupdate() {
-                return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
-            }
-
-            /**
-             * Set time since last update.
-             *
-             * @param timesincelastupdate time since last update
-             */
-            public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
-                this.timesincelastupdate = timesincelastupdate;
-            }
-
-            @Override
-            public String toString() {
-                return "rx{" +
-                        "rsrp=" + rsrp +
-                        ", rsrq=" + rsrq +
-                        ", timesincelastupdate=" + (new WallClockTimestamp().unixTimestamp() -
-                        timesincelastupdate.unixTimestamp()) +
-                        '}';
-            }
-        }
-
-        @JsonPropertyOrder({
-                "hist",
-                "mode",
-                "mean",
-                "timesincelastupdate"
-        })
-        @JsonIgnoreProperties(ignoreUnknown = true)
-        public static class Cqi {
-            RadioRepPerServCell.CqiHist hist;
-            double mode;
-            double mean;
-            WallClockTimestamp timesincelastupdate;
-
-            @JsonCreator
-            public Cqi(@JsonProperty("hist") RadioRepPerServCell.CqiHist hist, @JsonProperty("mode") double mode,
-                       @JsonProperty("mean") double mean) {
-                this.hist = hist;
-                this.mode = mode;
-                this.mean = mean;
-                this.timesincelastupdate = new WallClockTimestamp();
-            }
-
-
-            /**
-             * Get CQIHist.
-             * @return CqiHist
-             */
-            public RadioRepPerServCell.CqiHist getHist() {
-                return hist;
-            }
-
-            /**
-             * Get CQIHist.
-             * @param hist CqiHist
-             */
-            public void setHist(RadioRepPerServCell.CqiHist hist) {
-                this.hist = hist;
-            }
-
-            /**
-             * Get mode.
-             * @return double mode
-             */
-            public double getMode() {
-                return mode;
-            }
-
-            /**
-             * Set mode.
-             * @param mode mode
-             */
-            public void setMode(double mode) {
-                this.mode = mode;
-            }
-
-            /**
-             * Get mean.
-             * @return double mean
-             */
-            public double getMean() {
-                return mean;
-            }
-
-            /**
-             * Set mean.
-             * @param mean mean
-             */
-            public void setMean(double mean) {
-                this.mean = mean;
-            }
-
-            /**
-             * Get time since last update.
-             *
-             * @return long Time
-             */
-            public long getTimesincelastupdate() {
-                return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
-            }
-
-            /**
-             * Set time since last update.
-             *
-             * @param timesincelastupdate time since last update
-             */
-            public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
-                this.timesincelastupdate = timesincelastupdate;
-            }
-
-            @Override
-            public String toString() {
-                return "cqi{" +
-                        "hist=" + hist +
-                        ", mode=" + mode +
-                        ", mean=" + mean +
-                        ", timesincelastupdate=" + (new WallClockTimestamp().unixTimestamp() -
-                        timesincelastupdate.unixTimestamp()) +
-                        '}';
-            }
-        }
-
-        @JsonPropertyOrder({
-                "dl",
-                "ul",
-                "timesincelastupdate"
-        })
-        @JsonIgnoreProperties(ignoreUnknown = true)
-        public static class Mcs {
-            SchedMeasRepPerServCell.McsDl dl;
-            SchedMeasRepPerServCell.McsUl ul;
-            WallClockTimestamp timesincelastupdate;
-
-            @JsonCreator
-            public Mcs(@JsonProperty("dl") SchedMeasRepPerServCell.McsDl dl,
-                       @JsonProperty("ul") SchedMeasRepPerServCell.McsUl ul) {
-                this.dl = dl;
-                this.ul = ul;
-                this.timesincelastupdate = new WallClockTimestamp();
-            }
-
-            /**
-             * Get DL.
-             * @return Dl
-             */
-            public SchedMeasRepPerServCell.McsDl getDl() {
-                return dl;
-            }
-
-            /**
-             * Set DL.
-             * @param dl DL
-             */
-            public void setDl(SchedMeasRepPerServCell.McsDl dl) {
-                this.dl = dl;
-            }
-
-            /**
-             * Get UL.
-             * @return Ul
-             */
-            public SchedMeasRepPerServCell.McsUl getUl() {
-                return ul;
-            }
-
-            /**
-             * Set UL.
-             * @param ul Ul
-             */
-            public void setUl(SchedMeasRepPerServCell.McsUl ul) {
-                this.ul = ul;
-            }
-
-            /**
-             * Get time since last update.
-             *
-             * @return long Time
-             */
-            public long getTimesincelastupdate() {
-                return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
-            }
-
-            /**
-             * Set time since last update.
-             *
-             * @param timesincelastupdate time since last update
-             */
-            public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
-                this.timesincelastupdate = timesincelastupdate;
-            }
-
-            @Override
-            public String toString() {
-                return "mcs{" +
-                        "dl=" + dl +
-                        ", ul=" + ul +
-                        ", timesincelastupdate=" + (new WallClockTimestamp().unixTimestamp() -
-                        timesincelastupdate.unixTimestamp()) +
-                        '}';
-            }
-        }
-
-    }
-
-    @JsonPropertyOrder({
-            "dl",
-            "ul"
-    })
-    @JsonIgnoreProperties(ignoreUnknown = true)
-    public static class PdcpThroughput {
-        WallClockTimestamp timesincelastupdate;
-        private PDCPMeasReportPerUe.ThroughputDl dl;
-        private PDCPMeasReportPerUe.ThroughputUl ul;
-
-        @JsonCreator
-        public PdcpThroughput(@JsonProperty("dl") PDCPMeasReportPerUe.ThroughputDl dl,
-                              @JsonProperty("ul") PDCPMeasReportPerUe.ThroughputUl ul) {
-            this.dl = dl;
-            this.ul = ul;
-            this.timesincelastupdate = new WallClockTimestamp();
-        }
-
-        /**
-         * Get DL.
-         * @return Dl
-         */
-        public PDCPMeasReportPerUe.ThroughputDl getDl() {
-            return dl;
-        }
-
-        /**
-         * Set DL.
-         * @param dl DL
-         */
-        public void setDl(PDCPMeasReportPerUe.ThroughputDl dl) {
-            this.dl = dl;
-        }
-
-        /**
-         * Get UL.
-         * @return Ul
-         */
-        public PDCPMeasReportPerUe.ThroughputUl getUl() {
-            return ul;
-        }
-
-        /**
-         * Set UL.
-         * @param ul Ul
-         */
-        public void setUl(PDCPMeasReportPerUe.ThroughputUl ul) {
-            this.ul = ul;
-        }
-
-        /**
-         * Get time since last update.
-         *
-         * @return long Time
-         */
-        public long getTimesincelastupdate() {
-            return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
-        }
-
-        /**
-         * Set time since last update.
-         *
-         * @param timesincelastupdate time since last update
-         */
-        public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
-            this.timesincelastupdate = timesincelastupdate;
-        }
-
-        @Override
-        public String
-        toString() {
-            return "PdcpThroughput{" +
-                    "dl=" + dl +
-                    ", ul=" + ul +
-                    ", timesincelastupdate=" + (new WallClockTimestamp().unixTimestamp() -
-                    timesincelastupdate.unixTimestamp()) +
-                    '}';
-        }
-    }
-
-    @JsonPropertyOrder({
-            "dl",
-            "ul"
-    })
-    @JsonIgnoreProperties(ignoreUnknown = true)
-    public static class PdcpPacketdelay {
-        PDCPMeasReportPerUe.PktDelayDl dl;
-        PDCPMeasReportPerUe.PktDelayUl ul;
-        WallClockTimestamp timesincelastupdate;
-
-        @JsonCreator
-        public PdcpPacketdelay(@JsonProperty("dl") PDCPMeasReportPerUe.PktDelayDl dl,
-                               @JsonProperty("ul") PDCPMeasReportPerUe.PktDelayUl ul) {
-            this.dl = dl;
-            this.ul = ul;
-            this.timesincelastupdate = new WallClockTimestamp();
-        }
-
-        /**
-         * Get DL.
-         * @return Dl
-         */
-        public PDCPMeasReportPerUe.PktDelayDl getDl() {
-            return dl;
-        }
-
-        /**
-         * Set DL.
-         * @param dl DL
-         */
-        public void setDl(PDCPMeasReportPerUe.PktDelayDl dl) {
-            this.dl = dl;
-        }
-
-        /**
-         * Get UL.
-         * @return Ul
-         */
-        public PDCPMeasReportPerUe.PktDelayUl getUl() {
-            return ul;
-        }
-
-        /**
-         * Set UL.
-         * @param ul Ul
-         */
-        public void setUl(PDCPMeasReportPerUe.PktDelayUl ul) {
-            this.ul = ul;
-        }
-
-        /**
-         * Get time since last update.
-         *
-         * @return long Time
-         */
-        public long getTimesincelastupdate() {
-            return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
-        }
-
-        /**
-         * Set time since last update.
-         *
-         * @param timesincelastupdate time since last update
-         */
-        public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
-            this.timesincelastupdate = timesincelastupdate;
-        }
-
-        @Override
-        public String toString() {
-            return "PdcpPacketdelay{" +
-                    "dl=" + dl +
-                    ", ul=" + ul +
-                    ", timesincelastupdate=" + (new WallClockTimestamp().unixTimestamp() -
-                    timesincelastupdate.unixTimestamp()) +
-                    '}';
-        }
-    }
-
-    @JsonPropertyOrder({
-            "dl",
-            "ul"
-    })
-    @JsonIgnoreProperties(ignoreUnknown = true)
-    public static class ResourceUsage {
-        PRBUsage.PrbUsageDl dl;
-        PRBUsage.PrbUsageUl ul;
-        WallClockTimestamp timesincelastupdate;
-
-        @JsonCreator
-        public ResourceUsage(@JsonProperty("dl") PRBUsage.PrbUsageDl dl,
-                             @JsonProperty("ul") PRBUsage.PrbUsageUl ul) {
-            this.dl = dl;
-            this.ul = ul;
-            this.timesincelastupdate = new WallClockTimestamp();
-        }
-
-        /**
-         * Get DL.
-         * @return Dl
-         */
-        public PRBUsage.PrbUsageDl getDl() {
-            return dl;
-        }
-
-        /**
-         * Set DL.
-         * @param dl DL
-         */
-        public void setDl(PRBUsage.PrbUsageDl dl) {
-            this.dl = dl;
-        }
-
-        /**
-         * Get UL.
-         * @return Ul
-         */
-        public PRBUsage.PrbUsageUl getUl() {
-            return ul;
-        }
-
-        /**
-         * Set UL.
-         * @param ul Ul
-         */
-        public void setUl(PRBUsage.PrbUsageUl ul) {
-            this.ul = ul;
-        }
-
-        /**
-         * Get time since last update.
-         *
-         * @return long Time
-         */
-        public long getTimesincelastupdate() {
-            return new WallClockTimestamp().unixTimestamp() - timesincelastupdate.unixTimestamp();
-        }
-
-        /**
-         * Set time since last update.
-         *
-         * @param timesincelastupdate time since last update
-         */
-        public void setTimesincelastupdate(WallClockTimestamp timesincelastupdate) {
-            this.timesincelastupdate = timesincelastupdate;
-        }
-
-        @Override
-        public String toString() {
-            return "ResourceUsage{" +
-                    "dl=" + dl +
-                    ", ul=" + ul +
-                    ", timesincelastupdate=" + (new WallClockTimestamp().unixTimestamp() -
-                    timesincelastupdate.unixTimestamp()) +
-                    '}';
-        }
-    }
-}
diff --git a/src/main/java/org.onosproject.xran/entities/RnibSlice.java b/src/main/java/org.onosproject.xran/entities/RnibSlice.java
deleted file mode 100644
index 33cea1b..0000000
--- a/src/main/java/org.onosproject.xran/entities/RnibSlice.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.entities;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Created by dimitris on 7/22/17.
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class RnibSlice {
-    private long sliceId;
-    private Set<RnibLink> links;
-    private Map<String, String> ran2epc;
-    private long validityPeriod;
-    private Object desiredKpis;
-    private Object deliveredKpis;
-    private Object rrmSonConfiguration;
-
-}
diff --git a/src/main/java/org.onosproject.xran/entities/RnibUe.java b/src/main/java/org.onosproject.xran/entities/RnibUe.java
deleted file mode 100644
index 2d6b605..0000000
--- a/src/main/java/org.onosproject.xran/entities/RnibUe.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.entities;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import org.onlab.packet.MacAddress;
-import org.onosproject.net.HostId;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ENBUES1APID;
-import org.onosproject.xran.codecs.api.MMEUES1APID;
-import org.onosproject.xran.codecs.pdu.RXSigMeasConfig;
-import org.onosproject.xran.codecs.pdu.UECapabilityInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Objects;
-import java.util.Timer;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static org.onosproject.net.HostId.hostId;
-
-/**
- * R-NIB UE and its properties.
- */
-@JsonPropertyOrder({
-        "ID",
-        "IMSI",
-        "ENBUES1APID",
-        "MMEUES1APID",
-        "CRNTI",
-        "State",
-        "Capability",
-        "MeasurementConfiguration"
-})
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class RnibUe {
-    @JsonIgnore
-    private static final String SCHEME = "xran";
-    @JsonIgnore
-    private static final Logger log =
-            LoggerFactory.getLogger(RnibUe.class);
-
-    @JsonProperty("ID")
-    private Long id;
-    @JsonProperty("IMSI")
-    private String imsi;
-    @JsonProperty("ENBUES1APID")
-    private ENBUES1APID enbS1apId;
-    @JsonProperty("MMEUES1APID")
-    private MMEUES1APID mmeS1apId;
-    @JsonProperty("CRNTI")
-    private CRNTI crnti;
-    @JsonProperty("State")
-    private State state;
-    @JsonProperty("Capability")
-    private UECapabilityInfo capability;
-    @JsonProperty("MeasurementConfiguration")
-    private RXSigMeasConfig measConfig;
-    @JsonIgnore
-    private Timer timer;
-
-    public RnibUe() {
-        state = State.ACTIVE;
-        timer = new Timer();
-    }
-
-    /**
-     * Convert Host ID to UE ID.
-     * @param hostId hostID
-     * @return Long UE ID
-     */
-    public static Long hostIdtoUEId(HostId hostId) {
-        String mac = hostId.mac().toString();
-        mac = mac.replace(":", "");
-        long l = Long.parseLong(mac, 16);
-        return l;
-    }
-
-    /**
-     * Get timer.
-     * @return Timer
-     */
-    @JsonIgnore
-    public Timer getTimer() {
-        return timer;
-    }
-
-    /**
-     * Set timer.
-     * @param timer Timer
-     */
-    @JsonIgnore
-    public void setTimer(Timer timer) {
-        this.timer.cancel();
-        this.timer.purge();
-        this.timer = timer;
-    }
-
-    /**
-     * Get MMEUES1APID.
-     * @return MMEUES1APID
-     */
-    @JsonProperty("MMEUES1APID")
-    public MMEUES1APID getMmeS1apId() {
-        return mmeS1apId;
-    }
-
-    /**
-     * Set MMEUES1APID.
-     * @param mmeS1apId MMEUES1APID
-     */
-    @JsonProperty("MMEUES1APID")
-    public void setMmeS1apId(MMEUES1APID mmeS1apId) {
-        this.mmeS1apId = mmeS1apId;
-    }
-
-    /**
-     * Get ENBUES1APID.
-     * @return ENBUES1APID
-     */
-    @JsonProperty("ENBUES1APID")
-    public ENBUES1APID getEnbS1apId() {
-        return enbS1apId;
-    }
-
-    /**
-     * Set ENBUES1APID.
-     * @param enbS1apId ENBUES1APID
-     */
-    @JsonProperty("ENBUES1APID")
-    public void setEnbS1apId(ENBUES1APID enbS1apId) {
-        this.enbS1apId = enbS1apId;
-    }
-
-    /**
-     * Get CRNTI.
-     * @return CRNTI
-     */
-    @JsonProperty("CRNTI")
-    public CRNTI getCrnti() {
-        return crnti;
-    }
-
-    /**
-     * Set CRNTI.
-     * @param crnti CRNTI
-     */
-    @JsonProperty("CRNTI")
-    public void setCrnti(CRNTI crnti) {
-        this.crnti = crnti;
-    }
-
-    /**
-     * Get IMSI.
-     * @return IMSI
-     */
-    @JsonProperty("IMSI")
-    public String getImsi() {
-        return imsi;
-    }
-
-    /**
-     * Set IMSI.
-     * @param imsi IMSI
-     */
-    @JsonProperty("IMSI")
-    public void setImsi(String imsi) {
-        this.imsi = imsi;
-    }
-
-    /**
-     * Get Host ID.
-     * @return HostId
-     */
-    @JsonIgnore
-    public HostId getHostId() {
-        try {
-            String text = Long.toHexString(this.id),
-                    res = "";
-            int charsLeft = 12 - text.length();
-            if (charsLeft > 0) {
-                res += Stream.generate(() -> "0").limit(charsLeft).collect(Collectors.joining(""));
-            } else if (charsLeft < 0) {
-                return null;
-            }
-            res += text;
-
-            String insert = ":";
-            int period = 2;
-
-            StringBuilder builder = new StringBuilder(
-                    res.length() + insert.length() * (res.length() / period) + 1);
-
-            int index = 0;
-            String prefix = "";
-            while (index < res.length()) {
-                // Don't putPrimaryLink the insert in the very first iteration.
-                // This is easier than appending it *after* each substring
-                builder.append(prefix);
-                prefix = insert;
-                builder.append(res.substring(index,
-                        Math.min(index + period, res.length())));
-                index += period;
-            }
-
-            return hostId(MacAddress.valueOf(builder.toString()));
-        } catch (Exception e) {
-            log.warn(e.getMessage());
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /**
-     * Get RXMeasConfig Report.
-     * @return RXSigMeasConfig
-     */
-    @JsonProperty("MeasurementConfiguration")
-    public RXSigMeasConfig getMeasConfig() {
-        return measConfig;
-    }
-
-    /**
-     * Set RXMeasConfig Report.
-     * @param measConfig RXSigMeasConfig
-     */
-    @JsonProperty("MeasurementConfiguration")
-    public void setMeasConfig(RXSigMeasConfig measConfig) {
-        this.measConfig = measConfig;
-    }
-
-    /**
-     * Get UE Capability Info.
-     * @return UECapabilityInfo
-     */
-    @JsonProperty("Capability")
-    public UECapabilityInfo getCapability() {
-        return capability;
-    }
-
-    /**
-     * Set UE Capability Info.
-     * @param capability UECapabilityInfo
-     */
-    @JsonProperty("Capability")
-    public void setCapability(UECapabilityInfo capability) {
-        this.capability = capability;
-    }
-
-    /**
-     * Get State.
-     * @return State
-     */
-    @JsonProperty("State")
-    public State getState() {
-        return state;
-    }
-
-    /**
-     * Set State.
-     * @param state State
-     */
-    @JsonProperty("State")
-    public void setState(State state) {
-        this.state = state;
-    }
-
-    /**
-     * Get UE ID.
-     * @return Long UE ID
-     */
-    public Long getId() {
-        return id;
-    }
-
-    /**
-     * Set UE ID.
-     * @param id Long UE ID
-     */
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    @Override
-    public String toString() {
-        return "RnibUe{" +
-                "id=" + id +
-                ", imsi='" + imsi + '\'' +
-                ", enbS1apId=" + enbS1apId +
-                ", mmeS1apId=" + mmeS1apId +
-                ", crnti=" + crnti +
-                ", state=" + state +
-                ", capability=" + capability +
-                ", measConfig=" + measConfig +
-                '}';
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Object#equals()
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        RnibUe rnibUe = (RnibUe) o;
-        return Objects.equals(id, rnibUe.id);
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return Objects.hash(id);
-    }
-
-
-    /**
-     * Enum of State of UE.
-     */
-    public enum State {
-        ACTIVE {
-            @Override
-            public String toString() {
-                return "ACTIVE";
-            }
-        },
-        IDLE {
-            @Override
-            public String toString() {
-                return "IDLE";
-            }
-        }
-    }
-}
diff --git a/src/main/java/org.onosproject.xran/entities/package-info.java b/src/main/java/org.onosproject.xran/entities/package-info.java
deleted file mode 100644
index be85174..0000000
--- a/src/main/java/org.onosproject.xran/entities/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Created by dimitris on 7/22/17.
- */
-package org.onosproject.xran.entities;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java b/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
deleted file mode 100644
index f7e2c07..0000000
--- a/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.impl;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.Lists;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.core.IdGenerator;
-import org.onosproject.store.AbstractStore;
-import org.onosproject.xran.XranStore;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.EUTRANCellIdentifier;
-import org.onosproject.xran.controller.XranController;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibLink;
-import org.onosproject.xran.entities.RnibSlice;
-import org.onosproject.xran.entities.RnibUe;
-import org.onosproject.xran.identifiers.LinkId;
-import org.slf4j.Logger;
-
-import javax.xml.bind.DatatypeConverter;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.stream.Collectors;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Default xran store.
- */
-@Component(immediate = true)
-@Service
-public class DefaultXranStore extends AbstractStore implements XranStore {
-    private static final String XRAN_APP_ID = "org.onosproject.xran";
-
-    private final Logger log = getLogger(getClass());
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-    private ConcurrentMap<LinkId, RnibLink> linkMap = new ConcurrentHashMap<>();
-    private ConcurrentMap<ECGI, RnibCell> cellMap = new ConcurrentHashMap<>();
-    private ConcurrentMap<Long, RnibUe> ueMap = new ConcurrentHashMap<>();
-    private ConcurrentMap<Object, RnibSlice> sliceMap = new ConcurrentHashMap<>();
-    private XranController controller;
-    private IdGenerator ueIdGenerator;
-
-    @Activate
-    public void activate() {
-        ApplicationId appId = coreService.getAppId(XRAN_APP_ID);
-
-        // create ue id generator
-        ueIdGenerator = coreService.getIdGenerator("xran-ue-id");
-
-        log.info("XRAN Default Store Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        linkMap.clear();
-        cellMap.clear();
-        ueMap.clear();
-        sliceMap.clear();
-        controller = null;
-        ueIdGenerator = null;
-        log.info("XRAN Default Store Stopped");
-    }
-
-    @Override
-    public List<RnibLink> getLinks() {
-        List<RnibLink> list = Lists.newArrayList();
-        list.addAll(linkMap.values());
-        return list;
-    }
-
-    @Override
-    public List<RnibLink> getlinksbyecgi(ECGI ecgi) {
-        List<RnibLink> list = Lists.newArrayList();
-        list.addAll(
-                linkMap.keySet()
-                        .stream()
-                        .filter(k -> k.getEcgi().equals(ecgi))
-                        .map(v -> linkMap.get(v))
-                        .collect(Collectors.toList()));
-        return list;
-    }
-
-    @Override
-    public List<RnibLink> getlinksbycellid(String eciHex) {
-        List<RnibLink> list = Lists.newArrayList();
-        EUTRANCellIdentifier eci = hexToEci(eciHex);
-
-        list.addAll(
-                linkMap.keySet()
-                        .stream()
-                        .filter(k -> k.getEcgi().getEUTRANcellIdentifier().equals(eci))
-                        .map(v -> linkMap.get(v))
-                        .collect(Collectors.toList()));
-
-        return list;
-    }
-
-    @Override
-    public List<RnibLink> getlinksbyueid(long euId) {
-        List<RnibLink> list = Lists.newArrayList();
-
-        list.addAll(
-                linkMap.keySet()
-                        .stream()
-                        .filter(k -> k.getUeId().equals(euId))
-                        .map(v -> linkMap.get(v))
-                        .collect(Collectors.toList()));
-
-        return list;
-    }
-
-
-    @Override
-    public RnibLink getlinkbetweencellidueid(String eciHex, long euId) {
-        EUTRANCellIdentifier eci = hexToEci(eciHex);
-
-        Optional<LinkId> first = linkMap.keySet()
-                .stream()
-                .filter(linkId -> linkId.getEcgi().getEUTRANcellIdentifier().equals(eci) &&
-                        linkId.getUeId().equals(euId))
-                .findFirst();
-
-        return first.map(linkId -> linkMap.get(linkId)).orElse(null);
-    }
-
-    @Override
-    public void storeLink(RnibLink link) {
-        synchronized (this) {
-            if (link.getLinkId() != null) {
-                // if we add a primary link then change the primary to non serving
-                if (link.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
-                    RnibUe ue = link.getLinkId().getUe();
-                    getlinksbyueid(ue.getId())
-                            .stream()
-                            .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
-                            .forEach(l -> l.setType(RnibLink.Type.NON_SERVING));
-                }
-                linkMap.put(link.getLinkId(), link);
-            }
-        }
-    }
-
-    @Override
-    public boolean removeLink(LinkId link) {
-        return linkMap.remove(link) != null;
-    }
-
-    @Override
-    public RnibLink getLink(ECGI ecgi, Long ueId) {
-        LinkId linkId = LinkId.valueOf(ecgi, ueId);
-        return linkMap.get(linkId);
-    }
-
-    @Override
-    public void modifylinkrrmconf(RnibLink link, JsonNode rrmConf) {
-        link.modifyRrmParameters(rrmConf);
-    }
-
-    @Override
-    public List<Object> getNodes() {
-        List<Object> list = Lists.newArrayList();
-        list.add(cellMap.values());
-        list.add(ueMap.values());
-        return list;
-    }
-
-    @Override
-    public List<Object> getcellnodes() {
-        List<Object> list = Lists.newArrayList();
-        list.addAll(cellMap.values());
-        return list;
-    }
-
-    @Override
-    public List<Object> getuenodes() {
-        List<Object> list = Lists.newArrayList();
-        list.addAll(ueMap.values());
-        return list;
-    }
-
-    @Override
-    public Object getbynodeid(String nodeId) {
-        try {
-            return getCell(nodeId);
-        } catch (Exception ignored) {
-        }
-        return getUe(Long.parseLong(nodeId));
-    }
-
-    @Override
-    public void storeCell(RnibCell cell) {
-        if (cell.getEcgi() != null) {
-            cellMap.putIfAbsent(cell.getEcgi(), cell);
-        }
-    }
-
-    @Override
-    public boolean removeCell(ECGI ecgi) {
-        return cellMap.remove(ecgi) != null;
-    }
-
-    @Override
-    public RnibCell getCell(String hexeci) {
-        EUTRANCellIdentifier eci = hexToEci(hexeci);
-        Optional<ECGI> first = cellMap.keySet()
-                .stream()
-                .filter(ecgi -> ecgi.getEUTRANcellIdentifier().equals(eci))
-                .findFirst();
-        return first.map(ecgi -> cellMap.get(ecgi))
-                .orElse(null);
-    }
-
-    @Override
-    public RnibCell getCell(ECGI ecgi) {
-        return cellMap.get(ecgi);
-    }
-
-    @Override
-    public void modifycellrrmconf(RnibCell cell, JsonNode rrmConf) throws Exception {
-        List<RnibLink> linkList = getlinksbyecgi(cell.getEcgi());
-        List<RnibUe> ueList = linkList.stream()
-                .map(link -> link.getLinkId().getUe())
-                .collect(Collectors.toList());
-
-        cell.modifyRrmConfig(rrmConf, ueList);
-    }
-
-    @Override
-    public RnibSlice getSlice(long sliceId) {
-        if (sliceMap.containsKey(sliceId)) {
-            return sliceMap.get(sliceId);
-        }
-        return null;
-    }
-
-    @Override
-    public boolean createSlice(ObjectNode attributes) {
-        return false;
-    }
-
-    @Override
-    public boolean removeCell(long sliceId) {
-        return sliceMap.remove(sliceId) != null;
-    }
-
-    @Override
-    public XranController getController() {
-        return controller;
-    }
-
-    @Override
-    public void setController(XranController controller) {
-        this.controller = controller;
-    }
-
-    @Override
-    public void storeUe(RnibUe ue) {
-        long newId = ueIdGenerator.getNewId();
-        ue.setId(newId);
-        ueMap.put(newId, ue);
-    }
-
-    @Override
-    public boolean removeUe(long ueId) {
-        return ueMap.remove(ueId) != null;
-    }
-
-    @Override
-    public RnibUe getUe(long ueId) {
-        return ueMap.get(ueId);
-    }
-
-    /**
-     * Get from HEX string the according ECI class object.
-     *
-     * @param eciHex HEX string
-     * @return ECI object if created successfully
-     */
-    private EUTRANCellIdentifier hexToEci(String eciHex) {
-        byte[] hexBinary = DatatypeConverter.parseHexBinary(eciHex);
-        return new EUTRANCellIdentifier(hexBinary, 28);
-    }
-}
diff --git a/src/main/java/org.onosproject.xran/impl/DistributedXranStore.java b/src/main/java/org.onosproject.xran/impl/DistributedXranStore.java
deleted file mode 100644
index 6f3a5dc..0000000
--- a/src/main/java/org.onosproject.xran/impl/DistributedXranStore.java
+++ /dev/null
@@ -1,311 +0,0 @@
-///*
-// * Copyright 2015-present Open Networking Foundation
-// *
-// * Licensed under the Apache License, Version 2.0 (the "License");
-// * you may not use this file except in compliance with the License.
-// * You may obtain a copy of the License at
-// *
-// *     http://www.apache.org/licenses/LICENSE-2.0
-// *
-// * Unless required by applicable law or agreed to in writing, software
-// * distributed under the License is distributed on an "AS IS" BASIS,
-// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// * See the License for the specific language governing permissions and
-// * limitations under the License.
-// */
-//
-//package org.onosproject.xran.impl;
-//
-//import com.fasterxml.jackson.databind.JsonNode;
-//import com.fasterxml.jackson.databind.node.ObjectNode;
-//import com.google.common.collect.Lists;
-//import org.apache.commons.lang3.tuple.ImmutablePair;
-//import org.apache.felix.scr.annotations.Activate;
-//import org.apache.felix.scr.annotations.Deactivate;
-//import org.apache.felix.scr.annotations.Reference;
-//import org.apache.felix.scr.annotations.ReferenceCardinality;
-//import org.onlab.util.KryoNamespace;
-//import org.onosproject.core.ApplicationId;
-//import org.onosproject.core.CoreService;
-//import org.onosproject.core.IdGenerator;
-//import org.onosproject.store.AbstractStore;
-//import org.onosproject.store.serializers.KryoNamespaces;
-//import org.onosproject.store.service.ConsistentMap;
-//import org.onosproject.store.service.Serializer;
-//import org.onosproject.store.service.StorageService;
-//import org.onosproject.store.service.Versioned;
-//import org.onosproject.xran.XranStore;
-//import org.onosproject.xran.codecs.api.ECGI;
-//import org.onosproject.xran.codecs.api.ENBUES1APID;
-//import org.onosproject.xran.codecs.api.MMEUES1APID;
-//import org.onosproject.xran.codecs.pdu.CellConfigReport;
-//import org.onosproject.xran.controller.XranController;
-//import org.onosproject.xran.entities.RnibCell;
-//import org.onosproject.xran.entities.RnibLink;
-//import org.onosproject.xran.entities.RnibSlice;
-//import org.onosproject.xran.entities.RnibUe;
-//import org.onosproject.xran.identifiers.CellId;
-//import org.onosproject.xran.identifiers.LinkId;
-//import org.onosproject.xran.identifiers.SliceId;
-//import org.onosproject.xran.identifiers.UeId;
-//import org.slf4j.Logger;
-//
-//import java.util.List;
-//
-//import static org.slf4j.LoggerFactory.getLogger;
-//
-///**
-// * Created by dimitris on 7/22/17.
-// */
-////@Component(immediate = true)
-////@Service
-//public class DistributedXranStore extends AbstractStore implements XranStore {
-//    private static final String XRAN_APP_ID = "org.onosproject.xran";
-//
-//    private final Logger log = getLogger(getClass());
-//
-//    private ConsistentMap<LinkId, RnibLink> linkMap;
-//    private ConsistentMap<CellId, RnibCell> cellMap;
-//    private ConsistentMap<UeId, RnibUe> ueMap;
-//    private ConsistentMap<SliceId, RnibSlice> sliceMap;
-//
-//    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-//    protected StorageService storageService;
-//
-//    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-//    protected CoreService coreService;
-//
-//    private IdGenerator cellIdGenerator;
-//    private IdGenerator ueIdGenerator;
-//    private IdGenerator linkIdGenerator;
-//    private IdGenerator sliceIdGenerator;
-//
-//    private XranController controller;
-//
-//    private final String XRAN_CELL_ID = "xran-cell-ids";
-//    private final String XRAN_UE_ID = "xran-eu-ids";
-//    private final String XRAN_LINK_ID = "xran-link-ids";
-//    private final String XRAN_SLICE_ID = "xran-slice-ids";
-//
-//    @Activate
-//    public void activate() {
-//        ApplicationId appId = coreService.getAppId(XRAN_APP_ID);
-//
-//        cellIdGenerator = coreService.getIdGenerator(XRAN_CELL_ID);
-//        ueIdGenerator = coreService.getIdGenerator(XRAN_UE_ID);
-//        linkIdGenerator = coreService.getIdGenerator(XRAN_LINK_ID);
-//        sliceIdGenerator = coreService.getIdGenerator(XRAN_SLICE_ID);
-//
-//        KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
-//                .register(KryoNamespaces.API)
-//                .register(RnibCell.class)
-//                .register(RnibSlice.class)
-//                .register(RnibUe.class)
-//                .register(RnibLink.class)
-//                .register(LinkId.class)
-//                .register(CellId.class)
-//                .register(UeId.class)
-//                .register(SliceId.class)
-//                .register(ImmutablePair.class)
-//                .register(ENBUES1APID.class)
-//                .register(MMEUES1APID.class)
-//                .register(CellConfigReport.class)
-//                .register(ECGI.class);
-//
-//        linkMap = storageService.<LinkId, RnibLink>consistentMapBuilder()
-//                .withSerializer(Serializer.using(serializer.build()))
-//                .withName("xran-link-map")
-//                .withApplicationId(appId)
-//                .withPurgeOnUninstall()
-//                .build();
-//
-//        cellMap = storageService.<CellId, RnibCell>consistentMapBuilder()
-//                .withSerializer(Serializer.using(serializer.build()))
-//                .withName("xran-cell-map")
-//                .withApplicationId(appId)
-//                .withPurgeOnUninstall()
-//                .build();
-//
-//        ueMap = storageService.<UeId, RnibUe>consistentMapBuilder()
-//                .withSerializer(Serializer.using(serializer.build()))
-//                .withName("xran-ue-map")
-//                .withApplicationId(appId)
-//                .withPurgeOnUninstall()
-//                .build();
-//
-//        sliceMap = storageService.<SliceId, RnibSlice>consistentMapBuilder()
-//                .withSerializer(Serializer.using(serializer.build()))
-//                .withName("xran-slice-map")
-//                .withApplicationId(appId)
-//                .withPurgeOnUninstall()
-//                .build();
-//
-//        log.info("XRAN Distributed Store Started");
-//    }
-//
-//    @Deactivate
-//    public void deactive() {
-//        log.info("XRAN Distributed Store Stopped");
-//    }
-//
-//    @Override
-//    public List<RnibLink> getlinksbycellid(long cellId) {
-//        List<RnibLink> list = Lists.newArrayList();
-//        CellId cell = CellId.valueOf(cellId);
-//        linkMap.keySet().forEach(
-//                pair -> {
-//                    if (pair.equals(cell)) {
-//                        list.add(linkMap.get(pair).value());
-//                    }
-//                }
-//        );
-//        return list;
-//    }
-//
-//    @Override
-//    public List<RnibLink> getlinksbyueid(long euId) {
-//        List<RnibLink> list = Lists.newArrayList();
-//        UeId ue = UeId.valueOf(euId);
-//        linkMap.keySet().forEach(
-//                pair -> {
-//                    if (pair.equals(ue)) {
-//                        list.add(linkMap.get(pair).value());
-//                    }
-//                }
-//        );
-//        return list;
-//    }
-//
-//    @Override
-//    public RnibLink getlinkbetweencellidueid(long cellId, long euId) {
-//        LinkId linkId = LinkId.valueOf(cellId, euId);
-//        final Versioned<RnibLink> rnibLinkVersioned = linkMap.get(linkId);
-//        if (rnibLinkVersioned != null) {
-//            return rnibLinkVersioned.value();
-//        }
-//        return null;
-//    }
-//
-//    @Override
-//    public boolean modifyTypeOfLink(long cellId, long euId, String type) {
-//        final RnibLink link = getlinkbetweencellidueid(cellId, euId);
-//        if (link != null) {
-//            link.setType(type);
-//            return true;
-//        }
-//        return false;
-//    }
-//
-//    @Override
-//    public boolean modifyTrafficPercentOfLink(long cellId, long euId, long trafficPercent) {
-//        final RnibLink link = getlinkbetweencellidueid(cellId, euId);
-//        if (link != null) {
-//            link.setTrafficPercent(trafficPercent);
-//            return true;
-//        }
-//        return false;
-//    }
-//
-//    @Override
-//    public boolean createLinkBetweenCellIdUeId(long cellId, long euId, String type) {
-//        LinkId linkId = LinkId.valueOf(cellId, euId);
-//        if (linkMap.containsKey(linkId)) {
-//            return false;
-//        }
-//        RnibLink link = new RnibLink(linkId);
-//        link.setType(type);
-//        linkMap.putPrimaryLink(linkId, link);
-//        return true;
-//    }
-//
-//    @Override
-//    public boolean deleteLink(long linkId) {
-//        return false;
-//    }
-//
-//    @Override
-//    public List<Object> getNodes() {
-//        List<Object> list = Lists.newArrayList();
-//        cellMap.values().forEach(v -> list.add(v.value()));
-//        ueMap.values().forEach(v -> list.add(v.value()));
-//        return list;
-//    }
-//
-//    @Override
-//    public List<RnibCell> getcellnodes() {
-//        List<RnibCell> list = Lists.newArrayList();
-//        cellMap.values().forEach(v -> list.add(v.value()));
-//        return list;
-//    }
-//
-//    @Override
-//    public List<RnibUe> getuenodes() {
-//        List<RnibUe> list = Lists.newArrayList();
-//        ueMap.values().forEach(v -> list.add(v.value()));
-//        return list;
-//    }
-//
-//    @Override
-//    public Object getbynodeid(long nodeId) {
-//        CellId cellId = CellId.valueOf(nodeId);
-//        if (cellMap.containsKey(cellId)) {
-//            return cellMap.get(cellId).value();
-//        }
-//        UeId ueId = UeId.valueOf(nodeId);
-//        if (ueMap.containsKey(ueId)) {
-//            return ueMap.get(ueId).value();
-//        }
-//        return null;
-//    }
-//
-//    @Override
-//    public void storeCell(RnibCell cell) {
-//        final CellId cellId = CellId.valueOf(cellIdGenerator.getNewId());
-//        cell.setCellId(cellId);
-//        cellMap.putIfAbsent(cellId, cell);
-//    }
-//
-//    @Override
-//    public RnibCell getCell(long cellId) {
-//        CellId cell = CellId.valueOf(cellId);
-//        if (cellMap.containsKey(cell)) {
-////            controller.sendMsg(cellMap.get(cell).value().getDevId(), "skata");
-//            return cellMap.get(cell).value();
-//        }
-//        return null;
-//    }
-//
-//    @Override
-//    public boolean modifycellrrmconf(JsonNode rrmConf) {
-//        return false;
-//    }
-//
-//    @Override
-//    public RnibSlice getSlice(long sliceId) {
-//        SliceId slice = SliceId.valueOf(sliceId);
-//        if (sliceMap.containsKey(slice)) {
-//            return sliceMap.get(slice).value();
-//        }
-//        return null;
-//    }
-//
-//    @Override
-//    public boolean createSlice(ObjectNode attributes) {
-//        return false;
-//    }
-//
-//    public XranController getController() {
-//        return controller;
-//    }
-//
-//    @Override
-//    public void storeUe(RnibUe ue) {
-//        final UeId ueId = UeId.valueOf(ueIdGenerator.getNewId());
-//        ue.setUeId(ueId);
-//        ueMap.putIfAbsent(ueId, ue);
-//    }
-//
-//    public void setController(XranController controller) {
-//        this.controller = controller;
-//    }
-//}
diff --git a/src/main/java/org.onosproject.xran/rest/CellWebResource.java b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
deleted file mode 100644
index 54accd3..0000000
--- a/src/main/java/org.onosproject.xran/rest/CellWebResource.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.xran.rest;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.commons.lang.exception.ExceptionUtils;
-import org.onosproject.rest.AbstractWebResource;
-import org.onosproject.xran.XranStore;
-import org.onosproject.xran.annotations.Patch;
-import org.onosproject.xran.controller.XranController;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.rest.ResponseHelper.StatusCode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Cell web resource.
- */
-@Path("cell")
-public class CellWebResource extends AbstractWebResource {
-
-    private static final Logger log =
-            LoggerFactory.getLogger(CellWebResource.class);
-
-    public CellWebResource() {
-    }
-
-    /**
-     * Lists the cell with {cellid}.
-     *
-     * @param eciHex EutranCellIdentifier in binary
-     * @return Response
-     */
-    @GET
-    @Path("{cellid}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getCell(@PathParam("cellid") String eciHex) {
-        RnibCell cell = get(XranStore.class).getCell(eciHex);
-
-        if (cell != null) {
-            try {
-                JsonNode jsonNode = mapper().valueToTree(cell);
-
-                return ResponseHelper.getResponse(
-                        mapper(),
-                        StatusCode.OK,
-                        jsonNode
-                );
-
-            } catch (Exception e) {
-                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
-                log.error(fullStackTrace);
-                e.printStackTrace();
-
-                return ResponseHelper.getResponse(
-                        mapper(),
-                        StatusCode.INTERNAL_SERVER_ERROR,
-                        "Exception",
-                        fullStackTrace
-                );
-            }
-        }
-
-        return ResponseHelper.getResponse(
-                mapper(),
-                StatusCode.NOT_FOUND,
-                "Not Found",
-                "Cell with " + eciHex + " was not found"
-        );
-    }
-
-    /**
-     * Modify the RRMConfig parameters of the cell.
-     *
-     * @param eciHex EutranCellIdentifier in binary
-     * @param stream Parameters that you want to modify
-     * @return Response
-     */
-    @Patch
-    @Path("{cellid}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response patchCell(@PathParam("cellid") String eciHex, InputStream stream) {
-        RnibCell cell = get(XranStore.class).getCell(eciHex);
-
-        if (cell != null) {
-            try {
-                ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
-
-                JsonNode rrmConf = jsonTree.path("RRMConf");
-                if (!rrmConf.isMissingNode()) {
-                    final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
-                    get(XranStore.class).modifycellrrmconf(cell, rrmConf);
-
-                    queue[0] = get(XranController.class).sendmodifiedrrmconf(cell.getRrmConfig(),
-                            cell.getVersion() <= 3);
-                    String poll = queue[0].poll(get(XranController.class)
-                            .getNorthboundTimeout(), TimeUnit.MILLISECONDS);
-
-                    if (poll != null) {
-                        return ResponseHelper.getResponse(
-                                mapper(),
-                                StatusCode.OK,
-                                "Handoff Response",
-                                poll
-                        );
-                    } else {
-                        return ResponseHelper.getResponse(
-                                mapper(),
-                                StatusCode.REQUEST_TIMEOUT,
-                                "Handoff Timeout",
-                                "eNodeB did not send a HOComplete/HOFailure on time"
-                        );
-                    }
-                }
-
-                return ResponseHelper.getResponse(
-                        mapper(),
-                        StatusCode.BAD_REQUEST,
-                        "Bad Request",
-                        "The command you specified is not implemented or doesn't exist. We support " +
-                                "RRMConf commands."
-                );
-            } catch (Exception e) {
-                String fullStackTrace = ExceptionUtils.getFullStackTrace(e);
-                log.error(fullStackTrace);
-                e.printStackTrace();
-
-                return ResponseHelper.getResponse(
-                        mapper(),
-                        StatusCode.INTERNAL_SERVER_ERROR,
-                        "Exception",
-                        fullStackTrace
-                );
-            }
-        }
-
-        return ResponseHelper.getResponse(
-                mapper(),
-                StatusCode.NOT_FOUND,
-                "Not Found",
-                "Cell " + eciHex + " was not found"
-        );
-    }
-
-}
diff --git a/src/main/java/org.onosproject.xran/wrapper/CellMap.java b/src/main/java/org.onosproject.xran/wrapper/CellMap.java
deleted file mode 100644
index 6685189..0000000
--- a/src/main/java/org.onosproject.xran/wrapper/CellMap.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.wrapper;
-
-import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
-import io.netty.channel.ChannelHandlerContext;
-import org.onosproject.xran.XranStore;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.PCIARFCN;
-import org.onosproject.xran.entities.RnibCell;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * CELL wrapper to help put/get/remove.
- */
-public class CellMap {
-    // map to get the context channel based on ecgi
-    private ConcurrentMap<ECGI, ChannelHandlerContext> ecgiCtx = new ConcurrentHashMap<>();
-
-    // pci-arfcn to ecgi bimap
-    private BiMap<PCIARFCN, ECGI> pciarfcnMap = HashBiMap.create();
-    private XranStore xranStore;
-
-    public CellMap(XranStore xranStore) {
-        this.xranStore = xranStore;
-    }
-
-    /**
-     * Put the PCI-ARFCN to ECGI map from new cell.
-     *
-     * @param value CELL entity
-     */
-    public void putPciArfcn(RnibCell value) {
-        PCIARFCN pciarfcn = PCIARFCN.valueOf(value.getConf().getPci(), value.getConf().getEarfcnDl());
-        pciarfcnMap.put(pciarfcn, value.getEcgi());
-    }
-
-    /**
-     * Put inside ECGI to CTX map.
-     *
-     * @param value CELL entity to get ECGI from
-     * @param ctx   context channel
-     */
-    public void put(RnibCell value, ChannelHandlerContext ctx) {
-        if (value.getEcgi() != null) {
-            ecgiCtx.put(value.getEcgi(), ctx);
-            xranStore.storeCell(value);
-        }
-    }
-
-    /**
-     * Get cell based on PCI-ARFCN.
-     *
-     * @param id PCI-ARFCN
-     * @return CELL entity if found
-     */
-    public RnibCell get(PCIARFCN id) {
-        ECGI ecgi;
-        ecgi = pciarfcnMap.get(id);
-
-        if (ecgi != null) {
-            return xranStore.getCell(ecgi);
-        }
-        return null;
-    }
-
-    /**
-     * Get cell based on ECGI.
-     *
-     * @param ecgi CELL ECGI
-     * @return CELL entity if found
-     */
-    public RnibCell get(ECGI ecgi) {
-        if (ecgi != null) {
-            return xranStore.getCell(ecgi);
-        }
-        return null;
-    }
-
-    /**
-     * Remove cell from three maps based on ECGI or PCI-ARFCN.
-     *
-     * @param key ecgECGIi or pci-arfcn of cell to remove
-     * @return true if remove succeeded
-     */
-    public boolean remove(Object key) {
-        ECGI ecgi = null;
-        if (key instanceof ECGI) {
-            ecgi = (ECGI) key;
-        } else if (key instanceof PCIARFCN) {
-            ecgi = pciarfcnMap.get(key);
-        }
-
-        if (ecgi != null) {
-            pciarfcnMap.inverse().remove(ecgi);
-            ecgiCtx.remove(ecgi);
-        }
-
-        return ecgi != null && xranStore.removeCell(ecgi);
-    }
-
-    /**
-     * Get context handler for specified ECGI.
-     *
-     * @param id CELL ECGI
-     * @return context handler if found
-     */
-    public ChannelHandlerContext getCtx(ECGI id) {
-        return ecgiCtx.get(id);
-    }
-
-}
diff --git a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
deleted file mode 100644
index 543879d..0000000
--- a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.wrapper;
-
-import org.onosproject.xran.XranStore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibLink;
-import org.onosproject.xran.entities.RnibUe;
-import org.slf4j.Logger;
-
-import java.util.List;
-import java.util.Optional;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * LINK wrapper to help put/get/remove.
- */
-public class LinkMap {
-    private static final Logger log = getLogger(LinkMap.class);
-
-    private final XranStore xranStore;
-
-    private UeMap ueMap;
-
-    public LinkMap(XranStore xranStore, UeMap ueMap) {
-        this.xranStore = xranStore;
-        this.ueMap = ueMap;
-    }
-
-    /**
-     * Put a new primary link between a CELL and a UE.
-     *
-     * @param cell CELL entity
-     * @param ue   UE entity
-     */
-    public void putPrimaryLink(RnibCell cell, RnibUe ue) {
-        RnibLink link = new RnibLink(cell, ue);
-        // set link to primary before storing
-        link.setType(RnibLink.Type.SERVING_PRIMARY);
-        xranStore.storeLink(link);
-
-        ueMap.putCrnti(cell, ue);
-    }
-
-    /**
-     * Put non-serving link based on CELL and CRNTI.
-     *
-     * @param cell  CELL entity
-     * @param crnti CRNTI
-     * @return new link after creation
-     */
-    public RnibLink putNonServingLink(RnibCell cell, CRNTI crnti) {
-        RnibLink link = null;
-        RnibUe ue = ueMap.get(cell.getEcgi(), crnti);
-
-        if (ue != null) {
-            link = new RnibLink(cell, ue);
-            xranStore.storeLink(link);
-        } else {
-            log.error("Could not find mapping for CRNTI to UE. Aborting creation of non-serving link");
-        }
-        return link;
-    }
-
-    /**
-     * Put non-serving link based on CELL and UE id.
-     *
-     * @param cell CELL entity
-     * @param ueId UE id
-     * @return new link after creation
-     */
-    public RnibLink putNonServingLink(RnibCell cell, Long ueId) {
-        RnibLink link = null;
-        RnibUe ue = ueMap.get(ueId);
-
-        if (ue != null) {
-            link = new RnibLink(cell, ue);
-            xranStore.storeLink(link);
-        } else {
-            log.error("Could not find mapping for CRNTI to UE. Aborting creation of non-serving link");
-        }
-        return link;
-    }
-
-    /**
-     * Get link based on ECGI and UE id.
-     *
-     * @param src CELL ECGI
-     * @param dst UE ID
-     * @return link if found
-     */
-    public RnibLink get(ECGI src, Long dst) {
-        if (src != null && dst != null) {
-            return xranStore.getLink(src, dst);
-        }
-        return null;
-    }
-
-    /**
-     * Get link based on ECGI and CRNTI.
-     *
-     * @param src CELL ECGI
-     * @param dst CELL unique CRNTI
-     * @return link if found
-     */
-    public RnibLink get(ECGI src, CRNTI dst) {
-        RnibUe ue = ueMap.get(src, dst);
-
-        if (ue != null) {
-            return xranStore.getLink(src, ue.getId());
-        }
-        return null;
-    }
-
-    /**
-     * Get CRNTI based on UE id.
-     *
-     * @param ueId UE id
-     * @return UE if found
-     */
-    public CRNTI getCrnti(Long ueId) {
-        return ueMap.getCrntUe().inverse().get(ueId).getValue();
-    }
-
-    /**
-     * Get primary CELL for specified UE.
-     *
-     * @param ue UE entity
-     * @return primary CELL if found
-     */
-    public RnibCell getPrimaryCell(RnibUe ue) {
-        List<RnibLink> linksByUeId = xranStore.getlinksbyueid(ue.getId());
-
-        // TODO: search for primary link from crntUe in UeMap because it has the primary links only!
-        // search all links for this UE and find PRIMARY.
-        Optional<RnibLink> primary = linksByUeId.stream()
-                .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
-                .findFirst();
-
-        if (primary.isPresent()) {
-            return primary.get().getLinkId().getCell();
-        }
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/wrapper/UeMap.java b/src/main/java/org.onosproject.xran/wrapper/UeMap.java
deleted file mode 100644
index 6ebab70..0000000
--- a/src/main/java/org.onosproject.xran/wrapper/UeMap.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.xran.wrapper;
-
-import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
-import org.onosproject.xran.XranStore;
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.entities.RnibCell;
-import org.onosproject.xran.entities.RnibUe;
-import org.onosproject.xran.identifiers.EcgiCrntiPair;
-
-/**
- * UE wrapper to help put/get/remove.
- */
-public class UeMap {
-    // ECGI, CRNTI pair of primary cell for specified UE.
-    private BiMap<EcgiCrntiPair, Long> crntUe = HashBiMap.create();
-
-    private XranStore xranStore;
-
-    public UeMap(XranStore xranStore) {
-        this.xranStore = xranStore;
-    }
-
-    /**
-     * Get the ECGI, CRNTI to UE bimap.
-     *
-     * @return BiMap of EcgiCrntiPair to Long
-     */
-    public BiMap<EcgiCrntiPair, Long> getCrntUe() {
-        return crntUe;
-    }
-
-    /**
-     * Put new ECGI, CRNTI pair of primary link to UE and remove old one.
-     *
-     * @param cell new primary CELL
-     * @param ue   UE
-     */
-    public void putCrnti(RnibCell cell, RnibUe ue) {
-        CRNTI crnti = ue.getCrnti();
-        ECGI ecgi = cell.getEcgi();
-
-        if (crnti != null && ecgi != null) {
-            // check if there is an ecgi, crnti pair for this UE id.
-            EcgiCrntiPair oldPair = crntUe.inverse().get(ue.getId()),
-                    newPair = EcgiCrntiPair.valueOf(cell.getEcgi(), ue.getCrnti());
-            if (oldPair == null) {
-                crntUe.put(newPair, ue.getId());
-            } else {
-                // remove old pair and add the new pair which corresponds to the primary cell.
-                crntUe.inverse().remove(ue.getId());
-                crntUe.put(newPair, ue.getId());
-            }
-        }
-    }
-
-    /**
-     * Put new UE to the store and update the ECGI, CRNTI pair.
-     *
-     * @param cell new primary CELL
-     * @param ue   UE
-     */
-    public void put(RnibCell cell, RnibUe ue) {
-        xranStore.storeUe(ue);
-        // after adding new primary cell update the bimap as well.
-        putCrnti(cell, ue);
-    }
-
-    /**
-     * Get UE based on ECGI and CRNTI.
-     *
-     * @param ecgi  CELL ECGI
-     * @param crnti CELL unique CRNTI
-     * @return UE entity if found
-     */
-    public RnibUe get(ECGI ecgi, CRNTI crnti) {
-        Long aLong = crntUe.get(EcgiCrntiPair.valueOf(ecgi, crnti));
-        if (aLong != null) {
-            return xranStore.getUe(aLong);
-        }
-        return null;
-    }
-
-    /**
-     * Get UE based on its id.
-     *
-     * @param ueId UE id
-     * @return UE entity if found
-     */
-    public RnibUe get(Long ueId) {
-        return xranStore.getUe(ueId);
-    }
-
-    /**
-     * Remove UE based on its id.
-     *
-     * @param ueId UE id
-     * @return true if remove succeeded
-     */
-    public boolean remove(Long ueId) {
-        crntUe.inverse().remove(ueId);
-        return xranStore.removeUe(ueId);
-    }
-}
diff --git a/src/main/java/org.onosproject.xran/wrapper/package-info.java b/src/main/java/org.onosproject.xran/wrapper/package-info.java
deleted file mode 100644
index 7718d8e..0000000
--- a/src/main/java/org.onosproject.xran/wrapper/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Created by dimitris on 7/20/17.
- */
-package org.onosproject.xran.wrapper;
\ No newline at end of file
