diff --git a/src/main/java/org.onosproject.xran/samplemessages/BearerEncoderDecoder.java b/src/main/java/org.onosproject.xran/samplemessages/BearerEncoderDecoder.java
new file mode 100644
index 0000000..0252451
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/BearerEncoderDecoder.java
@@ -0,0 +1,100 @@
+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
new file mode 100644
index 0000000..ad74aab
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/ConfigEncoderDecoder.java
@@ -0,0 +1,103 @@
+/*
+ * 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
new file mode 100644
index 0000000..5ab504e
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/ConfigReport.java
@@ -0,0 +1,106 @@
+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/L2MeasConf.java b/src/main/java/org.onosproject.xran/samplemessages/L2MeasConf.java
new file mode 100644
index 0000000..5fa3087
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/L2MeasConf.java
@@ -0,0 +1,81 @@
+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
new file mode 100644
index 0000000..2400cde
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/PDCPReportPerUE.java
@@ -0,0 +1,96 @@
+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/RXSigMeasRep.java b/src/main/java/org.onosproject.xran/samplemessages/RXSigMeasRep.java
new file mode 100644
index 0000000..e59b399
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/RXSigMeasRep.java
@@ -0,0 +1,61 @@
+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
new file mode 100644
index 0000000..9f6218b
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/RadioReportPerCell.java
@@ -0,0 +1,78 @@
+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
new file mode 100644
index 0000000..003d973
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/RadioReportPerUE.java
@@ -0,0 +1,112 @@
+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
new file mode 100644
index 0000000..43ccecc
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/SchedReportPerCell.java
@@ -0,0 +1,69 @@
+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
new file mode 100644
index 0000000..5e7676c
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/SchedReportPerUE.java
@@ -0,0 +1,103 @@
+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
new file mode 100644
index 0000000..b7f5eaa
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/SignalMeasConfig.java
@@ -0,0 +1,93 @@
+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
new file mode 100644
index 0000000..0ec5ce6
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/UEAdmEncoderDecoder.java
@@ -0,0 +1,95 @@
+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(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;
+    }
+
+    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
new file mode 100644
index 0000000..e47f366
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/UEAdmRequest.java
@@ -0,0 +1,65 @@
+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
new file mode 100644
index 0000000..1ea246f
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/UECapabilityEnq.java
@@ -0,0 +1,68 @@
+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
new file mode 100644
index 0000000..175bb66
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/samplemessages/package-info.java
@@ -0,0 +1,17 @@
+/*
+ * 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
