diff --git a/src/main/java/org.onosproject.xran/XranStore.java b/src/main/java/org.onosproject.xran/XranStore.java
index 00c4a81..349e8f5 100644
--- a/src/main/java/org.onosproject.xran/XranStore.java
+++ b/src/main/java/org.onosproject.xran/XranStore.java
@@ -51,6 +51,8 @@
 
     RnibLink getLink(ECGI ecgi, MMEUES1APID mme);
 
+    void modifyLinkRrmConf(RnibLink link, JsonNode rrmConf);
+
     void storeLink(RnibLink link);
 
     boolean removeLink(LinkId link);
@@ -71,7 +73,7 @@
 
     RnibCell getCell(ECGI cellId);
 
-    boolean modifyCellRrmConf(RnibCell cell, JsonNode rrmConf);
+    void modifyCellRrmConf(RnibCell cell, JsonNode rrmConf);
 
     void storeCell(RnibCell cell);
 
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionResponse.java b/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionResponse.java
index 8f6ad01..15c84e6 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionResponse.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/BearerAdmissionResponse.java
@@ -4,17 +4,17 @@
 
 package org.onosproject.xran.codecs.pdu;
 
+import org.onosproject.xran.codecs.api.*;
 import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
 import org.openmuc.jasn1.ber.BerLength;
 import org.openmuc.jasn1.ber.BerTag;
 import org.openmuc.jasn1.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 org.openmuc.jasn1.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 {
 
@@ -229,5 +229,48 @@
 		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/CellConfigRequest.java b/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigRequest.java
index 9aa3254..d2a8b69 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigRequest.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/CellConfigRequest.java
@@ -8,10 +8,12 @@
 import org.openmuc.jasn1.ber.BerLength;
 import org.openmuc.jasn1.ber.BerTag;
 import org.onosproject.xran.codecs.api.ECGI;
+import org.openmuc.jasn1.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 {
 
@@ -132,5 +134,26 @@
 		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/HORequest.java b/src/main/java/org.onosproject.xran/codecs/pdu/HORequest.java
index 7079944..f6a3076 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/HORequest.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/HORequest.java
@@ -9,10 +9,12 @@
 import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
 import org.openmuc.jasn1.ber.BerLength;
 import org.openmuc.jasn1.ber.BerTag;
+import org.openmuc.jasn1.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 {
 
@@ -196,5 +198,29 @@
 		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
index a474ec3..f0de6d1 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/L2MeasConfig.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/L2MeasConfig.java
@@ -9,10 +9,12 @@
 import org.openmuc.jasn1.ber.BerLength;
 import org.openmuc.jasn1.ber.BerTag;
 import org.openmuc.jasn1.ber.types.BerInteger;
+import org.openmuc.jasn1.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 {
 
@@ -164,5 +166,35 @@
 		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/RRMConfig.java b/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java
index e7ff333..4c9bae7 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/RRMConfig.java
@@ -7,7 +7,6 @@
 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.entities.RnibCell;
 import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
 import org.openmuc.jasn1.ber.BerLength;
 import org.openmuc.jasn1.ber.BerTag;
@@ -1347,6 +1346,14 @@
         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 {
@@ -1474,6 +1481,14 @@
         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 {
@@ -1600,18 +1615,18 @@
 
     }
 
-    public static XrancPdu constructPacket(RnibCell cell) {
+    public static XrancPdu constructPacket(RRMConfig config) {
         XrancPduBody body = new XrancPduBody();
-        body.setRRMConfig(cell.getRrmConfig());
+        body.setRRMConfig(config);
 
         BerUTF8String ver = null;
         try {
-            ver = new BerUTF8String("4");
+            ver = new BerUTF8String("3");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
 
-        XrancApiID apiID = new XrancApiID(26);
+        XrancApiID apiID = new XrancApiID(29);
         XrancPduHdr hdr = new XrancPduHdr();
         hdr.setVer(ver);
         hdr.setApiId(apiID);
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasConfig.java b/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasConfig.java
index c6704ce..f8b5403 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasConfig.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/RXSigMeasConfig.java
@@ -8,10 +8,12 @@
 import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
 import org.openmuc.jasn1.ber.BerLength;
 import org.openmuc.jasn1.ber.BerTag;
+import org.openmuc.jasn1.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;
@@ -389,5 +391,37 @@
 		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/UEAdmissionResponse.java b/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionResponse.java
index db6ed32..5d323b7 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionResponse.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/UEAdmissionResponse.java
@@ -10,10 +10,12 @@
 import org.onosproject.xran.codecs.api.AdmEstResponse;
 import org.onosproject.xran.codecs.api.CRNTI;
 import org.onosproject.xran.codecs.api.ECGI;
+import org.openmuc.jasn1.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 {
 
@@ -196,5 +198,33 @@
 		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/UECapabilityEnquiry.java b/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityEnquiry.java
index 84758d1..db212e5 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityEnquiry.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/UECapabilityEnquiry.java
@@ -9,10 +9,12 @@
 import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
 import org.openmuc.jasn1.ber.BerLength;
 import org.openmuc.jasn1.ber.BerTag;
+import org.openmuc.jasn1.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 {
@@ -165,5 +167,31 @@
 		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/UEAttachComplete.java b/src/main/java/org.onosproject.xran/codecs/pdu/UEContextUpdate.java
similarity index 97%
rename from src/main/java/org.onosproject.xran/codecs/pdu/UEAttachComplete.java
rename to src/main/java/org.onosproject.xran/codecs/pdu/UEContextUpdate.java
index 74050d7..d9d6066 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/UEAttachComplete.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/UEContextUpdate.java
@@ -16,7 +16,7 @@
 import java.io.InputStream;
 import java.io.Serializable;
 
-public class UEAttachComplete implements Serializable {
+public class UEContextUpdate implements Serializable {
 
 	private static final long serialVersionUID = 1L;
 
@@ -28,10 +28,10 @@
 	private MMEUES1APID mMEUES1APID = null;
 	private ENBUES1APID eNBUES1APID = null;
 	
-	public UEAttachComplete() {
+	public UEContextUpdate() {
 	}
 
-	public UEAttachComplete(byte[] code) {
+	public UEContextUpdate(byte[] code) {
 		this.code = code;
 	}
 
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java b/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java
index f02d36a..6efe465 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java
@@ -12,9 +12,12 @@
 import org.openmuc.jasn1.ber.BerTag;
 import org.openmuc.jasn1.ber.types.BerBitString;
 import org.openmuc.jasn1.ber.types.BerInteger;
+import org.openmuc.jasn1.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 {
 
@@ -446,5 +449,26 @@
 		sb.append("}");
 	}
 
+	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(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/XrancPduBody.java b/src/main/java/org.onosproject.xran/codecs/pdu/XrancPduBody.java
index c0a38fc..2770211 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/XrancPduBody.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/XrancPduBody.java
@@ -20,16 +20,14 @@
 	private CellConfigReport cellConfigReport = null;
 	private UEAdmissionRequest uEAdmissionRequest = null;
 	private UEAdmissionResponse uEAdmissionResponse = null;
-	private UEAttachComplete uEAttachComplete = null;
 	private UEAdmissionStatus uEAdmissionStatus = null;
+	private UEContextUpdate uEContextUpdate = null;
 	private UEReconfigInd uEReconfigInd = null;
 	private UEReleaseInd uEReleaseInd = null;
 	private BearerAdmissionRequest bearerAdmissionRequest = null;
 	private BearerAdmissionResponse bearerAdmissionResponse = null;
 	private BearerAdmissionStatus bearerAdmissionStatus = null;
 	private BearerReleaseInd bearerReleaseInd = null;
-	private UECapabilityEnquiry uECapabilityEnquiry = null;
-	private UECapabilityInfo uECapabilityInfo = null;
 	private HORequest hORequest = null;
 	private HOFailure hOFailure = null;
 	private HOComplete hOComplete = null;
@@ -42,16 +40,18 @@
 	private SchedMeasReportPerCell schedMeasReportPerCell = null;
 	private PDCPMeasReportPerUe pDCPMeasReportPerUe = null;
 	private XICICConfig xICICConfig = null;
-	private RRMConfig rRMConfig = null;
-	private RRMConfigStatus rRMConfigStatus = null;
+	private UECapabilityInfo uECapabilityInfo = null;
+	private UECapabilityEnquiry uECapabilityEnquiry = null;
 	private ScellAdd scellAdd = null;
 	private ScellAddStatus scellAddStatus = null;
 	private ScellDelete scellDelete = null;
+	private RRMConfig rRMConfig = null;
+	private RRMConfigStatus rRMConfigStatus = null;
 	private SeNBAdd seNBAdd = null;
 	private SeNBAddStatus seNBAddStatus = null;
 	private SeNBDelete seNBDelete = null;
 	private TrafficSplitConfig trafficSplitConfig = null;
-	
+
 	public XrancPduBody() {
 	}
 
@@ -91,14 +91,6 @@
 		return uEAdmissionResponse;
 	}
 
-	public void setUEAttachComplete(UEAttachComplete uEAttachComplete) {
-		this.uEAttachComplete = uEAttachComplete;
-	}
-
-	public UEAttachComplete getUEAttachComplete() {
-		return uEAttachComplete;
-	}
-
 	public void setUEAdmissionStatus(UEAdmissionStatus uEAdmissionStatus) {
 		this.uEAdmissionStatus = uEAdmissionStatus;
 	}
@@ -107,6 +99,14 @@
 		return uEAdmissionStatus;
 	}
 
+	public void setUEContextUpdate(UEContextUpdate uEContextUpdate) {
+		this.uEContextUpdate = uEContextUpdate;
+	}
+
+	public UEContextUpdate getUEContextUpdate() {
+		return uEContextUpdate;
+	}
+
 	public void setUEReconfigInd(UEReconfigInd uEReconfigInd) {
 		this.uEReconfigInd = uEReconfigInd;
 	}
@@ -155,22 +155,6 @@
 		return bearerReleaseInd;
 	}
 
-	public void setUECapabilityEnquiry(UECapabilityEnquiry uECapabilityEnquiry) {
-		this.uECapabilityEnquiry = uECapabilityEnquiry;
-	}
-
-	public UECapabilityEnquiry getUECapabilityEnquiry() {
-		return uECapabilityEnquiry;
-	}
-
-	public void setUECapabilityInfo(UECapabilityInfo uECapabilityInfo) {
-		this.uECapabilityInfo = uECapabilityInfo;
-	}
-
-	public UECapabilityInfo getUECapabilityInfo() {
-		return uECapabilityInfo;
-	}
-
 	public void setHORequest(HORequest hORequest) {
 		this.hORequest = hORequest;
 	}
@@ -267,20 +251,20 @@
 		return xICICConfig;
 	}
 
-	public void setRRMConfig(RRMConfig rRMConfig) {
-		this.rRMConfig = rRMConfig;
+	public void setUECapabilityInfo(UECapabilityInfo uECapabilityInfo) {
+		this.uECapabilityInfo = uECapabilityInfo;
 	}
 
-	public RRMConfig getRRMConfig() {
-		return rRMConfig;
+	public UECapabilityInfo getUECapabilityInfo() {
+		return uECapabilityInfo;
 	}
 
-	public void setRRMConfigStatus(RRMConfigStatus rRMConfigStatus) {
-		this.rRMConfigStatus = rRMConfigStatus;
+	public void setUECapabilityEnquiry(UECapabilityEnquiry uECapabilityEnquiry) {
+		this.uECapabilityEnquiry = uECapabilityEnquiry;
 	}
 
-	public RRMConfigStatus getRRMConfigStatus() {
-		return rRMConfigStatus;
+	public UECapabilityEnquiry getUECapabilityEnquiry() {
+		return uECapabilityEnquiry;
 	}
 
 	public void setScellAdd(ScellAdd scellAdd) {
@@ -307,6 +291,22 @@
 		return scellDelete;
 	}
 
+	public void setRRMConfig(RRMConfig rRMConfig) {
+		this.rRMConfig = rRMConfig;
+	}
+
+	public RRMConfig getRRMConfig() {
+		return rRMConfig;
+	}
+
+	public void setRRMConfigStatus(RRMConfigStatus rRMConfigStatus) {
+		this.rRMConfigStatus = rRMConfigStatus;
+	}
+
+	public RRMConfigStatus getRRMConfigStatus() {
+		return rRMConfigStatus;
+	}
+
 	public void setSeNBAdd(SeNBAdd seNBAdd) {
 		this.seNBAdd = seNBAdd;
 	}
@@ -357,7 +357,7 @@
 			codeLength += 2;
 			return codeLength;
 		}
-		
+
 		if (seNBDelete != null) {
 			codeLength += seNBDelete.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 33
@@ -366,7 +366,7 @@
 			codeLength += 2;
 			return codeLength;
 		}
-		
+
 		if (seNBAddStatus != null) {
 			codeLength += seNBAddStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 32
@@ -375,7 +375,7 @@
 			codeLength += 2;
 			return codeLength;
 		}
-		
+
 		if (seNBAdd != null) {
 			codeLength += seNBAdd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 31
@@ -384,159 +384,159 @@
 			codeLength += 2;
 			return codeLength;
 		}
-		
-		if (scellDelete != null) {
-			codeLength += scellDelete.encode(os, false);
+
+		if (rRMConfigStatus != null) {
+			codeLength += rRMConfigStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 30
 			os.write(0xBE);
 			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, 29
 			os.write(0xBD);
 			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, 28
 			os.write(0xBC);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (rRMConfigStatus != null) {
-			codeLength += rRMConfigStatus.encode(os, false);
+
+		if (scellAddStatus != null) {
+			codeLength += scellAddStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 27
 			os.write(0xBB);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (rRMConfig != null) {
-			codeLength += rRMConfig.encode(os, false);
+
+		if (scellAdd != null) {
+			codeLength += scellAdd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 26
 			os.write(0xBA);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (xICICConfig != null) {
-			codeLength += xICICConfig.encode(os, false);
+
+		if (uECapabilityEnquiry != null) {
+			codeLength += uECapabilityEnquiry.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 25
 			os.write(0xB9);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (pDCPMeasReportPerUe != null) {
-			codeLength += pDCPMeasReportPerUe.encode(os, false);
+
+		if (uECapabilityInfo != null) {
+			codeLength += uECapabilityInfo.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 24
 			os.write(0xB8);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (schedMeasReportPerCell != null) {
-			codeLength += schedMeasReportPerCell.encode(os, false);
+
+		if (xICICConfig != null) {
+			codeLength += xICICConfig.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 23
 			os.write(0xB7);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (schedMeasReportPerUE != null) {
-			codeLength += schedMeasReportPerUE.encode(os, false);
+
+		if (pDCPMeasReportPerUe != null) {
+			codeLength += pDCPMeasReportPerUe.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 22
 			os.write(0xB6);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (radioMeasReportPerCell != null) {
-			codeLength += radioMeasReportPerCell.encode(os, false);
+
+		if (schedMeasReportPerCell != null) {
+			codeLength += schedMeasReportPerCell.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 21
 			os.write(0xB5);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (radioMeasReportPerUE != null) {
-			codeLength += radioMeasReportPerUE.encode(os, false);
+
+		if (schedMeasReportPerUE != null) {
+			codeLength += schedMeasReportPerUE.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 20
 			os.write(0xB4);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (l2MeasConfig != null) {
-			codeLength += l2MeasConfig.encode(os, false);
+
+		if (radioMeasReportPerCell != null) {
+			codeLength += radioMeasReportPerCell.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 19
 			os.write(0xB3);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (rXSigMeasReport != null) {
-			codeLength += rXSigMeasReport.encode(os, false);
+
+		if (radioMeasReportPerUE != null) {
+			codeLength += radioMeasReportPerUE.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 18
 			os.write(0xB2);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (rXSigMeasConfig != null) {
-			codeLength += rXSigMeasConfig.encode(os, false);
+
+		if (l2MeasConfig != null) {
+			codeLength += l2MeasConfig.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 17
 			os.write(0xB1);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (hOComplete != null) {
-			codeLength += hOComplete.encode(os, false);
+
+		if (rXSigMeasReport != null) {
+			codeLength += rXSigMeasReport.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 16
 			os.write(0xB0);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (hOFailure != null) {
-			codeLength += hOFailure.encode(os, false);
+
+		if (rXSigMeasConfig != null) {
+			codeLength += rXSigMeasConfig.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 15
 			os.write(0xAF);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (hORequest != null) {
-			codeLength += hORequest.encode(os, false);
+
+		if (hOComplete != null) {
+			codeLength += hOComplete.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 14
 			os.write(0xAE);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (uECapabilityInfo != null) {
-			codeLength += uECapabilityInfo.encode(os, false);
+
+		if (hOFailure != null) {
+			codeLength += hOFailure.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 13
 			os.write(0xAD);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (uECapabilityEnquiry != null) {
-			codeLength += uECapabilityEnquiry.encode(os, false);
+
+		if (hORequest != null) {
+			codeLength += hORequest.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 12
 			os.write(0xAC);
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (bearerReleaseInd != null) {
 			codeLength += bearerReleaseInd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 11
@@ -544,7 +544,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (bearerAdmissionStatus != null) {
 			codeLength += bearerAdmissionStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 10
@@ -552,7 +552,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (bearerAdmissionResponse != null) {
 			codeLength += bearerAdmissionResponse.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 9
@@ -560,7 +560,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (bearerAdmissionRequest != null) {
 			codeLength += bearerAdmissionRequest.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 8
@@ -568,7 +568,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (uEReleaseInd != null) {
 			codeLength += uEReleaseInd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 7
@@ -576,7 +576,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (uEReconfigInd != null) {
 			codeLength += uEReconfigInd.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 6
@@ -584,23 +584,23 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (uEAdmissionStatus != null) {
-			codeLength += uEAdmissionStatus.encode(os, false);
+
+		if (uEContextUpdate != null) {
+			codeLength += uEContextUpdate.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 5
 			os.write(0xA5);
 			codeLength += 1;
 			return codeLength;
 		}
-		
-		if (uEAttachComplete != null) {
-			codeLength += uEAttachComplete.encode(os, false);
+
+		if (uEAdmissionStatus != null) {
+			codeLength += uEAdmissionStatus.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 4
 			os.write(0xA4);
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (uEAdmissionResponse != null) {
 			codeLength += uEAdmissionResponse.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 3
@@ -608,7 +608,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (uEAdmissionRequest != null) {
 			codeLength += uEAdmissionRequest.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
@@ -616,7 +616,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (cellConfigReport != null) {
 			codeLength += cellConfigReport.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
@@ -624,7 +624,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		if (cellConfigRequest != null) {
 			codeLength += cellConfigRequest.encode(os, false);
 			// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
@@ -632,7 +632,7 @@
 			codeLength += 1;
 			return codeLength;
 		}
-		
+
 		throw new IOException("Error encoding CHOICE: No element of CHOICE was selected.");
 	}
 
@@ -675,14 +675,14 @@
 		}
 
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 4)) {
-			uEAttachComplete = new UEAttachComplete();
-			codeLength += uEAttachComplete.decode(is, false);
+			uEAdmissionStatus = new UEAdmissionStatus();
+			codeLength += uEAdmissionStatus.decode(is, false);
 			return codeLength;
 		}
 
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 5)) {
-			uEAdmissionStatus = new UEAdmissionStatus();
-			codeLength += uEAdmissionStatus.decode(is, false);
+			uEContextUpdate = new UEContextUpdate();
+			codeLength += uEContextUpdate.decode(is, false);
 			return codeLength;
 		}
 
@@ -723,119 +723,119 @@
 		}
 
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 12)) {
-			uECapabilityEnquiry = new UECapabilityEnquiry();
-			codeLength += uECapabilityEnquiry.decode(is, false);
-			return codeLength;
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 13)) {
-			uECapabilityInfo = new UECapabilityInfo();
-			codeLength += uECapabilityInfo.decode(is, false);
-			return codeLength;
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 14)) {
 			hORequest = new HORequest();
 			codeLength += hORequest.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 15)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 13)) {
 			hOFailure = new HOFailure();
 			codeLength += hOFailure.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 16)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 14)) {
 			hOComplete = new HOComplete();
 			codeLength += hOComplete.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 17)) {
+		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, 18)) {
+		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, 19)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 17)) {
 			l2MeasConfig = new L2MeasConfig();
 			codeLength += l2MeasConfig.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 20)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 18)) {
 			radioMeasReportPerUE = new RadioMeasReportPerUE();
 			codeLength += radioMeasReportPerUE.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 21)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 19)) {
 			radioMeasReportPerCell = new RadioMeasReportPerCell();
 			codeLength += radioMeasReportPerCell.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 22)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 20)) {
 			schedMeasReportPerUE = new SchedMeasReportPerUE();
 			codeLength += schedMeasReportPerUE.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 23)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 21)) {
 			schedMeasReportPerCell = new SchedMeasReportPerCell();
 			codeLength += schedMeasReportPerCell.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 24)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 22)) {
 			pDCPMeasReportPerUe = new PDCPMeasReportPerUe();
 			codeLength += pDCPMeasReportPerUe.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 25)) {
+		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)) {
+			uECapabilityEnquiry = new UECapabilityEnquiry();
+			codeLength += uECapabilityEnquiry.decode(is, false);
+			return codeLength;
+		}
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 26)) {
-			rRMConfig = new RRMConfig();
-			codeLength += rRMConfig.decode(is, false);
-			return codeLength;
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 27)) {
-			rRMConfigStatus = new RRMConfigStatus();
-			codeLength += rRMConfigStatus.decode(is, false);
-			return codeLength;
-		}
-
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 28)) {
 			scellAdd = new ScellAdd();
 			codeLength += scellAdd.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 29)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 27)) {
 			scellAddStatus = new ScellAddStatus();
 			codeLength += scellAddStatus.decode(is, false);
 			return codeLength;
 		}
 
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 30)) {
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 28)) {
 			scellDelete = new ScellDelete();
 			codeLength += scellDelete.decode(is, false);
 			return codeLength;
 		}
 
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 29)) {
+			rRMConfig = new RRMConfig();
+			codeLength += rRMConfig.decode(is, false);
+			return codeLength;
+		}
+
+		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 30)) {
+			rRMConfigStatus = new RRMConfigStatus();
+			codeLength += rRMConfigStatus.decode(is, false);
+			return codeLength;
+		}
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 31)) {
 			seNBAdd = new SeNBAdd();
 			codeLength += seNBAdd.decode(is, false);
@@ -905,9 +905,9 @@
 			return;
 		}
 
-		if (uEAttachComplete != null) {
-			sb.append("\"uEAttachComplete\": ");
-			uEAttachComplete.appendAsString(sb, indentLevel + 1);
+		if (uEContextUpdate != null) {
+			sb.append("\"uEContextUpdate\": ");
+			uEContextUpdate.appendAsString(sb, indentLevel + 1);
 			return;
 		}
 
diff --git a/src/main/java/org.onosproject.xran/controller/XranController.java b/src/main/java/org.onosproject.xran/controller/XranController.java
index 9f2ae7a..42ca41e 100644
--- a/src/main/java/org.onosproject.xran/controller/XranController.java
+++ b/src/main/java/org.onosproject.xran/controller/XranController.java
@@ -16,12 +16,11 @@
 
 package org.onosproject.xran.controller;
 
-import org.onosproject.xran.entities.RnibCell;
+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 java.util.concurrent.BlockingQueue;
 import java.util.concurrent.SynchronousQueue;
 
 /**
@@ -39,5 +38,5 @@
 
     void removeListener(XranHostListener listener);
 
-    SynchronousQueue<String> sendModifiedRRMConf(RnibCell cell);
+    SynchronousQueue<String> sendModifiedRRMConf(RRMConfig rrmConfig, boolean xICIC);
 }
diff --git a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
index a3740bc..a5e073a 100644
--- a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
+++ b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
@@ -41,7 +41,6 @@
 import org.onosproject.xran.impl.XranConfig;
 import org.onosproject.xran.providers.XranDeviceListener;
 import org.onosproject.xran.providers.XranHostListener;
-import org.onosproject.xran.samplemessages.*;
 import org.onosproject.xran.wrapper.CellMap;
 import org.onosproject.xran.wrapper.LinkMap;
 import org.onosproject.xran.wrapper.UeMap;
@@ -49,10 +48,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.xml.bind.DatatypeConverter;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.SynchronousQueue;
 import java.util.stream.Collectors;
 
 import static org.onosproject.net.DeviceId.deviceId;
@@ -153,14 +154,14 @@
 
     @Override
     public SynchronousQueue<String> sendHORequest(RnibLink newLink, RnibLink oldLink) {
-        ECGI newEcgi = newLink.getLinkId().getSourceId(),
-                oldEcgi = oldLink.getLinkId().getSourceId();
-        CRNTI crnti = linkMap.getCrnti(newLink.getLinkId().getDestinationId());
+        ECGI newEcgi = newLink.getLinkId().getEcgi(),
+                oldEcgi = oldLink.getLinkId().getEcgi();
+        CRNTI crnti = linkMap.getCrnti(newLink.getLinkId().getMmeues1apid());
         ChannelHandlerContext newCtx = cellMap.getCtx(newEcgi),
                 oldCtx = cellMap.getCtx(oldEcgi);
 
         try {
-            XrancPdu xrancPdu = HandoffRequest.constructPacket(crnti, oldEcgi, newEcgi);
+            XrancPdu xrancPdu = HORequest.constructPacket(crnti, oldEcgi, newEcgi);
             newCtx.writeAndFlush(getSctpMessage(xrancPdu));
             oldCtx.writeAndFlush(getSctpMessage(xrancPdu));
         } catch (IOException e) {
@@ -194,11 +195,16 @@
     }
 
     @Override
-    public SynchronousQueue<String> sendModifiedRRMConf(RnibCell cell) {
-        ECGI ecgi = cell.getEcgi();
+    public SynchronousQueue<String> sendModifiedRRMConf(RRMConfig rrmConfig, boolean xICIC) {
+        ECGI ecgi = rrmConfig.getEcgi();
         ChannelHandlerContext ctx = cellMap.getCtx(ecgi);
         try {
-            XrancPdu pdu = RRMConfig.constructPacket(cell);
+            XrancPdu pdu;
+            if (xICIC) {
+                pdu = XICICConfig.constructPacket(rrmConfig);
+            } else {
+                pdu = RRMConfig.constructPacket(rrmConfig);
+            }
             ctx.writeAndFlush(getSctpMessage(pdu));
         } catch (IOException e) {
             e.printStackTrace();
@@ -261,7 +267,7 @@
                                             if (conf == null) {
                                                 try {
                                                     ChannelHandlerContext ctx = cellMap.getCtx(ecgi);
-                                                    XrancPdu xrancPdu = ConfigEncoderDecoder.constructPacket(ecgi);
+                                                    XrancPdu xrancPdu = CellConfigRequest.constructPacket(ecgi);
                                                     ctx.writeAndFlush(getSctpMessage(xrancPdu));
                                                 } catch (IOException e) {
                                                     log.error(ExceptionUtils.getFullStackTrace(e));
@@ -273,7 +279,7 @@
                                                 try {
                                                     ChannelHandlerContext ctx = cellMap.
                                                             getCtx(ecgi);
-                                                    XrancPdu xrancPdu = L2MeasConf.constructPacket(ecgi, xranConfig.getL2MeasInterval());
+                                                    XrancPdu xrancPdu = L2MeasConfig.constructPacket(ecgi, xranConfig.getL2MeasInterval());
                                                     cell.setMeasConfig(xrancPdu.getBody().getL2MeasConfig());
                                                     SctpMessage sctpMessage = getSctpMessage(xrancPdu);
                                                     ctx.writeAndFlush(sctpMessage);
@@ -325,7 +331,7 @@
                                             if (ue.getCapability() == null) {
                                                 try {
                                                     ChannelHandlerContext ctx = cellMap.getCtx(primary.getEcgi());
-                                                    XrancPdu xrancPdu = UECapabilityEnq.constructPacket(
+                                                    XrancPdu xrancPdu = UECapabilityEnquiry.constructPacket(
                                                             primary.getEcgi(),
                                                             ue.getRanId());
                                                     ctx.writeAndFlush(getSctpMessage(xrancPdu));
@@ -347,7 +353,7 @@
                                                                 measCells.setPCIARFCN(pciarfcn);
                                                             }
                                                         });
-                                                        XrancPdu xrancPdu = SignalMeasConfig.constructPacket(
+                                                        XrancPdu xrancPdu = RXSigMeasConfig.constructPacket(
                                                                 primary.getEcgi(),
                                                                 ue.getRanId(),
                                                                 measCells,
@@ -436,7 +442,7 @@
 
                 Set<ECGI> ecgiSet = xranStore.getLinksByUeId(ue.getMmeS1apId().longValue())
                         .stream()
-                        .map(l -> l.getLinkId().getSourceId())
+                        .map(l -> l.getLinkId().getEcgi())
                         .collect(Collectors.toSet());
 
                 for (XranHostListener l : xranHostListeners) {
@@ -486,6 +492,7 @@
                     ECGI ecgi = report.getEcgi();
 
                     RnibCell cell = xranStore.getCell(ecgi);
+                    cell.setVersion(recv_pdu.getHdr().getVer().toString());
                     cell.setConf(report);
 
                     break;
@@ -497,7 +504,7 @@
                     ECGI ecgi = ueAdmissionRequest.getEcgi();
                     if (xranStore.getCell(ecgi) != null) {
                         CRNTI crnti = ueAdmissionRequest.getCrnti();
-                        send_pdu = UEAdmEncoderDecoder.constructPacket(ecgi, crnti);
+                        send_pdu = UEAdmissionResponse.constructPacket(ecgi, crnti, xranConfig.admissionFlag());
                         ctx.writeAndFlush(getSctpMessage(send_pdu));
                     } else {
                         log.warn("Could not find ECGI in registered cells: {}", ecgi);
@@ -520,18 +527,18 @@
                 }
                 case 5: {
                     // Decode UE Admission Context Update.
-                    UEAttachComplete ueAttachComplete = recv_pdu.getBody().getUEAttachComplete();
+                    UEContextUpdate ueContextUpdate = recv_pdu.getBody().getUEContextUpdate();
 
-                    RnibCell cell = xranStore.getCell(ueAttachComplete.getEcgi());
+                    RnibCell cell = xranStore.getCell(ueContextUpdate.getEcgi());
 
-                    RnibUe ue = ueMap.get(ueAttachComplete.getMMEUES1APID());
-                    if (ueMap.get(ueAttachComplete.getMMEUES1APID()) == null) {
+                    RnibUe ue = ueMap.get(ueContextUpdate.getMMEUES1APID());
+                    if (ueMap.get(ueContextUpdate.getMMEUES1APID()) == null) {
                         ue = new RnibUe();
                     }
 
-                    ue.setMmeS1apId(ueAttachComplete.getMMEUES1APID());
-                    ue.setEnbS1apId(ueAttachComplete.getENBUES1APID());
-                    ue.setRanId(ueAttachComplete.getCrnti());
+                    ue.setMmeS1apId(ueContextUpdate.getMMEUES1APID());
+                    ue.setEnbS1apId(ueContextUpdate.getENBUES1APID());
+                    ue.setRanId(ueContextUpdate.getCrnti());
 
                     hostAgent.addConnectedHost(ue, cell, ctx);
                     break;
@@ -574,22 +581,19 @@
                     }
 
                     BerInteger numErabs = bearerAdmissionRequest.getNumErabs();
-
-                    send_pdu = BearerEncoderDecoder.constructPacket(ecgi, crnti, erabParams, numErabs);
-                    // Encode and send Bearer Admission Response - API ID 9
+                    // Encode and send Bearer Admission Response
+                    send_pdu = BearerAdmissionResponse.constructPacket(ecgi, crnti, erabParams, numErabs, xranConfig.bearerFlag());
                     ctx.writeAndFlush(getSctpMessage(send_pdu));
                     break;
                 }
                 case 10: {
                     //Decode Bearer Admission Status
                     BearerAdmissionStatus bearerAdmissionStatus = recv_pdu.getBody().getBearerAdmissionStatus();
-
+                    break;
 //                    ECGI ecgi = bearerAdmissionStatus.getEcgi();
 //                    CRNTI crnti = bearerAdmissionStatus.getCrnti();
 //
 //                    RnibLink link = linkMap.get(ecgi, crnti);
-
-                    break;
                 }
                 case 11: {
                     //Decode Bearer Release Ind
@@ -610,32 +614,9 @@
                             }).collect(Collectors.toList());
 
                     link.getBearerParameters().setERABParamsItem(new ArrayList<>(unreleased));
-
-                    break;
-                }
-                case 12: {
-                    // Don't know what will invoke sending UE CAPABILITY ENQUIRY
-                    // Encode and send UE CAPABILITY ENQUIRY
-                    UECapabilityEnquiry ueCapabilityEnquiry = recv_pdu.getBody().getUECapabilityEnquiry();
-                    XrancPdu xrancPdu = UECapabilityEnq.constructPacket(ueCapabilityEnquiry.getEcgi(), ueCapabilityEnquiry.getCrnti());
-                    ctx.writeAndFlush(getSctpMessage(xrancPdu));
                     break;
                 }
                 case 13: {
-                    // Decode UE Capability Info
-                    UECapabilityInfo capabilityInfo = recv_pdu.getBody().getUECapabilityInfo();
-
-                    RnibUe ue = ueMap.get(capabilityInfo.getCrnti());
-                    if (ue != null) {
-                        ue.setCapability(capabilityInfo);
-                    } else {
-                        log.warn("Could not find UE with this CRNTI: {}", capabilityInfo.getCrnti());
-                    }
-                    break;
-
-                    //14, 15, 16 are handoff
-                }
-                case 15: {
                     HOFailure hoFailure = recv_pdu.getBody().getHOFailure();
 
                     try {
@@ -648,8 +629,9 @@
                         hoQueue.remove(hoFailure.getCrnti());
                     }
                     break;
+
                 }
-                case 16: {
+                case 14: {
                     HOComplete hoComplete = recv_pdu.getBody().getHOComplete();
 
                     RnibLink oldLink = linkMap.get(hoComplete.getEcgiS(), hoComplete.getCrntiNew()),
@@ -669,7 +651,8 @@
                     }
                     break;
                 }
-                case 18: {
+
+                case 16: {
                     // Decode RX Sig Meas Report.
                     RXSigMeasReport rxSigMeasReport = recv_pdu.getBody().getRXSigMeasReport();
                     List<RXSigReport> rxSigReportList = rxSigMeasReport.getCellMeasReports().getRXSigReport();
@@ -704,7 +687,7 @@
                     }
                     break;
                 }
-                case 20: {
+                case 18: {
                     RadioMeasReportPerUE radioMeasReportPerUE = recv_pdu.getBody().getRadioMeasReportPerUE();
 
                     List<RadioRepPerServCell> servCells = radioMeasReportPerUE.getRadioReportServCells().getRadioRepPerServCell();
@@ -738,14 +721,14 @@
                     });
                     break;
                 }
-                case 21: {
+                case 19: {
                     RadioMeasReportPerCell radioMeasReportPerCell = recv_pdu.getBody().getRadioMeasReportPerCell();
                     break;
                 }
-                case 22: {
+                case 20: {
                     SchedMeasReportPerUE schedMeasReportPerUE = recv_pdu.getBody().getSchedMeasReportPerUE();
-
-                    List<SchedMeasRepPerServCell> servCells = schedMeasReportPerUE.getSchedReportServCells().getSchedMeasRepPerServCell();
+                    List<SchedMeasRepPerServCell> servCells = schedMeasReportPerUE.getSchedReportServCells()
+                            .getSchedMeasRepPerServCell();
 
                     servCells.forEach(servCell -> {
                         RnibCell cell = cellMap.get(servCell.getPciArfcn());
@@ -758,7 +741,8 @@
                                 link.getResourceUsage().setDl(servCell.getPrbUsage().getPrbUsageDl());
                                 link.getResourceUsage().setUl(servCell.getPrbUsage().getPrbUsageUl());
                             } else {
-                                log.warn("Could not find link between: {}-{}", cell.getEcgi(), schedMeasReportPerUE.getCrnti());
+                                log.warn("Could not find link between: {}-{}", cell.getEcgi(),
+                                        schedMeasReportPerUE.getCrnti());
                             }
                         } else {
                             log.warn("Could not find cell with PCI-ARFCN: {}", servCell.getPciArfcn());
@@ -766,9 +750,8 @@
                     });
                     break;
                 }
-                case 23: {
+                case 21: {
                     SchedMeasReportPerCell schedMeasReportPerCell = recv_pdu.getBody().getSchedMeasReportPerCell();
-
                     RnibCell cell = cellMap.get(schedMeasReportPerCell.getEcgi());
                     if (cell != null) {
                         cell.setPrimaryPrbUsage(schedMeasReportPerCell.getPrbUsagePcell());
@@ -779,7 +762,7 @@
                     }
                     break;
                 }
-                case 24: {
+                case 22: {
                     PDCPMeasReportPerUe pdcpMeasReportPerUe = recv_pdu.getBody().getPDCPMeasReportPerUe();
 
                     RnibLink link = linkMap.get(pdcpMeasReportPerUe.getEcgi(), pdcpMeasReportPerUe.getCrnti());
@@ -789,11 +772,35 @@
                         link.getPdcpPackDelay().setDl(pdcpMeasReportPerUe.getPktDelayDl());
                         link.getPdcpPackDelay().setUl(pdcpMeasReportPerUe.getPktDelayUl());
                     } else {
-                        log.warn("Could not find link between: {}-{}", pdcpMeasReportPerUe.getEcgi(), pdcpMeasReportPerUe.getCrnti());
+                        log.warn("Could not find link between: {}-{}", pdcpMeasReportPerUe.getEcgi(),
+                                pdcpMeasReportPerUe.getCrnti());
                     }
                     break;
                 }
-                case 27: {
+                case 24: {
+                    // Decode UE Capability Info
+                    UECapabilityInfo capabilityInfo = recv_pdu.getBody().getUECapabilityInfo();
+
+                    RnibUe ue = ueMap.get(capabilityInfo.getCrnti());
+                    if (ue != null) {
+                        ue.setCapability(capabilityInfo);
+                    } else {
+                        log.warn("Could not find UE with this CRNTI: {}", capabilityInfo.getCrnti());
+                    }
+                    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));
+                    break;
+                }
+                // TODO: Case 26: ScellAdd 27: ScellAddStatus 28: ScellDelete
+
+                case 30: {
+                    // Decode RRMConfig Status
                     RRMConfigStatus rrmConfigStatus = recv_pdu.getBody().getRRMConfigStatus();
                     try {
                         RRMCellQueue.get(rrmConfigStatus.getEcgi())
@@ -806,6 +813,7 @@
                     }
                     break;
                 }
+                //TODO Case 31: SeNBAdd 32: SeNBAddStatus 33: SeNBDelete
                 case 34: {
                     TrafficSplitConfig trafficSplitConfig = recv_pdu.getBody().getTrafficSplitConfig();
 
diff --git a/src/main/java/org.onosproject.xran/entities/RnibCell.java b/src/main/java/org.onosproject.xran/entities/RnibCell.java
index d917f02..81aeafd 100644
--- a/src/main/java/org.onosproject.xran/entities/RnibCell.java
+++ b/src/main/java/org.onosproject.xran/entities/RnibCell.java
@@ -35,6 +35,8 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * Created by dimitris on 7/22/17.
@@ -49,10 +51,12 @@
     private RRMConfig rrmConfig;
     private L2MeasConfig measConfig;
 
+    private String version;
+
     public RnibCell() {
         prbUsage = new PrbUsageContainer();
         setDefaultRRMConf();
-
+        version = "3";
     }
 
     public static URI uri(ECGI ecgi) {
@@ -81,6 +85,14 @@
         return ecgi;
     }
 
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
     public RRMConfig getRrmConfig() {
         return rrmConfig;
     }
@@ -100,10 +112,6 @@
     private void setDefaultRRMConf() {
         rrmConfig = new RRMConfig();
 
-        RRMConfig.Crnti crnti2 = new RRMConfig.Crnti();
-
-        rrmConfig.setCrnti(crnti2);
-
         rrmConfig.setEcgi(ecgi);
 
         RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
@@ -164,27 +172,71 @@
         RRMConfig.Crnti crnti = new RRMConfig.Crnti();
         ueList.forEach(ue -> crnti.addCRNTI(ue.getRanId()));
 
-        RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
-        RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
-        int i = 0;
-        if (rrmConfigNode.get("start_prb_dl").isArray()) {
-            for (final JsonNode config : rrmConfigNode) {
-                startPrbDl.getSeqOf().set(i, new BerInteger(config.asInt()));
-                i++;
+        {
+            JsonNode start_prb_dl = rrmConfigNode.get("start_prb_dl");
+            if (start_prb_dl != null) {
+                RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
+                if (start_prb_dl.isArray()) {
+                    if (rrmConfig.getStartPrbDl().getSeqOf().size() == start_prb_dl.size()) {
+                        List<BerInteger> collect = Stream.of(start_prb_dl)
+                                .map(val -> new BerInteger(val.asInt()))
+                                .collect(Collectors.toList());
+                        startPrbDl.setSeqOf(collect);
+                    }
+                }
+                rrmConfig.setStartPrbDl(startPrbDl);
             }
         }
-        i = 0;
-        if (rrmConfigNode.get("end_prb_dl").isArray()) {
-            for (final JsonNode config : rrmConfigNode) {
-                endPrbDl.getSeqOf().set(i, new BerInteger(config.asInt()));
-                i++;
-            }
-        }
-        rrmConfig.setEndPrbDl(endPrbDl);
-        rrmConfig.setStartPrbDl(startPrbDl);
-        rrmConfig.setCrnti(crnti);
-        rrmConfig.setEcgi(ecgi);
 
+        {
+            JsonNode end_prb_dl = rrmConfigNode.get("end_prb_dl");
+            if (end_prb_dl != null) {
+                RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
+                if (end_prb_dl.isArray()) {
+                    if (rrmConfig.getEndPrbDl().getSeqOf().size() == end_prb_dl.size()) {
+                        List<BerInteger> collect = Stream.of(end_prb_dl)
+                                .map(val -> new BerInteger(val.asInt()))
+                                .collect(Collectors.toList());
+                        endPrbDl.setSeqOf(collect);
+                    }
+                }
+                rrmConfig.setEndPrbDl(endPrbDl);
+            }
+        }
+
+        {
+            JsonNode start_prb_ul = rrmConfigNode.get("start_prb_ul");
+            if (start_prb_ul != null) {
+                RRMConfig.StartPrbUl startPrbUl = new RRMConfig.StartPrbUl();
+                if (start_prb_ul.isArray()) {
+                    if (rrmConfig.getStartPrbUl().getSeqOf().size() == start_prb_ul.size()) {
+                        List<BerInteger> collect = Stream.of(start_prb_ul)
+                                .map(val -> new BerInteger(val.asInt()))
+                                .collect(Collectors.toList());
+                        startPrbUl.setSeqOf(collect);
+                    }
+                }
+                rrmConfig.setStartPrbUl(startPrbUl);
+            }
+        }
+
+        {
+            JsonNode end_prb_ul = rrmConfigNode.get("end_prb_ul");
+            if (end_prb_ul != null) {
+                RRMConfig.EndPrbUl endPrbUl = new RRMConfig.EndPrbUl();
+                if (end_prb_ul.isArray()) {
+                    if (rrmConfig.getEndPrbUl().getSeqOf().size() == end_prb_ul.size()) {
+                        List<BerInteger> collect = Stream.of(end_prb_ul)
+                                .map(val -> new BerInteger(val.asInt()))
+                                .collect(Collectors.toList());
+                        endPrbUl.setSeqOf(collect);
+                    }
+                }
+                rrmConfig.setEndPrbUl(endPrbUl);
+            }
+        }
+
+        rrmConfig.setCrnti(crnti);
 
         // TODO
     }
diff --git a/src/main/java/org.onosproject.xran/entities/RnibLink.java b/src/main/java/org.onosproject.xran/entities/RnibLink.java
index d9f39cc..8af1644 100644
--- a/src/main/java/org.onosproject.xran/entities/RnibLink.java
+++ b/src/main/java/org.onosproject.xran/entities/RnibLink.java
@@ -16,15 +16,20 @@
 
 package org.onosproject.xran.entities;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import org.onosproject.xran.codecs.api.*;
 import org.onosproject.xran.codecs.pdu.PDCPMeasReportPerUe;
 import org.onosproject.xran.codecs.pdu.RRMConfig;
 import org.onosproject.xran.identifiers.LinkId;
+import org.openmuc.jasn1.ber.types.BerBitString;
 import org.openmuc.jasn1.ber.types.BerInteger;
 
 import java.util.Arrays;
+import java.util.List;
 import java.util.Optional;
 import java.util.Timer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * Created by dimitris on 7/22/17.
@@ -59,6 +64,8 @@
         type = Type.NON_SERVING;
 
         linkId = LinkId.valueOf(cell, ue);
+
+        setDefaultRRMConf();
     }
 
     public Timer getTimer() {
@@ -124,6 +131,74 @@
         this.rrmParameters = rrmParameters;
     }
 
+    public void modifyRrmParameters(JsonNode rrmConfigNode) {
+        {
+            JsonNode start_prb_dl = rrmConfigNode.get("start_prb_dl");
+            if (start_prb_dl != null) {
+                RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
+                if (start_prb_dl.isArray()) {
+                    if (rrmParameters.getStartPrbDl().getSeqOf().size() == start_prb_dl.size()) {
+                        List<BerInteger> collect = Stream.of(start_prb_dl)
+                                .map(val -> new BerInteger(val.asInt()))
+                                .collect(Collectors.toList());
+                        startPrbDl.setSeqOf(collect);
+                    }
+                }
+                rrmParameters.setStartPrbDl(startPrbDl);
+            }
+        }
+
+        {
+            JsonNode end_prb_dl = rrmConfigNode.get("end_prb_dl");
+            if (end_prb_dl != null) {
+                RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
+                if (end_prb_dl.isArray()) {
+                    if (rrmParameters.getEndPrbDl().getSeqOf().size() == end_prb_dl.size()) {
+                        List<BerInteger> collect = Stream.of(end_prb_dl)
+                                .map(val -> new BerInteger(val.asInt()))
+                                .collect(Collectors.toList());
+                        endPrbDl.setSeqOf(collect);
+                    }
+                }
+                rrmParameters.setEndPrbDl(endPrbDl);
+            }
+        }
+
+        {
+            JsonNode start_prb_ul = rrmConfigNode.get("start_prb_ul");
+            if (start_prb_ul != null) {
+                RRMConfig.StartPrbUl startPrbUl = new RRMConfig.StartPrbUl();
+                if (start_prb_ul.isArray()) {
+                    if (rrmParameters.getStartPrbUl().getSeqOf().size() == start_prb_ul.size()) {
+                        List<BerInteger> collect = Stream.of(start_prb_ul)
+                                .map(val -> new BerInteger(val.asInt()))
+                                .collect(Collectors.toList());
+                        startPrbUl.setSeqOf(collect);
+                    }
+                }
+                rrmParameters.setStartPrbUl(startPrbUl);
+            }
+        }
+
+        {
+            JsonNode end_prb_ul = rrmConfigNode.get("end_prb_ul");
+            if (end_prb_ul != null) {
+                RRMConfig.EndPrbUl endPrbUl = new RRMConfig.EndPrbUl();
+                if (end_prb_ul.isArray()) {
+                    if (rrmParameters.getEndPrbUl().getSeqOf().size() == end_prb_ul.size()) {
+                        List<BerInteger> collect = Stream.of(end_prb_ul)
+                                .map(val -> new BerInteger(val.asInt()))
+                                .collect(Collectors.toList());
+                        endPrbUl.setSeqOf(collect);
+                    }
+                }
+                rrmParameters.setEndPrbUl(endPrbUl);
+            }
+        }
+
+        // TODO
+    }
+
     public PDCPThroughput getPdcpThroughput() {
         return pdcpThroughput;
     }
@@ -148,6 +223,50 @@
         this.resourceUsage = resourceUsage;
     }
 
+    private void setDefaultRRMConf() {
+        rrmParameters = new RRMConfig();
+
+        RRMConfig.Crnti crnti = new RRMConfig.Crnti();
+        crnti.addCRNTI(linkId.getUe().getRanId());
+
+        rrmParameters.setCrnti(crnti);
+
+        rrmParameters.setEcgi(linkId.getEcgi());
+
+        RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
+        startPrbDl.addBerInteger(new BerInteger(0));
+        startPrbDl.addBerInteger(new BerInteger(50));
+
+        rrmParameters.setStartPrbDl(startPrbDl);
+
+        RRMConfig.StartPrbUl startPrbUl = new RRMConfig.StartPrbUl();
+        startPrbUl.addBerInteger(new BerInteger(50));
+        startPrbUl.addBerInteger(new BerInteger(100));
+
+        rrmParameters.setStartPrbUl(startPrbUl);
+
+        RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
+        endPrbDl.addBerInteger(new BerInteger(50));
+        endPrbDl.addBerInteger(new BerInteger(100));
+
+        rrmParameters.setEndPrbDl(endPrbDl);
+
+        RRMConfig.EndPrbUl endPrbUl = new RRMConfig.EndPrbUl();
+        endPrbUl.addBerInteger(new BerInteger(50));
+        endPrbUl.addBerInteger(new BerInteger(100));
+
+        rrmParameters.setEndPrbUl(endPrbUl);
+
+        RRMConfig.SubframeBitmaskDl subframeBitmaskDl = new RRMConfig.SubframeBitmaskDl();
+        BerBitString berBitString = new BerBitString(new byte[]{(byte) 0xAA, (byte) 0x80}, 10);
+        BerBitString berBitString1 = new BerBitString(new byte[]{(byte) 0x55, (byte) 0x40}, 10);
+
+        subframeBitmaskDl.addBerBitString(berBitString);
+        subframeBitmaskDl.addBerBitString(berBitString1);
+
+        rrmParameters.setSubframeBitmaskDl(subframeBitmaskDl);
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
diff --git a/src/main/java/org.onosproject.xran/identifiers/LinkId.java b/src/main/java/org.onosproject.xran/identifiers/LinkId.java
index 9c71224..b6fd611 100644
--- a/src/main/java/org.onosproject.xran/identifiers/LinkId.java
+++ b/src/main/java/org.onosproject.xran/identifiers/LinkId.java
@@ -43,19 +43,19 @@
         return new LinkId(cell, ue);
     }
 
-    public ECGI getSourceId() {
+    public ECGI getEcgi() {
         return cell.getEcgi();
     }
 
-    public void setSourceId(ECGI sourceId) {
+    public void setEcgi(ECGI sourceId) {
         cell.setEcgi(sourceId);
     }
 
-    public MMEUES1APID getDestinationId() {
+    public MMEUES1APID getMmeues1apid() {
         return ue.getMmeS1apId();
     }
 
-    public void setDestinationId(MMEUES1APID destinationId) {
+    public void setMmeues1apid(MMEUES1APID destinationId) {
         ue.setMmeS1apId(destinationId);
     }
 
diff --git a/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java b/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
index f3a9fac..3cc0e01 100644
--- a/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
+++ b/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
@@ -86,7 +86,7 @@
         list.addAll(
                 linkMap.keySet()
                         .stream()
-                        .filter(k -> k.getSourceId().equals(ecgi))
+                        .filter(k -> k.getEcgi().equals(ecgi))
                         .map(v -> linkMap.get(v))
                         .collect(Collectors.toList()));
 
@@ -101,7 +101,7 @@
         list.addAll(
                 linkMap.keySet()
                         .stream()
-                        .filter(k -> k.getSourceId().getEUTRANcellIdentifier().equals(eci))
+                        .filter(k -> k.getEcgi().getEUTRANcellIdentifier().equals(eci))
                         .map(v -> linkMap.get(v))
                         .collect(Collectors.toList()));
 
@@ -116,7 +116,7 @@
         list.addAll(
                 linkMap.keySet()
                         .stream()
-                        .filter(k -> k.getDestinationId().equals(mme))
+                        .filter(k -> k.getMmeues1apid().equals(mme))
                         .map(v -> linkMap.get(v))
                         .collect(Collectors.toList()));
 
@@ -130,8 +130,8 @@
 
         Optional<LinkId> first = linkMap.keySet()
                 .stream()
-                .filter(linkId -> linkId.getSourceId().getEUTRANcellIdentifier().equals(eci))
-                .filter(linkId -> linkId.getDestinationId().equals(mme))
+                .filter(linkId -> linkId.getEcgi().getEUTRANcellIdentifier().equals(eci))
+                .filter(linkId -> linkId.getMmeues1apid().equals(mme))
                 .findFirst();
 
         return first.map(linkId -> linkMap.get(linkId)).orElse(null);
@@ -145,8 +145,17 @@
         if (cell != null && ue != null) {
             RnibLink link = new RnibLink(cell, ue);
 
+            // TODO: check logic for each type
             try {
-                link.setType(RnibLink.Type.valueOf(type));
+                RnibLink.Type linkType = RnibLink.Type.valueOf(type);
+                switch (linkType) {
+                    case NON_SERVING:
+                        break;
+                    case SERVING_PRIMARY:
+                        break;
+                    case SERVING_SECONDARY:
+                        break;
+                }
             } catch (Exception e) {
                 log.error(ExceptionUtils.getFullStackTrace(e));
             }
@@ -177,6 +186,11 @@
     }
 
     @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());
@@ -233,13 +247,11 @@
     }
 
     @Override
-    public boolean modifyCellRrmConf(RnibCell cell, JsonNode rrmConf) {
-
+    public void modifyCellRrmConf(RnibCell cell, JsonNode rrmConf) {
         List<RnibLink> linkList = getLinksByECGI(cell.getEcgi());
         List<RnibUe> ueList = linkList.stream().map(link -> link.getLinkId().getUe()).collect(Collectors.toList());
 
         cell.modifyRrmConfig(rrmConf, ueList);
-        return false;
     }
 
     @Override
diff --git a/src/main/java/org.onosproject.xran/impl/XranConfig.java b/src/main/java/org.onosproject.xran/impl/XranConfig.java
index be27c89..5f59d4d 100644
--- a/src/main/java/org.onosproject.xran/impl/XranConfig.java
+++ b/src/main/java/org.onosproject.xran/impl/XranConfig.java
@@ -56,6 +56,10 @@
 
     private static final String L2_MEAS_REPORT_INTERVAL = "l2_meas_report_interval_ms";
 
+    private static final String ADMISSION_SUCCESS = "admission_success";
+
+    private static final String BEARER_SUCCESS = "bearer_success";
+
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     public Map<String, ECGI> activeCellSet() {
@@ -80,6 +84,16 @@
         return cells;
     }
 
+    public boolean admissionFlag() {
+        JsonNode flag = object.get(ADMISSION_SUCCESS);
+        return flag != null && flag.asBoolean();
+    }
+
+    public boolean bearerFlag() {
+        JsonNode flag = object.get(BEARER_SUCCESS);
+        return flag != null && flag.asBoolean();
+    }
+
     public int getXrancPort() {
         return object.get(XRANC_PORT).asInt();
     }
diff --git a/src/main/java/org.onosproject.xran/rest/CellWebResource.java b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
index 336f67a..c62cd0e 100644
--- a/src/main/java/org.onosproject.xran/rest/CellWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
@@ -21,8 +21,6 @@
 import org.onosproject.rest.AbstractWebResource;
 import org.onosproject.xran.XranStore;
 import org.onosproject.xran.annotations.Patch;
-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.slf4j.Logger;
@@ -37,8 +35,8 @@
 import javax.ws.rs.core.Response;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Optional;
 import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Cell web resource.
@@ -59,25 +57,24 @@
     @Path("{cellid}")
     @Produces(MediaType.APPLICATION_JSON)
     public Response getCell(@PathParam("cellid") String eciHex) {
-        log.debug("GET CELLID {}", eciHex);
-
         RnibCell cell = get(XranStore.class).getCell(eciHex);
 
-        ObjectNode rootNode = mapper().createObjectNode();
-
         if (cell != null) {
             try {
+                ObjectNode rootNode = mapper().createObjectNode();
+
                 JsonNode jsonNode = mapper().readTree(cell.toString());
                 rootNode.put("cell", jsonNode);
             } catch (IOException e) {
                 log.error(ExceptionUtils.getFullStackTrace(e));
                 e.printStackTrace();
+                return Response.serverError()
+                        .entity(ExceptionUtils.getFullStackTrace(e))
+                        .build();
             }
-        } else {
-            rootNode.put("error", "not found");
         }
 
-        return ok(rootNode.toString()).build();
+        return Response.serverError().entity("cell not found").build();
     }
 
     /**
@@ -91,31 +88,41 @@
     @Path("{cellid}")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response patchCell(@PathParam("cellid") String eciHex, InputStream stream) {
-        log.debug("PATCH CELLID {}", eciHex);
-
-        boolean b;
-
         RnibCell cell = get(XranStore.class).getCell(eciHex);
-        // Check if a cell with that ECI exists. If it does, then modify its contents.
 
-        try {
-            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+        if (cell != null) {
+            try {
+                ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
-            JsonNode rrmConf = jsonTree.get("RRMConf");
-            if (rrmConf != null) {
-                final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
-                b = get(XranStore.class).modifyCellRrmConf(cell, rrmConf);
-                if (b) {
-                    queue[0] = get(XranController.class).sendModifiedRRMConf(cell);
-                    return Response.ok().entity(queue[0].take()).build();
+                JsonNode rrmConf = jsonTree.get("RRMConf");
+                if (rrmConf != null) {
+                    final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
+                    get(XranStore.class).modifyCellRrmConf(cell, rrmConf);
+
+                    queue[0] = get(XranController.class).sendModifiedRRMConf(cell.getRrmConfig(),
+                            cell.getVersion().equals("3"));
+                    String poll = queue[0].poll(5, TimeUnit.SECONDS);
+
+                    if (poll != null) {
+                        return Response.ok()
+                                .entity(poll)
+                                .build();
+                    } else {
+                        return Response.serverError()
+                                .entity("did not receive response in time")
+                                .build();
+                    }
                 }
+            } catch (Exception e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                e.printStackTrace();
+                return Response.serverError()
+                        .entity(ExceptionUtils.getFullStackTrace(e))
+                        .build();
             }
-        } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-            e.printStackTrace();
-            return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
         }
-        return Response.noContent().build();
+
+        return Response.serverError().entity("cell not found").build();
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
index 370755f..3640a1d 100644
--- a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
@@ -43,6 +43,7 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Link web resource.
@@ -63,9 +64,7 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response getLinksBetween(@DefaultValue("") @QueryParam("cell") String eciHex,
-                             @DefaultValue("-1") @QueryParam("ue") long ue) {
-        log.debug("GET LINKS CELL {} AND UE {}", eciHex, ue);
-
+                                    @DefaultValue("-1") @QueryParam("ue") long ue) {
         List<RnibLink> list = Lists.newArrayList();
         if (!eciHex.isEmpty() && ue != -1) {
             RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(eciHex, ue);
@@ -80,17 +79,18 @@
             list.addAll(get(XranStore.class).getLinks());
         }
 
-        ObjectNode rootNode = mapper().createObjectNode();
-
         try {
+            ObjectNode rootNode = mapper().createObjectNode();
             JsonNode jsonNode = mapper().readTree(list.toString());
             rootNode.put("links", jsonNode);
+            return Response.ok(rootNode.toString()).build();
         } catch (IOException e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
             e.printStackTrace();
+            return Response.serverError()
+                    .entity(ExceptionUtils.getFullStackTrace(e))
+                    .build();
         }
-
-        return ok(rootNode.toString()).build();
     }
 
     /**
@@ -105,12 +105,9 @@
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response patchLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
-        log.debug("Patch LINKS FROM {} to {}", src, dst);
-
-        try {
-            RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(src, dst);
-            if (link != null) {
-
+        RnibLink link = get(XranStore.class).getLinkBetweenCellIdUeId(src, dst);
+        if (link != null) {
+            try {
                 ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
                 JsonNode type = jsonTree.get("type");
@@ -124,7 +121,17 @@
                                 .findFirst();
                         if (primary.isPresent()) {
                             queue[0] = get(XranController.class).sendHORequest(link, primary.get());
-                            return Response.ok().entity(queue[0].take()).build();
+                            String poll = queue[0].poll(5, TimeUnit.SECONDS);
+
+                            if (poll != null) {
+                                return Response.ok()
+                                        .entity(poll)
+                                        .build();
+                            } else {
+                                return Response.serverError()
+                                        .entity("did not receive response in time")
+                                        .build();
+                            }
                         }
                     }
                 }
@@ -139,16 +146,35 @@
                     if (jsonNode != null) {
                         link.getTrafficPercent().setTrafficPercentUl(new BerInteger(jsonNode.asInt()));
                     }
-                    return Response.ok().build();
+                    return Response.ok("trafficpercent changed successfully").build();
                 }
-            }
-        } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-            e.printStackTrace();
-            return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
-        }
 
-        return Response.noContent().build();
+                JsonNode rrmConf = jsonTree.get("RRMConf");
+                if (rrmConf != null) {
+                    final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
+                    get(XranStore.class).modifyLinkRrmConf(link, rrmConf);
+                    queue[0] = get(XranController.class).sendModifiedRRMConf(link.getRrmParameters(),
+                            link.getLinkId().getCell().getVersion().equals("3"));
+                    String poll = queue[0].poll(5, TimeUnit.SECONDS);
+
+                    if (poll != null) {
+                        return Response.ok()
+                                .entity(poll)
+                                .build();
+                    } else {
+                        return Response.serverError()
+                                .entity("did not receive response in time")
+                                .build();
+                    }
+                }
+
+            } catch (Exception e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                e.printStackTrace();
+                return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
+            }
+        }
+        return Response.serverError().entity("link not found").build();
     }
 
     /**
@@ -163,23 +189,25 @@
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response postLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
-        log.debug("POST LINKS FROM {} to {}", src, dst);
-
-        boolean b = false;
         try {
             ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
             JsonNode type = jsonTree.get("type");
 
             if (type != null) {
+                boolean b;
                 b = get(XranStore.class).createLinkBetweenCellIdUeId(src, dst, type.asText());
+                return ok(b).build();
             }
         } catch (Exception e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
             e.printStackTrace();
+            return Response.serverError()
+                    .entity(ExceptionUtils.getFullStackTrace(e))
+                    .build();
         }
 
-        return ok(b).build();
+        return Response.serverError().entity("unreachable code").build();
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
index 1a70ccc..7b54177 100644
--- a/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/NodeWebResource.java
@@ -55,8 +55,6 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response getNodes(@DefaultValue("") @QueryParam("type") String type) {
-        log.debug("GET NODES " + type);
-
         ObjectNode rootNode = mapper().createObjectNode();
 
         try {
@@ -85,6 +83,9 @@
         } catch (IOException e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
             e.printStackTrace();
+            return Response.serverError()
+                    .entity(ExceptionUtils.getFullStackTrace(e))
+                    .build();
         }
 
         return ok(rootNode.toString()).build();
@@ -100,25 +101,24 @@
     @Path("{nodeid}")
     @Produces(MediaType.APPLICATION_JSON)
     public Response getNodeid(@PathParam("nodeid") String nodeid) {
-        log.debug("GET NODEID {}", nodeid);
-
         Object node = get(XranStore.class).getByNodeId(nodeid);
 
-        ObjectNode rootNode = mapper().createObjectNode();
-
         if (node != null) {
             try {
+                ObjectNode rootNode = mapper().createObjectNode();
                 JsonNode jsonNode = mapper().readTree(node.toString());
                 rootNode.put("node", jsonNode);
+                return ok(rootNode.toString()).build();
             } catch (IOException e) {
                 log.error(ExceptionUtils.getFullStackTrace(e));
                 e.printStackTrace();
+                return Response.serverError()
+                        .entity(ExceptionUtils.getFullStackTrace(e))
+                        .build();
             }
-        } else {
-            rootNode.put("error", "not found");
         }
 
-        return ok(rootNode.toString()).build();
+        return Response.serverError().entity("node not found").build();
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
index 2fe8385..e895d55 100644
--- a/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/SliceWebResource.java
@@ -54,25 +54,24 @@
     @Path("{sliceid}")
     @Produces(MediaType.APPLICATION_JSON)
     public Response getSlice(@PathParam("sliceid") long sliceid) {
-        log.debug("GET SLICE {}", sliceid);
-
         RnibSlice slice = get(XranStore.class).getSlice(sliceid);
 
-        ObjectNode rootNode = mapper().createObjectNode();
-
         if (slice != null) {
             try {
+                ObjectNode rootNode = mapper().createObjectNode();
                 JsonNode jsonNode = mapper().readTree(slice.toString());
                 rootNode.put("slice", jsonNode);
+                return ok(rootNode.toString()).build();
             } catch (IOException e) {
                 log.error(ExceptionUtils.getFullStackTrace(e));
                 e.printStackTrace();
+                return Response.serverError()
+                        .entity(ExceptionUtils.getFullStackTrace(e))
+                        .build();
             }
-        } else {
-            rootNode.put("error", "not found");
         }
 
-        return ok(rootNode.toString()).build();
+        return Response.serverError().entity("slice not found").build();
     }
 
     /**
@@ -84,19 +83,19 @@
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
     public Response postSlice(InputStream stream) {
-        log.debug("POST SLICE");
-
-        boolean b = false;
         try {
+            boolean b;
             ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
             b = get(XranStore.class).createSlice(jsonTree);
+            return ok(b).build();
         } catch (Exception e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
             e.printStackTrace();
+            return Response.serverError()
+                    .entity(ExceptionUtils.getFullStackTrace(e))
+                    .build();
         }
-
-        return ok(b).build();
     }
 
 }
diff --git a/src/main/java/org.onosproject.xran/samplemessages/BearerEncoderDecoder.java b/src/main/java/org.onosproject.xran/samplemessages/BearerEncoderDecoder.java
deleted file mode 100644
index 0252451..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/BearerEncoderDecoder.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.types.BerInteger;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class BearerEncoderDecoder {
-
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, ERABParams erabParams, BerInteger numParams) {
-        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(0));
-
-            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("2.0");
-        } 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 XrancPdu setPacketProperties(XrancPdu mainDecoder) {
-        CRNTI crnti = mainDecoder.getBody().getBearerAdmissionRequest().getCrnti();
-        ECGI ecgi = mainDecoder.getBody().getBearerAdmissionRequest().getEcgi();
-
-        //TODO: Verify mainDecoder.getBody().getBearerAdmissionRequest().getNumErabs() or
-        BerInteger numErabs = new BerInteger(5);
-
-        ERABResponseItem responseItem = new ERABResponseItem();
-        responseItem.setId(new ERABID(1));
-        responseItem.setDecision(new ERABDecision(0));
-
-        ERABResponseItem responseItem1 = new ERABResponseItem();
-        responseItem1.setId(new ERABID(2));
-        responseItem1.setDecision(new ERABDecision(0));
-
-        ERABResponse erabResponse = new ERABResponse();
-        erabResponse.setERABResponse(responseItem);
-        erabResponse.setERABResponse(responseItem1);
-
-        BearerAdmissionResponse bearerAdmissionResponse = new BearerAdmissionResponse();
-        bearerAdmissionResponse.setCrnti(crnti);
-        bearerAdmissionResponse.setEcgi(ecgi);
-        bearerAdmissionResponse.setErabResponse(erabResponse);
-        bearerAdmissionResponse.setNumErabList(numErabs);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setBearerAdmissionResponse(bearerAdmissionResponse);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("2.0");
-        } 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/samplemessages/ConfigEncoderDecoder.java b/src/main/java/org.onosproject.xran/samplemessages/ConfigEncoderDecoder.java
deleted file mode 100644
index ad74aab..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/ConfigEncoderDecoder.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * 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.samplemessages;
-
-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.pdu.*;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.UnsupportedEncodingException;
-
-/**
- * Created by dimitris on 7/25/17.
- */
-public class ConfigEncoderDecoder {
-    private static final Logger log =
-            LoggerFactory.getLogger(ConfigEncoderDecoder.class);
-
-    /*public String decode(String s) throws IOException {
-        byte[] bytearray = DatatypeConverter.parseHexBinary(s);
-        InputStream inputStream = new ByteArrayInputStream(bytearray);
-        XrancPdu pdu_decoded = new XrancPdu();
-        pdu_decoded.decode(inputStream);
-        return pdu_decoded.toString();
-    }*/
-/*
-    public String encodeConfigRequest()
-            throws IOException {
-        pdu = setPacketProperties();
-        pdu.encode(os);
-        return DatatypeConverter.printHexBinary(os.getArray());
-    }*/
-
-    public static XrancPdu constructPacket(ECGI ecgi) throws UnsupportedEncodingException {
-        CellConfigRequest cellConfigRequest = new CellConfigRequest();
-        cellConfigRequest.setEcgi(ecgi);
-
-        BerUTF8String ver = new BerUTF8String("2a");
-
-        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 XrancPdu setPacketProperties() throws UnsupportedEncodingException {
-        PLMNIdentity plmnIdentity = new PLMNIdentity(new byte[]{(byte) 0x22, (byte) 0x08, (byte) 0x41});
-        EUTRANCellIdentifier eutranCellIdentifier = new EUTRANCellIdentifier(new byte[]{
-                (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xF0
-        }, 28);
-
-        ECGI ecgi = new ECGI();
-
-        ecgi.setPLMNIdentity(plmnIdentity);
-        ecgi.setEUTRANcellIdentifier(eutranCellIdentifier);
-
-        CellConfigRequest cellConfigRequest = new CellConfigRequest();
-        cellConfigRequest.setEcgi(ecgi);
-
-        BerUTF8String ver = new BerUTF8String("2a");
-
-        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/samplemessages/ConfigReport.java b/src/main/java/org.onosproject.xran/samplemessages/ConfigReport.java
deleted file mode 100644
index 5ab504e..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/ConfigReport.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
-import org.openmuc.jasn1.ber.types.BerBoolean;
-import org.openmuc.jasn1.ber.types.BerInteger;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class ConfigReport {
-
-    BerByteArrayOutputStream os;
-
-    public ConfigReport() {
-        os = new BerByteArrayOutputStream(4096);
-    }
-
-    /*public String encodeResponse(XrancPdu decoder) {
-        pdu = setPacketProperties(decoder);
-        try {
-            pdu.encode(os);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return DatatypeConverter.printHexBinary(os.getArray());
-    }*/
-
-    public XrancPdu setPacketProperties(XrancPdu decoder) throws UnsupportedEncodingException {
-
-        ECGI ecgi = decoder.getBody().getCellConfigRequest().getEcgi();
-
-        PhysCellId physCellId = new PhysCellId(420);
-
-        PhysCellId physCellId1 = new PhysCellId(500);
-        ARFCNValue earfcn_dl = new ARFCNValue(2100);
-        CandScell candScell = new CandScell();
-        candScell.setPci(physCellId1);
-        candScell.setEarfcnDl(earfcn_dl);
-
-        PhysCellId physCellId2 = new PhysCellId(400);
-        ARFCNValue earfcn_dl1 = new ARFCNValue(2300);
-        CandScell candScell1 = new CandScell();
-        candScell1.setPci(physCellId2);
-        candScell1.setEarfcnDl(earfcn_dl1);
-
-        CellConfigReport.CandScells candScells = new CellConfigReport.CandScells();
-        candScells.setCandScells(candScell);
-        candScells.setCandScells(candScell1);
-
-        ARFCNValue earfcn_dl2 = new ARFCNValue(2000);
-
-        ARFCNValue earfcn_ul = new ARFCNValue(1900);
-
-        BerInteger rbs_per_tti_dl = new BerInteger(40);
-
-        BerInteger rbs_per_tti_ul = new BerInteger(30);
-
-        BerInteger num_tx_antenna = new BerInteger(2);
-
-        DuplexMode duplexMode = new DuplexMode(1);
-
-        BerInteger max_num_connected_ues = new BerInteger(1000);
-
-        BerInteger max_num_connected_bearers = new BerInteger(2000);
-
-        BerInteger max_num_ues_sched_per_tti_dl = new BerInteger(10);
-
-        BerInteger max_num_ues_sched_per_tti_ul = new BerInteger(10);
-
-        BerBoolean dlfs_sched_enable = new BerBoolean(true);
-
-        CellConfigReport cellConfigReport = new CellConfigReport();
-        cellConfigReport.setEcgi(ecgi);
-        cellConfigReport.setPci(physCellId);
-        cellConfigReport.setCandScells(candScells);
-        cellConfigReport.setEarfcnDl(earfcn_dl2);
-        cellConfigReport.setEarfcnUl(earfcn_ul);
-        cellConfigReport.setRbsPerTtiDl(rbs_per_tti_dl);
-        cellConfigReport.setRbsPerTtiUl(rbs_per_tti_ul);
-        cellConfigReport.setNumTxAntenna(num_tx_antenna);
-        cellConfigReport.setDuplexMode(duplexMode);
-        cellConfigReport.setMaxNumConnectedUes(max_num_connected_ues);
-        cellConfigReport.setMaxNumConnectedBearers(max_num_connected_bearers);
-        cellConfigReport.setMaxNumUesSchedPerTtiDl(max_num_ues_sched_per_tti_dl);
-        cellConfigReport.setMaxNumUesSchedPerTtiUl(max_num_ues_sched_per_tti_ul);
-        cellConfigReport.setDlfsSchedEnable(dlfs_sched_enable);
-
-        BerUTF8String ver = new BerUTF8String("2a");
-
-        XrancApiID apiID = new XrancApiID(1);
-        XrancPduBody body = new XrancPduBody();
-        body.setCellConfigReport(cellConfigReport);
-
-        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/samplemessages/HandoffRequest.java b/src/main/java/org.onosproject.xran/samplemessages/HandoffRequest.java
deleted file mode 100644
index b8902aa..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/HandoffRequest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * 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.samplemessages;
-
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class HandoffRequest {
-
-    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("2a");
-
-        XrancApiID apiID = new XrancApiID(14);
-        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/samplemessages/L2MeasConf.java b/src/main/java/org.onosproject.xran/samplemessages/L2MeasConf.java
deleted file mode 100644
index 5fa3087..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/L2MeasConf.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-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.pdu.*;
-import org.openmuc.jasn1.ber.types.BerInteger;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class L2MeasConf {
-
-
-    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("2a");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(19);
-        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;
-
-    }
-
-    public XrancPdu setPacketProperties() {
-        PLMNIdentity plmnIdentity = new PLMNIdentity(new byte[]{(byte) 0x22, (byte) 0x08, (byte) 0x41});
-        EUTRANCellIdentifier eutranCellIdentifier = new EUTRANCellIdentifier(new byte[]{
-                (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xF0
-        }, 28);
-
-        ECGI ecgi = new ECGI();
-        ecgi.setPLMNIdentity(plmnIdentity);
-        ecgi.setEUTRANcellIdentifier(eutranCellIdentifier);
-
-        BerInteger reportIntervalMS = new BerInteger(10);
-        L2MeasConfig measConfig = new L2MeasConfig();
-        measConfig.setEcgi(ecgi);
-        measConfig.setReportIntervalMs(reportIntervalMS);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("2a");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(19);
-        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/samplemessages/PDCPReportPerUE.java b/src/main/java/org.onosproject.xran/samplemessages/PDCPReportPerUE.java
deleted file mode 100644
index 2400cde..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/PDCPReportPerUE.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-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.pdu.*;
-import org.openmuc.jasn1.ber.types.BerInteger;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class PDCPReportPerUE {
-
-    public XrancPdu setPacketProperties(XrancPdu recv_pdu) {
-        ECGI ecgi = recv_pdu.getBody().getL2MeasConfig().getEcgi();
-
-        //Need to get this from UE.
-        CRNTI crnti = new CRNTI(new byte[]{(byte) 0x44, (byte) 0x44}, 16);
-
-        PDCPMeasReportPerUe.QciVals qciVals = new PDCPMeasReportPerUe.QciVals();
-        qciVals.setQCI(new QCI(1));
-        qciVals.setQCI(new QCI(2));
-
-        PDCPMeasReportPerUe.DataVolDl dataVolDl = new PDCPMeasReportPerUe.DataVolDl();
-        dataVolDl.setBerInteger(new BerInteger(500));
-        dataVolDl.setBerInteger(new BerInteger(500));
-
-        PDCPMeasReportPerUe.DataVolUl dataVolUl = new PDCPMeasReportPerUe.DataVolUl();
-        dataVolUl.setBerInteger(new BerInteger(500));
-        dataVolUl.setBerInteger(new BerInteger(500));
-
-        PDCPMeasReportPerUe.PktDelayDl pktDelayDl = new PDCPMeasReportPerUe.PktDelayDl();
-        pktDelayDl.setBerInteger(new BerInteger(314));
-        pktDelayDl.setBerInteger(new BerInteger(314));
-
-        PDCPMeasReportPerUe.PktDelayUl pktDelayUl = new PDCPMeasReportPerUe.PktDelayUl();
-        pktDelayUl.setBerInteger(new BerInteger(314));
-        pktDelayUl.setBerInteger(new BerInteger(314));
-
-        PDCPMeasReportPerUe.PktDiscardRateDl pktDiscardRateDl = new PDCPMeasReportPerUe.PktDiscardRateDl();
-        pktDiscardRateDl.setBerInteger(new BerInteger(10));
-        pktDiscardRateDl.setBerInteger(new BerInteger(5));
-
-        PDCPMeasReportPerUe.PktLossRateDl pktLossRateDl = new PDCPMeasReportPerUe.PktLossRateDl();
-        pktLossRateDl.setBerInteger(new BerInteger(5));
-        pktLossRateDl.setBerInteger(new BerInteger(10));
-
-        PDCPMeasReportPerUe.PktLossRateUl pktLossRateUl = new PDCPMeasReportPerUe.PktLossRateUl();
-        pktLossRateUl.setBerInteger(new BerInteger(8));
-        pktLossRateUl.setBerInteger(new BerInteger(2));
-
-        PDCPMeasReportPerUe.ThroughputDl throughputDl = new PDCPMeasReportPerUe.ThroughputDl();
-        throughputDl.setBerInteger(new BerInteger(500));
-        throughputDl.setBerInteger(new BerInteger(500));
-
-        PDCPMeasReportPerUe.ThroughputUl throughputUl = new PDCPMeasReportPerUe.ThroughputUl();
-        throughputUl.setBerInteger(new BerInteger(500));
-        throughputUl.setBerInteger(new BerInteger(500));
-
-        PDCPMeasReportPerUe pdcpMeasReportPerUe = new PDCPMeasReportPerUe();
-        pdcpMeasReportPerUe.setCrnti(crnti);
-        pdcpMeasReportPerUe.setEcgi(ecgi);
-        pdcpMeasReportPerUe.setQciVals(qciVals);
-        pdcpMeasReportPerUe.setDataVolDl(dataVolDl);
-        pdcpMeasReportPerUe.setDataVolUl(dataVolUl);
-        pdcpMeasReportPerUe.setPktDelayDl(pktDelayDl);
-        pdcpMeasReportPerUe.setPktDelayUl(pktDelayUl);
-        pdcpMeasReportPerUe.setPktDiscardRateDl(pktDiscardRateDl);
-        pdcpMeasReportPerUe.setPktLossRateDl(pktLossRateDl);
-        pdcpMeasReportPerUe.setPktLossRateUl(pktLossRateUl);
-        pdcpMeasReportPerUe.setThroughputDl(throughputDl);
-        pdcpMeasReportPerUe.setThroughputUl(throughputUl);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setPDCPMeasReportPerUe(pdcpMeasReportPerUe);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("4");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(24);
-        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/samplemessages/RRMConf.java b/src/main/java/org.onosproject.xran/samplemessages/RRMConf.java
deleted file mode 100644
index bf1e285..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/RRMConf.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.pdu.*;
-import org.onosproject.xran.entities.RnibCell;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class RRMConf {
-
-
-}
diff --git a/src/main/java/org.onosproject.xran/samplemessages/RXSigMeasRep.java b/src/main/java/org.onosproject.xran/samplemessages/RXSigMeasRep.java
deleted file mode 100644
index e59b399..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/RXSigMeasRep.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class RXSigMeasRep {
-
-    public XrancPdu setPacketProperties(XrancPdu decoder) {
-        CRNTI crnti = decoder.getBody().getRXSigMeasConfig().getCrnti();
-        ECGI ecgi = decoder.getBody().getRXSigMeasConfig().getEcgi();
-
-        RXSigMeasReport.CellMeasReports cellMeasReports = new RXSigMeasReport.CellMeasReports();
-        RXSigReport rxSigReport = new RXSigReport();
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setPci(new PhysCellId(500));
-        pciarfcn.setEarfcnDl(new ARFCNValue(2100));
-        rxSigReport.setPciArfcn(pciarfcn);
-        rxSigReport.setRsrp(new RSRPRange(4));
-        rxSigReport.setRsrq(new RSRQRange(5));
-        cellMeasReports.setRXSigReport(rxSigReport);
-
-        RXSigReport rxSigReport1 = new RXSigReport();
-        PCIARFCN pciarfcn1 = new PCIARFCN();
-        pciarfcn1.setPci(new PhysCellId(500));
-        pciarfcn1.setEarfcnDl(new ARFCNValue(2100));
-        rxSigReport1.setPciArfcn(pciarfcn);
-        rxSigReport1.setRsrp(new RSRPRange(4));
-        rxSigReport1.setRsrq(new RSRQRange(5));
-        cellMeasReports.setRXSigReport(rxSigReport1);
-
-        RXSigMeasReport rxSigMeasReport = new RXSigMeasReport();
-        rxSigMeasReport.setCrnti(crnti);
-        rxSigMeasReport.setEcgi(ecgi);
-        rxSigMeasReport.setCellMeasReports(cellMeasReports);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setRXSigMeasReport(rxSigMeasReport);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("4");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(18);
-        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/samplemessages/RadioReportPerCell.java b/src/main/java/org.onosproject.xran/samplemessages/RadioReportPerCell.java
deleted file mode 100644
index 9f6218b..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/RadioReportPerCell.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.types.BerInteger;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class RadioReportPerCell {
-    public XrancPdu setPacketProperties(XrancPdu recv_pdu) {
-
-        ECGI ecgi = recv_pdu.getBody().getL2MeasConfig().getEcgi();
-        RadioMeasReportPerCell.PuschIntfPowerHist puschIntfPowerHist = new RadioMeasReportPerCell.PuschIntfPowerHist();
-        puschIntfPowerHist.setBerInteger(new BerInteger(1));
-        puschIntfPowerHist.setBerInteger(new BerInteger(2));
-        puschIntfPowerHist.setBerInteger(new BerInteger(3));
-        puschIntfPowerHist.setBerInteger(new BerInteger(4));
-        puschIntfPowerHist.setBerInteger(new BerInteger(5));
-        puschIntfPowerHist.setBerInteger(new BerInteger(6));
-        puschIntfPowerHist.setBerInteger(new BerInteger(7));
-        puschIntfPowerHist.setBerInteger(new BerInteger(8));
-        puschIntfPowerHist.setBerInteger(new BerInteger(9));
-        puschIntfPowerHist.setBerInteger(new BerInteger(10));
-        puschIntfPowerHist.setBerInteger(new BerInteger(11));
-        puschIntfPowerHist.setBerInteger(new BerInteger(12));
-        puschIntfPowerHist.setBerInteger(new BerInteger(13));
-        puschIntfPowerHist.setBerInteger(new BerInteger(14));
-        puschIntfPowerHist.setBerInteger(new BerInteger(15));
-        puschIntfPowerHist.setBerInteger(new BerInteger(16));
-        puschIntfPowerHist.setBerInteger(new BerInteger(17));
-
-        RadioMeasReportPerCell.PucchIntfPowerHist pucchIntfPowerHist = new RadioMeasReportPerCell.PucchIntfPowerHist();
-        pucchIntfPowerHist.setBerInteger(new BerInteger(1));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(2));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(3));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(4));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(5));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(6));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(7));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(8));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(9));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(10));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(11));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(12));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(13));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(14));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(15));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(16));
-        pucchIntfPowerHist.setBerInteger(new BerInteger(17));
-
-        RadioMeasReportPerCell radioMeasReportPerCell = new RadioMeasReportPerCell();
-        radioMeasReportPerCell.setEcgi(ecgi);
-        radioMeasReportPerCell.setPuschIntfPowerHist(puschIntfPowerHist);
-        radioMeasReportPerCell.setPucchIntfPowerHist(pucchIntfPowerHist);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setRadioMeasReportPerCell(radioMeasReportPerCell);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("4");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(21);
-        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/samplemessages/RadioReportPerUE.java b/src/main/java/org.onosproject.xran/samplemessages/RadioReportPerUE.java
deleted file mode 100644
index 003d973..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/RadioReportPerUE.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.types.BerInteger;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class RadioReportPerUE {
-
-    public XrancPdu setPacketProperties(XrancPdu recv_pdu) {
-        ECGI ecgi = recv_pdu.getBody().getL2MeasConfig().getEcgi();
-
-        //Need to get this from UE.
-        CRNTI crnti = new CRNTI(new byte[]{(byte) 0x44, (byte) 0x44}, 16);
-        RadioRepPerServCell radioRepPerServCell = new RadioRepPerServCell();
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setPci(new PhysCellId(500));
-        pciarfcn.setEarfcnDl(new ARFCNValue(2100));
-        radioRepPerServCell.setPciArfcn(pciarfcn);
-
-        RadioRepPerServCell.CqiHist cqiHist = new RadioRepPerServCell.CqiHist();
-        cqiHist.setBerInteger(new BerInteger(1));
-        cqiHist.setBerInteger(new BerInteger(2));
-        cqiHist.setBerInteger(new BerInteger(3));
-        cqiHist.setBerInteger(new BerInteger(4));
-        cqiHist.setBerInteger(new BerInteger(5));
-        cqiHist.setBerInteger(new BerInteger(6));
-        cqiHist.setBerInteger(new BerInteger(7));
-        cqiHist.setBerInteger(new BerInteger(8));
-        cqiHist.setBerInteger(new BerInteger(9));
-        cqiHist.setBerInteger(new BerInteger(10));
-        cqiHist.setBerInteger(new BerInteger(11));
-        cqiHist.setBerInteger(new BerInteger(12));
-        cqiHist.setBerInteger(new BerInteger(13));
-        cqiHist.setBerInteger(new BerInteger(14));
-        cqiHist.setBerInteger(new BerInteger(15));
-        cqiHist.setBerInteger(new BerInteger(16));
-        radioRepPerServCell.setCqiHist(cqiHist);
-
-        RadioRepPerServCell.RiHist riHist = new RadioRepPerServCell.RiHist();
-        riHist.setBerInteger(new BerInteger(1));
-        riHist.setBerInteger(new BerInteger(1));
-        radioRepPerServCell.setRiHist(riHist);
-
-        RadioRepPerServCell.PuschSinrHist puschSinrHist = new RadioRepPerServCell.PuschSinrHist();
-        puschSinrHist.setBerInteger(new BerInteger(1));
-        puschSinrHist.setBerInteger(new BerInteger(2));
-        puschSinrHist.setBerInteger(new BerInteger(3));
-        puschSinrHist.setBerInteger(new BerInteger(4));
-        puschSinrHist.setBerInteger(new BerInteger(5));
-        puschSinrHist.setBerInteger(new BerInteger(6));
-        puschSinrHist.setBerInteger(new BerInteger(7));
-        puschSinrHist.setBerInteger(new BerInteger(8));
-        puschSinrHist.setBerInteger(new BerInteger(9));
-        puschSinrHist.setBerInteger(new BerInteger(10));
-        puschSinrHist.setBerInteger(new BerInteger(11));
-        puschSinrHist.setBerInteger(new BerInteger(12));
-        puschSinrHist.setBerInteger(new BerInteger(13));
-        puschSinrHist.setBerInteger(new BerInteger(14));
-        radioRepPerServCell.setPuschSinrHist(puschSinrHist);
-
-        RadioRepPerServCell.PucchSinrHist pucchSinrHist = new RadioRepPerServCell.PucchSinrHist();
-        pucchSinrHist.setBerInteger(new BerInteger(1));
-        pucchSinrHist.setBerInteger(new BerInteger(2));
-        pucchSinrHist.setBerInteger(new BerInteger(3));
-        pucchSinrHist.setBerInteger(new BerInteger(4));
-        pucchSinrHist.setBerInteger(new BerInteger(5));
-        pucchSinrHist.setBerInteger(new BerInteger(6));
-        pucchSinrHist.setBerInteger(new BerInteger(7));
-        pucchSinrHist.setBerInteger(new BerInteger(8));
-        pucchSinrHist.setBerInteger(new BerInteger(9));
-        pucchSinrHist.setBerInteger(new BerInteger(10));
-        pucchSinrHist.setBerInteger(new BerInteger(11));
-        pucchSinrHist.setBerInteger(new BerInteger(12));
-        pucchSinrHist.setBerInteger(new BerInteger(13));
-        pucchSinrHist.setBerInteger(new BerInteger(14));
-        radioRepPerServCell.setPucchSinrHist(pucchSinrHist);
-
-
-        RadioMeasReportPerUE.RadioReportServCells radioReportServCells = new RadioMeasReportPerUE.RadioReportServCells();
-        radioReportServCells.setRadioRepPerServCell(radioRepPerServCell);
-
-        RadioMeasReportPerUE radioMeasReportPerUE = new RadioMeasReportPerUE();
-        radioMeasReportPerUE.setRadioReportServCells(radioReportServCells);
-        radioMeasReportPerUE.setCrnti(crnti);
-        radioMeasReportPerUE.setEcgi(ecgi);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setRadioMeasReportPerUE(radioMeasReportPerUE);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("4");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        XrancApiID apiID = new XrancApiID(20);
-        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/samplemessages/SchedReportPerCell.java b/src/main/java/org.onosproject.xran/samplemessages/SchedReportPerCell.java
deleted file mode 100644
index 43ccecc..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/SchedReportPerCell.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-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.pdu.*;
-import org.openmuc.jasn1.ber.types.BerInteger;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class SchedReportPerCell {
-
-    public XrancPdu setPacketProperties(XrancPdu recv_pdu) {
-        ECGI ecgi = recv_pdu.getBody().getL2MeasConfig().getEcgi();
-
-        SchedMeasReportPerCell.QciVals qciVals = new SchedMeasReportPerCell.QciVals();
-        qciVals.setQCI(new QCI(1));
-        qciVals.setQCI(new QCI(2));
-
-        PRBUsage pcell = new PRBUsage();
-        PRBUsage.PrbUsageDl prbUsageDl = new PRBUsage.PrbUsageDl();
-        prbUsageDl.setBerInteger(new BerInteger(50));
-        prbUsageDl.setBerInteger(new BerInteger(100));
-        pcell.setPrbUsageDl(prbUsageDl);
-
-        PRBUsage.PrbUsageUl prbUsageUl = new PRBUsage.PrbUsageUl();
-        prbUsageUl.setBerInteger(new BerInteger(50));
-        prbUsageUl.setBerInteger(new BerInteger(100));
-        pcell.setPrbUsageUl(prbUsageUl);
-
-        PRBUsage scell = new PRBUsage();
-        prbUsageDl.setBerInteger(new BerInteger(50));
-        prbUsageDl.setBerInteger(new BerInteger(100));
-        scell.setPrbUsageDl(prbUsageDl);
-
-        prbUsageUl.setBerInteger(new BerInteger(50));
-        prbUsageUl.setBerInteger(new BerInteger(100));
-        scell.setPrbUsageUl(prbUsageUl);
-
-        SchedMeasReportPerCell schedMeasReportPerCell = new SchedMeasReportPerCell();
-        schedMeasReportPerCell.setEcgi(ecgi);
-        schedMeasReportPerCell.setQciVals(qciVals);
-        schedMeasReportPerCell.setPrbUsagePcell(pcell);
-        schedMeasReportPerCell.setPrbUsageScell(scell);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setSchedMeasReportPerCell(schedMeasReportPerCell);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("4");
-        } 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/samplemessages/SchedReportPerUE.java b/src/main/java/org.onosproject.xran/samplemessages/SchedReportPerUE.java
deleted file mode 100644
index 5e7676c..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/SchedReportPerUE.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.types.BerInteger;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class SchedReportPerUE {
-
-    public XrancPdu setPacketProperties(XrancPdu recv_pdu) {
-        ECGI ecgi = recv_pdu.getBody().getL2MeasConfig().getEcgi();
-
-        //Need to get this from UE.
-        CRNTI crnti = new CRNTI(new byte[]{(byte) 0x44, (byte) 0x44}, 16);
-
-        SchedMeasRepPerServCell schedMeasRepPerServCell = new SchedMeasRepPerServCell();
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setPci(new PhysCellId(500));
-        pciarfcn.setEarfcnDl(new ARFCNValue(2100));
-
-        SchedMeasRepPerServCell.QciVals qciVals = new SchedMeasRepPerServCell.QciVals();
-        qciVals.setQCI(new QCI(1));
-        qciVals.setQCI(new QCI(2));
-
-        PRBUsage prbUsage = new PRBUsage();
-        PRBUsage.PrbUsageDl prbUsageDl = new PRBUsage.PrbUsageDl();
-        prbUsageDl.setBerInteger(new BerInteger(50));
-        prbUsageDl.setBerInteger(new BerInteger(100));
-        prbUsage.setPrbUsageDl(prbUsageDl);
-
-        PRBUsage.PrbUsageUl prbUsageUl = new PRBUsage.PrbUsageUl();
-        prbUsageUl.setBerInteger(new BerInteger(50));
-        prbUsageUl.setBerInteger(new BerInteger(100));
-        prbUsage.setPrbUsageUl(prbUsageUl);
-
-        SchedMeasRepPerServCell.McsDl mcsDl = new SchedMeasRepPerServCell.McsDl();
-        mcsDl.setBerInteger(new BerInteger(1));
-        mcsDl.setBerInteger(new BerInteger(4));
-
-        SchedMeasRepPerServCell.McsUl mcsUl = new SchedMeasRepPerServCell.McsUl();
-        mcsUl.setBerInteger(new BerInteger(5));
-        mcsUl.setBerInteger(new BerInteger(6));
-
-        SchedMeasRepPerServCell.NumSchedTtisDl numSchedTtisDl = new SchedMeasRepPerServCell.NumSchedTtisDl();
-        numSchedTtisDl.setBerInteger(new BerInteger(1000));
-        numSchedTtisDl.setBerInteger(new BerInteger(1000));
-
-        SchedMeasRepPerServCell.NumSchedTtisUl numSchedTtisUl = new SchedMeasRepPerServCell.NumSchedTtisUl();
-        numSchedTtisUl.setBerInteger(new BerInteger(1000));
-        numSchedTtisUl.setBerInteger(new BerInteger(1000));
-
-        SchedMeasRepPerServCell.RankDl1 rankDl1 = new SchedMeasRepPerServCell.RankDl1();
-        rankDl1.setBerInteger(new BerInteger(1));
-        rankDl1.setBerInteger(new BerInteger(1));
-
-        SchedMeasRepPerServCell.RankDl2 rankDl2 = new SchedMeasRepPerServCell.RankDl2();
-        rankDl2.setBerInteger(new BerInteger(1));
-        rankDl2.setBerInteger(new BerInteger(1));
-
-        schedMeasRepPerServCell.setPciArfcn(pciarfcn);
-        schedMeasRepPerServCell.setQciVals(qciVals);
-        schedMeasRepPerServCell.setPrbUsage(prbUsage);
-        schedMeasRepPerServCell.setMcsDl(mcsDl);
-        schedMeasRepPerServCell.setMcsUl(mcsUl);
-        schedMeasRepPerServCell.setNumSchedTtisDl(numSchedTtisDl);
-        schedMeasRepPerServCell.setNumSchedTtisUl(numSchedTtisUl);
-        schedMeasRepPerServCell.setRankDl1(rankDl1);
-        schedMeasRepPerServCell.setRankDl2(rankDl2);
-
-        SchedMeasReportPerUE.SchedReportServCells schedReportServCells = new SchedMeasReportPerUE.SchedReportServCells();
-        schedReportServCells.setSchedMeasRepPerServCell(schedMeasRepPerServCell);
-
-        SchedMeasReportPerUE schedMeasReportPerUE = new SchedMeasReportPerUE();
-        schedMeasReportPerUE.setCrnti(crnti);
-        schedMeasReportPerUE.setEcgi(ecgi);
-        schedMeasReportPerUE.setSchedReportServCells(schedReportServCells);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setSchedMeasReportPerUE(schedMeasReportPerUE);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("4");
-        } 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;
-
-
-    }
-}
diff --git a/src/main/java/org.onosproject.xran/samplemessages/SignalMeasConfig.java b/src/main/java/org.onosproject.xran/samplemessages/SignalMeasConfig.java
deleted file mode 100644
index b7f5eaa..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/SignalMeasConfig.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class SignalMeasConfig {
-    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("4");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-        XrancApiID apiID = new XrancApiID(17);
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setHdr(hdr);
-        pdu.setBody(body);
-
-        return pdu;
-    }
-
-    public XrancPdu setPacketProperties() {
-        CRNTI crnti = new CRNTI(new byte[]{(byte) 0x44, (byte) 0x44});
-
-        PLMNIdentity plmnIdentity = new PLMNIdentity(new byte[]{(byte) 0xFC, (byte) 0xFF, (byte) 0x3F});
-        EUTRANCellIdentifier eutranCellIdentifier = new EUTRANCellIdentifier(new byte[]{
-                (byte) 0xCF, (byte) 0xFE, (byte) 0x7C, (byte) 0xF0
-        }, 28);
-
-        ECGI ecgi = new ECGI();
-        ecgi.setPLMNIdentity(plmnIdentity);
-        ecgi.setEUTRANcellIdentifier(eutranCellIdentifier);
-
-        RXSigRepQty rxSigRepQty = new RXSigRepQty(2);
-        PCIARFCN pciarfcn = new PCIARFCN();
-        pciarfcn.setPci(new PhysCellId(500));
-        pciarfcn.setEarfcnDl(new ARFCNValue(2100));
-        RXSigMeasConfig.MeasCells measCells = new RXSigMeasConfig.MeasCells();
-        measCells.setPCIARFCN(pciarfcn);
-        RXSigMeasRepInterval repInterval = new RXSigMeasRepInterval(1);
-
-
-        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("4");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-        XrancApiID apiID = new XrancApiID(17);
-        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/samplemessages/UEAdmEncoderDecoder.java b/src/main/java/org.onosproject.xran/samplemessages/UEAdmEncoderDecoder.java
deleted file mode 100644
index 7110b2c..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/UEAdmEncoderDecoder.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-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.pdu.*;
-import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class UEAdmEncoderDecoder {
-
-    private int flag;
-    private BerByteArrayOutputStream os;
-    private XrancPdu pdu;
-
-    public UEAdmEncoderDecoder() {
-        os = new BerByteArrayOutputStream(4096);
-    }
-
-    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti) {
-        AdmEstResponse response = new AdmEstResponse(0);
-
-        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("4");
-        } 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 XrancPdu setPacketProperties(UEAdmissionRequest pdu_decoded) {
-        /*XrancPdu pdu_decoded = new XrancPdu();
-        byte[] bytearray = DatatypeConverter.parseHexBinary(decodedString);
-        InputStream inputStream = new ByteArrayInputStream(bytearray);
-        try {
-            pdu_decoded.decode(inputStream);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }*/
-        CRNTI crnti = pdu_decoded.getCrnti();
-        ECGI ecgi = pdu_decoded.getEcgi();
-
-        AdmEstResponse response = new AdmEstResponse(1);
-        /*if (flag == 1) {
-            response = new AdmEstResponse(0);
-        } else {
-            response = new AdmEstResponse(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("4");
-        } 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/samplemessages/UEAdmRequest.java b/src/main/java/org.onosproject.xran/samplemessages/UEAdmRequest.java
deleted file mode 100644
index e47f366..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/UEAdmRequest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.*;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class UEAdmRequest {
-
-    BerByteArrayOutputStream os;
-
-    public UEAdmRequest() {
-        os = new BerByteArrayOutputStream(4096);
-    }
-
-    /*public String encodeResponse() {
-        pdu = setPacketProperties();
-        try {
-            pdu.encode(os);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return DatatypeConverter.printHexBinary(os.getArray());
-    }*/
-
-    public XrancPdu setPacketProperties() throws UnsupportedEncodingException {
-        CRNTI crnti = new CRNTI(new byte[]{(byte) 0x44, (byte) 0x44}, 16);
-
-        PLMNIdentity plmnIdentity = new PLMNIdentity(new byte[]{(byte) 0x22, (byte) 0x08, (byte) 0x41});
-        EUTRANCellIdentifier eutranCellIdentifier = new EUTRANCellIdentifier(new byte[]{
-                (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xF0
-        }, 28);
-
-        ECGI ecgi = new ECGI();
-        ecgi.setPLMNIdentity(plmnIdentity);
-        ecgi.setEUTRANcellIdentifier(eutranCellIdentifier);
-
-        AdmEstCause admEstCause = new AdmEstCause(4);
-
-        UEAdmissionRequest admissionRequest = new UEAdmissionRequest();
-
-        admissionRequest.setCrnti(crnti);
-        admissionRequest.setEcgi(ecgi);
-        admissionRequest.setAdmEstCause(admEstCause);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setUEAdmissionRequest(admissionRequest);
-
-        BerUTF8String ver = new BerUTF8String("4");
-
-        XrancApiID apiID = new XrancApiID(2);
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setHdr(hdr);
-        pdu.setBody(body);
-
-        return pdu;
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/samplemessages/UECapabilityEnq.java b/src/main/java/org.onosproject.xran/samplemessages/UECapabilityEnq.java
deleted file mode 100644
index 1ea246f..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/UECapabilityEnq.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.onosproject.xran.samplemessages;
-
-import org.onosproject.xran.codecs.api.CRNTI;
-import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.pdu.*;
-import org.openmuc.jasn1.ber.types.string.BerUTF8String;
-
-import java.io.UnsupportedEncodingException;
-
-public class UECapabilityEnq {
-
-    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("4");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-        XrancApiID apiID = new XrancApiID(12);
-        XrancPduHdr hdr = new XrancPduHdr();
-        hdr.setVer(ver);
-        hdr.setApiId(apiID);
-
-        XrancPdu pdu = new XrancPdu();
-        pdu.setHdr(hdr);
-        pdu.setBody(body);
-
-        return pdu;
-    }
-
-    public XrancPdu setPacketProperties(XrancPdu mainDecoder) {
-        CRNTI crnti = mainDecoder.getBody().getUECapabilityEnquiry().getCrnti();
-
-        //TODO: ECGI Value has to be read as CELL ID.
-        ECGI ecgi = mainDecoder.getBody().getUECapabilityEnquiry().getEcgi();
-
-        UECapabilityEnquiry capabilityEnquiry = new UECapabilityEnquiry();
-        capabilityEnquiry.setCrnti(crnti);
-        capabilityEnquiry.setEcgi(ecgi);
-
-        XrancPduBody body = new XrancPduBody();
-        body.setUECapabilityEnquiry(capabilityEnquiry);
-
-        BerUTF8String ver = null;
-        try {
-            ver = new BerUTF8String("4");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-        XrancApiID apiID = new XrancApiID(12);
-        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/samplemessages/package-info.java b/src/main/java/org.onosproject.xran/samplemessages/package-info.java
deleted file mode 100644
index 175bb66..0000000
--- a/src/main/java/org.onosproject.xran/samplemessages/package-info.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * 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.samplemessages;
\ No newline at end of file
diff --git a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
index 4acf0ae..862acf6 100644
--- a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
+++ b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
@@ -121,7 +121,7 @@
         Optional<RnibLink> primary = linksByUeId.stream().filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY)).findFirst();
 
         if (primary.isPresent()) {
-            return primary.get().getLinkId().getSourceId();
+            return primary.get().getLinkId().getEcgi();
         }
         return null;
     }
