initial commit
diff --git a/src/main/java/org.onosproject.xran/entities/RnibCell.java b/src/main/java/org.onosproject.xran/entities/RnibCell.java
new file mode 100644
index 0000000..3aa5c89
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/entities/RnibCell.java
@@ -0,0 +1,171 @@
+/*
+ * 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.entities;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.onosproject.net.DeviceId;
+import org.onosproject.xran.codecs.api.ECGI;
+import org.onosproject.xran.codecs.api.MMEUES1APID;
+import org.onosproject.xran.codecs.api.PRBUsage;
+import org.onosproject.xran.codecs.pdu.CellConfigReport;
+import org.onosproject.xran.codecs.pdu.L2MeasConfig;
+import org.onosproject.xran.codecs.pdu.RRMConfig;
+import org.onosproject.xran.codecs.pdu.SchedMeasReportPerCell;
+import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
+
+import javax.xml.bind.DatatypeConverter;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * Created by dimitris on 7/22/17.
+ */
+public class RnibCell {
+    private static final String SCHEME = "xran";
+
+    private ECGI ecgi;
+    private CellConfigReport conf;
+    private PrbUsageContainer prbUsage;
+    private SchedMeasReportPerCell.QciVals qci;
+    private RRMConfig rrmConfig;
+    private L2MeasConfig measConfig;
+
+    public RnibCell() {
+        prbUsage = new PrbUsageContainer();
+    }
+
+    public static URI uri(ECGI ecgi) {
+        if (ecgi != null) {
+            try {
+                BerByteArrayOutputStream os = new BerByteArrayOutputStream(4096);
+                ecgi.encode(os);
+                String message = DatatypeConverter.printHexBinary(os.getArray());
+                return new URI(SCHEME, message, null);
+            } catch (URISyntaxException | IOException e) {
+                return null;
+            }
+        }
+        return null;
+    }
+
+    public static ECGI decodeDeviceId(DeviceId deviceId) throws IOException {
+        String uri = deviceId.toString();
+        String hexEcgi = uri.substring(uri.lastIndexOf("xran:") + 5);
+
+        ECGI ecgi = new ECGI();
+        byte[] bytearray = DatatypeConverter.parseHexBinary(hexEcgi);
+        InputStream inputStream = new ByteArrayInputStream(bytearray);
+
+        ecgi.decode(inputStream);
+        return ecgi;
+    }
+
+    public ECGI getEcgi() {
+        return ecgi;
+    }
+
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
+
+    public CellConfigReport getConf() {
+        return conf;
+    }
+
+    public void setConf(CellConfigReport conf) {
+        this.conf = conf;
+    }
+
+    public RRMConfig getRrmConfig() {
+        return rrmConfig;
+    }
+
+    public void modifyRrmConfig(JsonNode rrmConfig) {
+        // TODO
+    }
+
+    public SchedMeasReportPerCell.QciVals getQci() {
+        return qci;
+    }
+
+    public void setQci(SchedMeasReportPerCell.QciVals qci) {
+        this.qci = qci;
+    }
+
+    public void setPrimaryPrbUsage(PRBUsage primary) {
+        this.prbUsage.primary = primary;
+    }
+
+    public void setSecondaryPrbUsage(PRBUsage secondary) {
+        this.prbUsage.secondary = secondary;
+    }
+
+    public L2MeasConfig getMeasConfig() {
+        return measConfig;
+    }
+
+    public void setMeasConfig(L2MeasConfig measConfig) {
+        this.measConfig = measConfig;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("{\n")
+                .append(ecgi != null ? "\"ecgi\":" + ecgi : "")
+                .append(conf != null ? ",\n\"config-report\":" + conf : "")
+                .append(prbUsage != null ? ",\n\"prb-usage\":" + prbUsage : "")
+                .append(qci != null ? ",\n\"qci-vals\":" + qci : "")
+                .append(rrmConfig != null ? ",\n\"rrm-config\":" + rrmConfig : "")
+                .append(measConfig != null ? ",\n\"l2-meas-config\":" + measConfig : "")
+                .append("\n}\n");
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        RnibCell rnibCell = (RnibCell) o;
+
+        return ecgi.equals(rnibCell.ecgi);
+    }
+
+    @Override
+    public int hashCode() {
+        return ecgi.hashCode();
+    }
+
+    class PrbUsageContainer {
+        PRBUsage primary;
+        PRBUsage secondary;
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("{\n")
+                    .append(primary != null ? "\"primary\":" + primary : "")
+                    .append(secondary != null ? ",\n\"secondary\":" + secondary : "")
+                    .append("\n}\n");
+            return sb.toString();
+        }
+    }
+}