diff --git a/src/main/java/org.onosproject.xran/controller/Controller.java b/src/main/java/org.onosproject.xran/controller/Controller.java
index 2191f5b..946a1bd 100644
--- a/src/main/java/org.onosproject.xran/controller/Controller.java
+++ b/src/main/java/org.onosproject.xran/controller/Controller.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Laboratory
+ * 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.
@@ -42,6 +42,9 @@
     private int port = 8007;
     private boolean isRunning = false;
 
+    /**
+     * Run SCTP server.
+     */
     public void run() {
         final Controller ctrl = this;
         try {
@@ -62,6 +65,11 @@
         }
     }
 
+    /**
+     * Create bootstrap for server.
+     *
+     * @return server bootstrap
+     */
     private ServerBootstrap createServerBootStrap() {
         bossGroup = new NioEventLoopGroup(1);
         workerGroup = new NioEventLoopGroup();
@@ -73,6 +81,14 @@
         return b;
     }
 
+    /**
+     * Initialize controller and start SCTP server.
+     *
+     * @param deviceAgent device agent
+     * @param hostAgent   host agent
+     * @param packetAgent packet agent
+     * @param port        port of server
+     */
     public void start(XranDeviceAgent deviceAgent, XranHostAgent hostAgent, XranPacketProcessor packetAgent, int port) {
         if (isRunning && this.port != port) {
             stop();
@@ -91,7 +107,9 @@
         }
     }
 
