v5 initial commit
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