diff --git a/src/main/java/org.onosproject.xran/entities/RnibCell.java b/src/main/java/org.onosproject.xran/entities/RnibCell.java
index 81aeafd..e56b6b1 100644
--- a/src/main/java/org.onosproject.xran/entities/RnibCell.java
+++ b/src/main/java/org.onosproject.xran/entities/RnibCell.java
@@ -55,8 +55,10 @@
 
     public RnibCell() {
         prbUsage = new PrbUsageContainer();
-        setDefaultRRMConf();
         version = "3";
+
+        rrmConfig = new RRMConfig();
+        rrmConfig.setEcgi(ecgi);
     }
 
     public static URI uri(ECGI ecgi) {
@@ -109,45 +111,6 @@
         this.prbUsage = prbUsage;
     }
 
-    private void setDefaultRRMConf() {
-        rrmConfig = new RRMConfig();
-
-        rrmConfig.setEcgi(ecgi);
-
-        RRMConfig.StartPrbDl startPrbDl = new RRMConfig.StartPrbDl();
-        startPrbDl.addBerInteger(new BerInteger(0));
-        startPrbDl.addBerInteger(new BerInteger(50));
-
-        rrmConfig.setStartPrbDl(startPrbDl);
-
-        RRMConfig.StartPrbUl startPrbUl = new RRMConfig.StartPrbUl();
-        startPrbUl.addBerInteger(new BerInteger(50));
-        startPrbUl.addBerInteger(new BerInteger(100));
-
-        rrmConfig.setStartPrbUl(startPrbUl);
-
-        RRMConfig.EndPrbDl endPrbDl = new RRMConfig.EndPrbDl();
-        endPrbDl.addBerInteger(new BerInteger(50));
-        endPrbDl.addBerInteger(new BerInteger(100));
-
-        rrmConfig.setEndPrbDl(endPrbDl);
-
-        RRMConfig.EndPrbUl endPrbUl = new RRMConfig.EndPrbUl();
-        endPrbUl.addBerInteger(new BerInteger(50));
-        endPrbUl.addBerInteger(new BerInteger(100));
-
-        rrmConfig.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);
-
-        rrmConfig.setSubframeBitmaskDl(subframeBitmaskDl);
-    }
-
     public ECGI getEcgi() {
         return ecgi;
     }