-
+    /**
+     * Stop SCTP server.
+     */
     public void stop() {
         if (isRunning) {
             channel.channel().close();
diff --git a/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java b/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java
index 764f55c..d429602 100644
--- a/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java
+++ b/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
@@ -36,9 +36,8 @@
 import java.net.URISyntaxException;
 
 /**
- * Created by dimitris on 7/20/17.
+ * Xran channel handler.
  */
-
 @Sharable
 public class XranChannelHandler extends ChannelInboundHandlerAdapter {
 
@@ -51,6 +50,13 @@
         this.controller = controller;
     }
 
+    /**
+     * Given PDU construct an SCTP message.
+     *
+     * @param pdu PDU packet
+     * @return SCTP message
+     * @throws IOException IO exception
+     */
     public static SctpMessage getSctpMessage(XrancPdu pdu) throws IOException {
         BerByteArrayOutputStream os = new BerByteArrayOutputStream(4096);
 
@@ -90,13 +96,13 @@
         byte[] bytes = new byte[byteBuf.readableBytes()];
         byteBuf.readBytes(bytes);
 
-        XrancPdu recv_pdu = new XrancPdu();
+        XrancPdu recvPdu = new XrancPdu();
 
         InputStream inputStream = new ByteArrayInputStream(bytes);
 
-        recv_pdu.decode(inputStream);
+        recvPdu.decode(inputStream);
 
-        controller.packetAgent.handlePacket(recv_pdu, ctx);
+        controller.packetAgent.handlePacket(recvPdu, ctx);
     }
 
     @Override
diff --git a/src/main/java/org.onosproject.xran/controller/XranController.java b/src/main/java/org.onosproject.xran/controller/XranController.java
index 0ab91ef..b08c714 100644
--- a/src/main/java/org.onosproject.xran/controller/XranController.java
+++ b/src/main/java/org.onosproject.xran/controller/XranController.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Laboratory
+ * 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.
@@ -28,23 +28,73 @@
  */
 public interface XranController {
 
+    /**
+     * Send a HandOff request from one link to another.
+     *
+     * @param newLink target LINK entity
+     * @param oldLink source LINK entity
+     * @return blocking queue for RESPONSE
+     * @throws InterruptedException interrupted exception
+     */
     SynchronousQueue<String> sendHORequest(RnibLink newLink, RnibLink oldLink) throws InterruptedException;
 
+    /**
+     * Add a device listener for CELL connections.
+     *
+     * @param listener listener
+     */
     void addListener(XranDeviceListener listener);
 
+    /**
+     * Add a host listener for UE connections.
+     *
+     * @param listener listener
+     */
     void addListener(XranHostListener listener);
 
+    /**
+     * Remove a CELL device listener.
+     *
+     * @param listener listener
+     */
     void removeListener(XranDeviceListener listener);
 
+    /**
+     * Remove a UE host listener.
+     *
+     * @param listener listener
+     */
     void removeListener(XranHostListener listener);
 
-    SynchronousQueue<String> sendModifiedRRMConf(RRMConfig rrmConfig, boolean xICIC);
+    /**
+     * Send modified RRM configuration or xICICConfing.
+     *
+     * @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);
 
+    /**
+     * Send scell add packet for specified LINK.
+     *
+     * @param link LINK entity
+     * @return blocking queue for RESPONSE
+     */
     SynchronousQueue<String> sendScellAdd(RnibLink link);
 
+    /**
+     * Send scell delete for specified LINK.
+     *
+     * @param link LINK entity
+     * @return true if sent correctly
+     */
     boolean sendScellDelete(RnibLink link);
 
-    int getNorthbound_timeout();
-
-    void setNorthbound_timeout(int northbound_timeout);
+    /**
+     * Get northbound timeout.
+     *
+     * @return interval in milliseconds
+     */
+    int getNorthboundTimeout();
 }
diff --git a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
index 99e79a7..8040cea 100644
--- a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
+++ b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Laboratory
+ * 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.
@@ -20,10 +20,21 @@
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.sctp.SctpMessage;
 import org.apache.commons.lang.exception.ExceptionUtils;
-import org.apache.felix.scr.annotations.*;
+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.*;
+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;
@@ -32,15 +43,59 @@
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
 import org.onosproject.xran.XranStore;
-import org.onosproject.xran.codecs.api.*;
+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.*;
+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.identifiers.contextUpdateHandler;
 import org.onosproject.xran.impl.XranConfig;
 import org.onosproject.xran.providers.XranDeviceListener;
 import org.onosproject.xran.providers.XranHostListener;
@@ -51,8 +106,18 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-import java.util.*;
-import java.util.concurrent.*;
+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;
@@ -79,7 +144,7 @@
     private final Controller controller = new Controller();
     private XranConfig xranConfig;
     private ApplicationId appId;
-    private int northbound_timeout;
+    private int northboundTimeout;
     /* Services */
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private DeviceService deviceService;
@@ -106,11 +171,11 @@
     private UeMap ueMap;
     private LinkMap linkMap;
     /* MAPS */
-    private ConcurrentMap<String, ECGI> legitCells = new ConcurrentHashMap<>();
+    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<ECGI, SynchronousQueue<String>> rrmcellMap = new ConcurrentHashMap<>();
     private ConcurrentMap<CRNTI, SynchronousQueue<String>> scellAddMap = new ConcurrentHashMap<>();
-    private ConcurrentMap<EcgiCrntiPair, contextUpdateHandler> contextUpdateMap = new ConcurrentHashMap<>();
+    private ConcurrentMap<EcgiCrntiPair, ContextUpdateHandler> contextUpdateMap = new ConcurrentHashMap<>();
     /* QUEUE */
     private BlockingQueue<Long> ueIdQueue = new LinkedBlockingQueue<>();
     /* AGENTS */
@@ -120,8 +185,8 @@
     /* LISTENERS */
     private Set<XranDeviceListener> xranDeviceListeners = new CopyOnWriteArraySet<>();
     private Set<XranHostListener> xranHostListeners = new CopyOnWriteArraySet<>();
-    private InternalDeviceListener device_listener = new InternalDeviceListener();
-    private InternalHostListener host_listener = new InternalHostListener();
+    private InternalDeviceListener deviceListener = new InternalDeviceListener();
+    private InternalHostListener hostListener = new InternalHostListener();
 
     @Activate
     public void activate() {
@@ -129,8 +194,8 @@
 
         configService.addListener(configListener);
         registry.registerConfigFactory(xranConfigFactory);
-        deviceService.addListener(device_listener);
-        hostService.addListener(host_listener);
+        deviceService.addListener(deviceListener);
+        hostService.addListener(hostListener);
 
         cellMap = new CellMap(xranStore);
         ueMap = new UeMap(xranStore);
@@ -145,8 +210,8 @@
     public void deactivate() {
         controller.stop();
 
-        deviceService.removeListener(device_listener);
-        hostService.removeListener(host_listener);
+        deviceService.removeListener(deviceListener);
+        hostService.removeListener(hostListener);
 
         legitCells.clear();
 
@@ -157,29 +222,30 @@
     }
 
     @Override
-    public SynchronousQueue<String> sendHORequest(RnibLink link_t, RnibLink link_s) throws InterruptedException {
-        ECGI ecgi_t = link_t.getLinkId().getEcgi(),
-                ecgi_s = link_s.getLinkId().getEcgi();
+    public SynchronousQueue<String> sendHORequest(RnibLink linkT, RnibLink linkS) throws InterruptedException {
+        ECGI ecgiT = linkT.getLinkId().getEcgi(),
+                ecgiS = linkS.getLinkId().getEcgi();
 
-        CRNTI crnti = linkMap.getCrnti(link_t.getLinkId().getUeId());
-        ChannelHandlerContext ctx_t = cellMap.getCtx(ecgi_t),
-                ctx_s = cellMap.getCtx(ecgi_s);
-
+        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, ecgi_s, ecgi_t);
+            XrancPdu xrancPdu = HORequest.constructPacket(crnti, ecgiS, ecgiT);
 
-            hoMap.put(ecgi_s, queue);
+            // temporary map that has ECGI source of a handoff to a queue waiting for REST response.
+            hoMap.put(ecgiS, queue);
 
-            ctx_t.writeAndFlush(getSctpMessage(xrancPdu));
-            ctx_s.writeAndFlush(getSctpMessage(xrancPdu));
+            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();
         }
 
-        ueIdQueue.put(link_t.getLinkId().getUeId());
-
         return queue;
     }
 
@@ -204,23 +270,18 @@
     }
 
     @Override
-    public int getNorthbound_timeout() {
-        return northbound_timeout;
+    public int getNorthboundTimeout() {
+        return northboundTimeout;
     }
 
     @Override
-    public void setNorthbound_timeout(int northbound_timeout) {
-        this.northbound_timeout = northbound_timeout;
-    }
-
-    @Override
-    public SynchronousQueue<String> sendModifiedRRMConf(RRMConfig rrmConfig, boolean xICIC) {
+    public SynchronousQueue<String> sendmodifiedrrmconf(RRMConfig rrmConfig, boolean xicic) {
         ECGI ecgi = rrmConfig.getEcgi();
         ChannelHandlerContext ctx = cellMap.getCtx(ecgi);
         try {
             XrancPdu pdu;
 
-            if (xICIC) {
+            if (xicic) {
                 CellConfigReport cellConfigReport = cellMap.get(ecgi).getConf();
                 if (cellConfigReport != null) {
                     pdu = XICICConfig.constructPacket(rrmConfig, cellConfigReport);
@@ -230,7 +291,7 @@
                 pdu = RRMConfig.constructPacket(rrmConfig);
                 ctx.writeAndFlush(getSctpMessage(pdu));
                 SynchronousQueue<String> queue = new SynchronousQueue<>();
-                RRMCellMap.put(ecgi, queue);
+                rrmcellMap.put(ecgi, queue);
                 return queue;
             }
         } catch (IOException e) {
@@ -304,6 +365,11 @@
         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);
@@ -320,6 +386,11 @@
         }, 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);
@@ -328,12 +399,49 @@
             public void run() {
                 LinkId linkId = link.getLinkId();
                 xranStore.removeLink(linkId);
-                log.info("Link is removed after not receiving Meas Reports for {} ms", xranConfig.getNoMeasLinkRemoval());
+                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
@@ -361,14 +469,15 @@
                                                     e.printStackTrace();
                                                 }
                                             } else {
-                                                List<Object> ueNodes = xranStore.getUeNodes();
+                                                List<Object> ueNodes = xranStore.getuenodes();
                                                 ueNodes.forEach(object -> {
                                                     RnibUe ue = (RnibUe) object;
                                                     try {
-                                                        ECGI primary_ecgi = linkMap.getPrimaryCell(ue).getEcgi();
-                                                        ChannelHandlerContext ctx = cellMap.getCtx(primary_ecgi);
-                                                        RXSigMeasConfig.MeasCells measCells = new RXSigMeasConfig.MeasCells();
-                                                        xranStore.getCellNodes().forEach(cell -> {
+                                                        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();
@@ -378,7 +487,7 @@
                                                             }
                                                         });
                                                         XrancPdu xrancPdu = RXSigMeasConfig.constructPacket(
-                                                                primary_ecgi,
+                                                                primaryEcgi,
                                                                 ue.getCrnti(),
                                                                 measCells,
                                                                 xranConfig.getRxSignalInterval()
@@ -393,7 +502,8 @@
 
                                                 try {
                                                     ChannelHandlerContext ctx = cellMap.getCtx(ecgi);
-                                                    XrancPdu xrancPdu = L2MeasConfig.constructPacket(ecgi, xranConfig.getL2MeasInterval());
+                                                    XrancPdu xrancPdu = L2MeasConfig
+                                                            .constructPacket(ecgi, xranConfig.getL2MeasInterval());
                                                     cell.setMeasConfig(xrancPdu.getBody().getL2MeasConfig());
                                                     SctpMessage sctpMessage = getSctpMessage(xrancPdu);
                                                     ctx.writeAndFlush(sctpMessage);
@@ -423,6 +533,9 @@
         }
     }
 
+    /**
+     * Internal host listener.
+     */
     class InternalHostListener implements HostListener {
 
         @Override
@@ -433,8 +546,8 @@
                 case HOST_MOVED: {
                     RnibUe ue = ueMap.get(hostIdtoUEId(event.subject().id()));
                     if (ue != null) {
-                        ECGI ecgi_primary = linkMap.getPrimaryCell(ue).getEcgi();
-                        RnibCell primary = cellMap.get(ecgi_primary);
+                        ECGI ecgiPrimary = linkMap.getPrimaryCell(ue).getEcgi();
+                        RnibCell primary = cellMap.get(ecgiPrimary);
                         ue.setMeasConfig(null);
                         if (primary != null) {
                             Timer timer = new Timer();
@@ -463,30 +576,7 @@
                                     xranConfig.getConfigRequestInterval() * 1000
                             );
                             if (ue.getMeasConfig() == null) {
-                                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();
-                                }
+                                populateMeasConfig(primary, ue);
                             }
                         }
                     }
@@ -499,13 +589,16 @@
         }
     }
 
+    /**
+     * 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(host);
+            ECGI ecgi = legitCells.get(IpAddress.valueOf(host));
 
             if (ecgi == null) {
                 log.error("Device is not a legit source; ignoring...");
@@ -531,10 +624,10 @@
 
         @Override
         public boolean removeConnectedCell(String host) {
-            ECGI ecgi = legitCells.get(host);
-            List<RnibLink> linksByECGI = xranStore.getLinksByECGI(ecgi);
+            ECGI ecgi = legitCells.get(IpAddress.valueOf(host));
+            List<RnibLink> linksbyecgi = xranStore.getlinksbyecgi(ecgi);
 
-            linksByECGI.forEach(rnibLink -> xranStore.removeLink(rnibLink.getLinkId()));
+            linksbyecgi.forEach(rnibLink -> xranStore.removeLink(rnibLink.getLinkId()));
 
             if (cellMap.remove(ecgi)) {
                 for (XranDeviceListener l : xranDeviceListeners) {
@@ -546,6 +639,9 @@
         }
     }
 
+    /**
+     * Internal xran host agent.
+     */
     public class InternalXranHostAgent implements XranHostAgent {
 
         @Override
@@ -556,10 +652,11 @@
 
                 Set<ECGI> ecgiSet = Sets.newConcurrentHashSet();
 
-                ecgiSet.add(xranStore.getLinksByUeId(ue.getId())
+                xranStore.getlinksbyueid(ue.getId())
                         .stream()
                         .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
-                        .findFirst().get().getLinkId().getEcgi());
+                        .findFirst()
+                        .ifPresent(l -> ecgiSet.add(l.getLinkId().getEcgi()));
 
                 for (XranHostListener l : xranHostListeners) {
                     l.hostAdded(ue, ecgiSet);
@@ -581,7 +678,7 @@
 
         @Override
         public boolean removeConnectedHost(RnibUe ue) {
-            List<RnibLink> links = xranStore.getLinksByUeId(ue.getId());
+            List<RnibLink> links = xranStore.getlinksbyueid(ue.getId());
             links.forEach(rnibLink -> xranStore.removeLink(rnibLink.getLinkId()));
             if (ueMap.remove(ue.getId())) {
                 for (XranHostListener l : xranHostListeners) {
@@ -595,465 +692,656 @@
 
     public class InternalXranPacketAgent implements XranPacketProcessor {
         @Override
-        public void handlePacket(XrancPdu recv_pdu, ChannelHandlerContext ctx) throws IOException, InterruptedException {
-            XrancPdu send_pdu;
+        public void handlePacket(XrancPdu recvPdu, ChannelHandlerContext ctx)
+                throws IOException, InterruptedException {
+            XrancPdu sendPdu;
 
-            int apiID = recv_pdu.getHdr().getApiId().intValue();
-            log.debug("Received message: {}", recv_pdu);
+            int apiID = recvPdu.getHdr().getApiId().intValue();
+            log.debug("Received message: {}", recvPdu);
             switch (apiID) {
                 case 1: {
                     // Decode Cell config report.
-                    CellConfigReport report = recv_pdu.getBody().getCellConfigReport();
-
-                    ECGI ecgi = report.getEcgi();
-
-                    RnibCell cell = xranStore.getCell(ecgi);
-                    cell.setVersion(recv_pdu.getHdr().getVer().toString());
-                    cell.setConf(report);
-                    cellMap.putPciArfcn(cell);
+                    CellConfigReport report = recvPdu.getBody().getCellConfigReport();
+                    handleCellconfigreport(report, recvPdu.getHdr().getVer().toString());
                     break;
                 }
                 case 2: {
                     // Decode UE Admission Request.
-                    UEAdmissionRequest ueAdmissionRequest = recv_pdu.getBody().getUEAdmissionRequest();
-
-                    ECGI ecgi = ueAdmissionRequest.getEcgi();
-                    if (xranStore.getCell(ecgi) != null) {
-                        CRNTI crnti = ueAdmissionRequest.getCrnti();
-                        send_pdu = UEAdmissionResponse.constructPacket(ecgi, crnti, xranConfig.admissionFlag());
-                        ctx.writeAndFlush(getSctpMessage(send_pdu));
-                    } else {
-                        log.warn("Could not find ECGI in registered cells: {}", ecgi);
-                    }
+                    UEAdmissionRequest ueAdmissionRequest = recvPdu.getBody().getUEAdmissionRequest();
+                    handleUeadmissionrequest(ueAdmissionRequest, ctx);
                     break;
                 }
                 case 4: {
                     // Decode UE Admission Status.
-                    UEAdmissionStatus ueAdmissionStatus = recv_pdu.getBody().getUEAdmissionStatus();
-
-                    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)) {
-                                handleContextUpdate(v.getContextUpdate(), ctx, false);
-                            }
-                            return v;
-                        });
-                    }
+                    UEAdmissionStatus ueAdmissionStatus = recvPdu.getBody().getUEAdmissionStatus();
+                    handleAdmissionstatus(ueAdmissionStatus, ctx);
                     break;
                 }
                 case 5: {
                     // Decode UE Context Update.
-                    UEContextUpdate ueContextUpdate = recv_pdu.getBody().getUEContextUpdate();
-                    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();
-                            handleContextUpdate(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());
-                                }
-                            }
-                        }
-                        return v;
-                    });
+                    UEContextUpdate ueContextUpdate = recvPdu.getBody().getUEContextUpdate();
+                    handleUecontextupdate(ueContextUpdate, ctx);
 
                     break;
                 }
                 case 6: {
                     // Decode UE Reconfig_Ind.
-                    UEReconfigInd ueReconfigInd = recv_pdu.getBody().getUEReconfigInd();
-                    RnibUe ue = ueMap.get(ueReconfigInd.getEcgi(), ueReconfigInd.getCrntiOld());
-
-                    if (ue != null) {
-                        ue.setCrnti(ueReconfigInd.getCrntiNew());
-                    } else {
-                        log.warn("Could not find UE with this CRNTI: {}", ueReconfigInd.getCrntiOld());
-                    }
+                    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 = recv_pdu.getBody().getUEReleaseInd();
-                    RnibUe ue = ueMap.get(ueReleaseInd.getEcgi(), ueReleaseInd.getCrnti());
-                    if (ue != null) {
-                        ue.setState(RnibUe.State.IDLE);
-                        restartTimer(ue);
-                    }
+                    UEReleaseInd ueReleaseInd = recvPdu.getBody().getUEReleaseInd();
+                    handleUereleaseind(ueReleaseInd);
                     break;
                 }
                 case 8: {
                     // Decode Bearer Adm Request
-                    BearerAdmissionRequest bearerAdmissionRequest = recv_pdu.getBody().getBearerAdmissionRequest();
-
-                    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
-                    send_pdu = BearerAdmissionResponse.constructPacket(ecgi, crnti, erabParams, numErabs, xranConfig.bearerFlag());
-                    ctx.writeAndFlush(getSctpMessage(send_pdu));
+                    BearerAdmissionRequest bearerAdmissionRequest = recvPdu.getBody().getBearerAdmissionRequest();
+                    handleBeareradmissionrequest(bearerAdmissionRequest, ctx);
                     break;
                 }
                 case 10: {
                     //Decode Bearer Admission Status
-                    BearerAdmissionStatus bearerAdmissionStatus = recv_pdu.getBody().getBearerAdmissionStatus();
+                    BearerAdmissionStatus bearerAdmissionStatus = recvPdu.getBody().getBearerAdmissionStatus();
                     break;
-//                    ECGI ecgi = bearerAdmissionStatus.getEcgi();
-//                    CRNTI crnti = bearerAdmissionStatus.getCrnti();
-//
-//                    RnibLink link = linkMap.get(ecgi, crnti);
                 }
                 case 11: {
                     //Decode Bearer Release Ind
-                    BearerReleaseInd bearerReleaseInd = recv_pdu.getBody().getBearerReleaseInd();
-
-                    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));
+                    BearerReleaseInd bearerReleaseInd = recvPdu.getBody().getBearerReleaseInd();
+                    handleBearerreleaseind(bearerReleaseInd);
                     break;
                 }
                 case 13: {
-                    HOFailure hoFailure = recv_pdu.getBody().getHOFailure();
-
-                    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();
-                    }
+                    HOFailure hoFailure = recvPdu.getBody().getHOFailure();
+                    handleHofailure(hoFailure);
                     break;
 
                 }
                 case 14: {
-                    HOComplete hoComplete = recv_pdu.getBody().getHOComplete();
-
-                    EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair.valueOf(hoComplete.getEcgiT(), hoComplete.getCrntiNew());
-                    contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
-                        if (v == null) {
-                            v = new contextUpdateHandler();
-                        }
-                        if (v.setHoComplete(hoComplete)) {
-                            handleContextUpdate(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());
-                            }
-                        }
-                        return v;
-                    });
-
+                    HOComplete hoComplete = recvPdu.getBody().getHOComplete();
+                    handleHocomplete(hoComplete, ctx);
                     break;
                 }
 
                 case 16: {
-                    // Decode RX Sig Meas Report.
-                    RXSigMeasReport rxSigMeasReport = recv_pdu.getBody().getRXSigMeasReport();
-                    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());
-                                }
-                            });
-                        }
-                    }
+                    // Decode Rx Sig Meas Report.
+                    RXSigMeasReport rxSigMeasReport = recvPdu.getBody().getRXSigMeasReport();
+                    handleRxsigmeasreport(rxSigMeasReport);
                     break;
                 }
                 case 18: {
-                    RadioMeasReportPerUE radioMeasReportPerUE = recv_pdu.getBody().getRadioMeasReportPerUE();
-
-                    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());
-                            }
-                        });
-                    }
+                    RadioMeasReportPerUE radioMeasReportPerUE = recvPdu.getBody().getRadioMeasReportPerUE();
+                    handleRadionmeasreportperue(radioMeasReportPerUE);
                     break;
                 }
                 case 19: {
-                    RadioMeasReportPerCell radioMeasReportPerCell = recv_pdu.getBody().getRadioMeasReportPerCell();
+                    RadioMeasReportPerCell radioMeasReportPerCell = recvPdu.getBody().getRadioMeasReportPerCell();
                     break;
                 }
                 case 20: {
-                    SchedMeasReportPerUE schedMeasReportPerUE = recv_pdu.getBody().getSchedMeasReportPerUE();
-
-                    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());
-                            }
-                        });
-                    }
+                    SchedMeasReportPerUE schedMeasReportPerUE = recvPdu.getBody().getSchedMeasReportPerUE();
+                    handleSchedmeasreportperue(schedMeasReportPerUE);
                     break;
                 }
                 case 21: {
-                    SchedMeasReportPerCell schedMeasReportPerCell = recv_pdu.getBody().getSchedMeasReportPerCell();
-                    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());
-                    }
+                    SchedMeasReportPerCell schedMeasReportPerCell = recvPdu.getBody().getSchedMeasReportPerCell();
+                    handleSchedmeasreportpercell(schedMeasReportPerCell);
                     break;
                 }
                 case 22: {
-                    PDCPMeasReportPerUe pdcpMeasReportPerUe = recv_pdu.getBody().getPDCPMeasReportPerUe();
-
-                    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);
-                        }
-                    }
+                    PDCPMeasReportPerUe pdcpMeasReportPerUe = recvPdu.getBody().getPDCPMeasReportPerUe();
+                    handlePdcpmeasreportperue(pdcpMeasReportPerUe);
                     break;
                 }
                 case 24: {
                     // Decode UE Capability Info
-                    UECapabilityInfo capabilityInfo = recv_pdu.getBody().getUECapabilityInfo();
-
-                    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());
-                    }
+                    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 = recv_pdu.getBody().getUECapabilityEnquiry();
-                    XrancPdu xrancPdu = UECapabilityEnquiry.constructPacket(ueCapabilityEnquiry.getEcgi(), ueCapabilityEnquiry.getCrnti());
-                    ctx.writeAndFlush(getSctpMessage(xrancPdu));
+                    UECapabilityEnquiry ueCapabilityEnquiry = recvPdu.getBody().getUECapabilityEnquiry();
+                    handleUecapabilityenquiry(ueCapabilityEnquiry, ctx);
                     break;
                 }
                 case 27: {
                     //Decode ScellAddStatus
-                    ScellAddStatus scellAddStatus = recv_pdu.getBody().getScellAddStatus();
-                    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());
-                            if (scellAddStatus.getStatus().getBerEnum().get(0).value.intValue() == 0) {
-
-                                scellAddStatus.getScellsInd().getPCIARFCN().forEach(
-                                        pciarfcn -> {
-                                            RnibCell cell = cellMap.get(pciarfcn);
-                                            RnibLink link = linkMap.get(cell.getEcgi(), ueId);
-                                            link.setType(RnibLink.Type.SERVING_SECONDARY_CA);
-                                        }
-                                );
-                            } else {
-                                log.error("Scell addition failed.");
-                            }
-                        } catch (InterruptedException e) {
-                            log.error(ExceptionUtils.getFullStackTrace(e));
-                            e.printStackTrace();
-                        } finally {
-                            scellAddMap.remove(scellAddStatus.getCrnti());
-                        }
-                    }
+                    ScellAddStatus scellAddStatus = recvPdu.getBody().getScellAddStatus();
+                    handleScelladdstatus(scellAddStatus);
                     break;
                 }
-                // TODO: 28: ScellDelete
                 case 30: {
                     // Decode RRMConfig Status
-                    RRMConfigStatus rrmConfigStatus = recv_pdu.getBody().getRRMConfigStatus();
-                    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());
-                    }
+                    RRMConfigStatus rrmConfigStatus = recvPdu.getBody().getRRMConfigStatus();
+                    handleRrmconfigstatus(rrmConfigStatus);
                     break;
                 }
                 //TODO Case 31: SeNBAdd 32: SeNBAddStatus 33: SeNBDelete
                 case 34: {
-                    TrafficSplitConfig trafficSplitConfig = recv_pdu.getBody().getTrafficSplitConfig();
-
-                    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());
-                            }
-                        });
-                    }
+                    TrafficSplitConfig trafficSplitConfig = recvPdu.getBody().getTrafficSplitConfig();
+                    handleTrafficSplitConfig(trafficSplitConfig);
                     break;
                 }
                 default: {
-                    log.warn("Wrong API ID: {}", recv_pdu);
+                    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)) {
+                        handleContextUpdate(v.getContextUpdate(), ctx, false);
+                    }
+                    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();
+                    handleContextUpdate(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());
+                        }
+                    }
+                }
+                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)) {
+                    handleContextUpdate(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());
+                    }
+                }
+                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 handleContextUpdate(UEContextUpdate contextUpdate, ChannelHandlerContext ctx, boolean handoff) {
             RnibUe ue;
             RnibCell cell = xranStore.getCell(contextUpdate.getEcgi());
@@ -1078,6 +1366,9 @@
         }
     }
 