@@ -177,7 +140,7 @@
             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()) {
+                    if (ueList.size() == start_prb_dl.size()) {
                         List<BerInteger> collect = Stream.of(start_prb_dl)
                                 .map(val -> new BerInteger(val.asInt()))
                                 .collect(Collectors.toList());
@@ -193,7 +156,7 @@
             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()) {
+                    if (ueList.size() == end_prb_dl.size()) {
                         List<BerInteger> collect = Stream.of(end_prb_dl)
                                 .map(val -> new BerInteger(val.asInt()))
                                 .collect(Collectors.toList());
@@ -209,7 +172,7 @@
             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()) {
+                    if (ueList.size() == start_prb_ul.size()) {
                         List<BerInteger> collect = Stream.of(start_prb_ul)
                                 .map(val -> new BerInteger(val.asInt()))
                                 .collect(Collectors.toList());
@@ -225,7 +188,7 @@
             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()) {
+                    if (ueList.size() == end_prb_ul.size()) {
                         List<BerInteger> collect = Stream.of(end_prb_ul)
                                 .map(val -> new BerInteger(val.asInt()))
                                 .collect(Collectors.toList());
@@ -237,8 +200,6 @@
         }
 
         rrmConfig.setCrnti(crnti);
-
-        // TODO
     }
 
     public SchedMeasReportPerCell.QciVals getQci() {
diff --git a/src/main/java/org.onosproject.xran/entities/RnibLink.java b/src/main/java/org.onosproject.xran/entities/RnibLink.java
index 8af1644..9b024b9 100644
--- a/src/main/java/org.onosproject.xran/entities/RnibLink.java
+++ b/src/main/java/org.onosproject.xran/entities/RnibLink.java
@@ -17,6 +17,7 @@
 package org.onosproject.xran.entities;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Lists;
 import org.onosproject.xran.codecs.api.*;
 import org.onosproject.xran.codecs.pdu.PDCPMeasReportPerUe;
 import org.onosproject.xran.codecs.pdu.RRMConfig;
@@ -65,7 +66,11 @@
 
         linkId = LinkId.valueOf(cell, ue);
 
-        setDefaultRRMConf();
+        rrmParameters = new RRMConfig();
+        RRMConfig.Crnti crnti = new RRMConfig.Crnti();
+        crnti.addCRNTI(linkId.getUe().getRanId());
+        rrmParameters.setCrnti(crnti);
+        rrmParameters.setEcgi(linkId.getEcgi());
     }
 
     public Timer getTimer() {
@@ -133,70 +138,56 @@
 
     public void modifyRrmParameters(JsonNode rrmConfigNode) {
         {
-            JsonNode start_prb_dl = rrmConfigNode.get("start_prb_dl");
-            if (start_prb_dl != null) {
+            JsonNode start_prb_dl = rrmConfigNode.path("start_prb_dl");
+            if (!start_prb_dl.isMissingNode()) {
                 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);
-                    }
-                }
+
+                List<BerInteger> collect = Lists.newArrayList();
+                collect.add(new BerInteger(start_prb_dl.asInt()));
+                startPrbDl.setSeqOf(collect);
+
                 rrmParameters.setStartPrbDl(startPrbDl);
             }
         }
 
         {
             JsonNode end_prb_dl = rrmConfigNode.get("end_prb_dl");
-            if (end_prb_dl != null) {
+            if (!end_prb_dl.isMissingNode()) {
                 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);
-                    }
-                }
+
+                List<BerInteger> collect = Lists.newArrayList();
+                collect.add(new BerInteger(end_prb_dl.asInt()));
+                endPrbDl.setSeqOf(collect);
+
                 rrmParameters.setEndPrbDl(endPrbDl);
             }
         }
 
         {
             JsonNode start_prb_ul = rrmConfigNode.get("start_prb_ul");
-            if (start_prb_ul != null) {
+            if (!start_prb_ul.isMissingNode()) {
                 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);
-                    }
-                }
+
+                List<BerInteger> collect = Lists.newArrayList();
+                collect.add(new BerInteger(start_prb_ul.asInt()));
+                startPrbUl.setSeqOf(collect);
+
                 rrmParameters.setStartPrbUl(startPrbUl);
             }
         }
 
         {
             JsonNode end_prb_ul = rrmConfigNode.get("end_prb_ul");
-            if (end_prb_ul != null) {
+            if (!end_prb_ul.isMissingNode()) {
                 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);
-                    }
-                }
+
+                List<BerInteger> collect = Lists.newArrayList();
+                collect.add(new BerInteger(end_prb_ul.asInt()));
+                endPrbUl.setSeqOf(collect);
+
                 rrmParameters.setEndPrbUl(endPrbUl);
             }
         }
-
-        // TODO
     }
 
     public PDCPThroughput getPdcpThroughput() {
@@ -223,50 +214,6 @@
         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();
@@ -307,10 +254,16 @@
             }
         },
         // TODO: Add CA/DC
-        SERVING_SECONDARY("serving/secondary") {
+        SERVING_SECONDARY_CA("serving/secondary/ca") {
             @Override
             public String toString() {
-                return "\"serving/secondary\"";
+                return "\"serving/secondary/ca\"";
+            }
+        },
+        SERVING_SECONDARY_DC("serving/secondary/dc") {
+            @Override
+            public String toString() {
+                return "\"serving/secondary/dc\"";
             }
         },
         NON_SERVING("non-serving") {