+    /**
+     * Internal class for NetworkConfigListener.
+     */
     class InternalNetworkConfigListener implements NetworkConfigListener {
 
         @Override
@@ -1100,6 +1391,11 @@
             }
         }
 
+        /**
+         * Handle config event.
+         *
+         * @param config
+         */
         private void handleConfigEvent(Optional<Config> config) {
             if (!config.isPresent()) {
                 return;
@@ -1107,7 +1403,7 @@
 
             xranConfig = (XranConfig) config.get();
 
-            northbound_timeout = xranConfig.getNorthBoundTimeout();
+            northboundTimeout = xranConfig.getNorthBoundTimeout();
 
             legitCells.putAll(xranConfig.activeCellSet());
 
diff --git a/src/main/java/org.onosproject.xran/controller/XranDeviceAgent.java b/src/main/java/org.onosproject.xran/controller/XranDeviceAgent.java
index b81a628..a322c47 100644
--- a/src/main/java/org.onosproject.xran/controller/XranDeviceAgent.java
+++ b/src/main/java/org.onosproject.xran/controller/XranDeviceAgent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Laboratory
+ * 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.
@@ -19,11 +19,24 @@
 import io.netty.channel.ChannelHandlerContext;
 
 /**
- * Created by dimitris on 7/27/17.
+ * Xran device agent interface.
  */
 public interface XranDeviceAgent {
 
+    /**
+     * Add connected CELL.
+     *
+     * @param host IP of host trying to connect
+     * @param ctx  channel of CELL speaking to
+     * @return true if succeeded
+     */
     boolean addConnectedCell(String host, ChannelHandlerContext ctx);
 
+    /**
+     * Remove disconnected CELL.
+     *
+     * @param host IP of host disconnected
+     * @return true if remove succeeded
+     */
     boolean removeConnectedCell(String host);
 }
diff --git a/src/main/java/org.onosproject.xran/controller/XranHostAgent.java b/src/main/java/org.onosproject.xran/controller/XranHostAgent.java
index 07ab26e..9c335da 100644
--- a/src/main/java/org.onosproject.xran/controller/XranHostAgent.java
+++ b/src/main/java/org.onosproject.xran/controller/XranHostAgent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Laboratory
+ * 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.
@@ -21,10 +21,25 @@
 import org.onosproject.xran.entities.RnibUe;
 
 /**
- * Created by dimitris on 7/28/17.
+ * Xran host agent interface.
  */
 public interface XranHostAgent {
+
+    /**
+     * Add connected host.
+     *
+     * @param ue   UE entity
+     * @param cell CELL entity
+     * @param ctx  channel of CELL
+     * @return true if succeeded
+     */
     boolean addConnectedHost(RnibUe ue, RnibCell cell, ChannelHandlerContext ctx);
 
+    /**
+     * Remove disconnected host.
+     *
+     * @param ue UE entity
+     * @return true if remove succeeded
+     */
     boolean removeConnectedHost(RnibUe ue);
 }
diff --git a/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java b/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java
index 73cb587..893b21d 100644
--- a/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java
+++ b/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-present Open Networking Laboratory
+ * 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.
@@ -17,11 +17,21 @@
 package org.onosproject.xran.controller;
 
 import io.netty.channel.ChannelHandlerContext;
-import org.onosproject.net.DeviceId;
 import org.onosproject.xran.codecs.pdu.XrancPdu;
 
 import java.io.IOException;
 
+/**
+ * Xran packet processor interface.
+ */
 public interface XranPacketProcessor {
+    /**
+     * Handle an incoming packet.
+     *
+     * @param pdu pdu of incoming packet
+     * @param ctx channel received the packet
+     * @throws IOException io exception
+     * @throws InterruptedException interrupted exception
+     */
     void handlePacket(XrancPdu pdu, ChannelHandlerContext ctx) throws IOException, InterruptedException;
 }
diff --git a/src/main/java/org.onosproject.xran/controller/package-info.java b/src/main/java/org.onosproject.xran/controller/package-info.java
index 7f4660f..866c396 100644
--- a/src/main/java/org.onosproject.xran/controller/package-info.java
+++ b/src/main/java/org.onosproject.xran/controller/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
