diff --git a/src/main/java/org.onosproject.xran/XranStore.java b/src/main/java/org.onosproject.xran/XranStore.java
index 349e8f5..081f51e 100644
--- a/src/main/java/org.onosproject.xran/XranStore.java
+++ b/src/main/java/org.onosproject.xran/XranStore.java
@@ -47,8 +47,6 @@
 
     RnibLink getLinkBetweenCellIdUeId(String cellId, long euId);
 
-    boolean createLinkBetweenCellIdUeId(String cellId, long euId, String type);
-
     RnibLink getLink(ECGI ecgi, MMEUES1APID mme);
 
     void modifyLinkRrmConf(RnibLink link, JsonNode rrmConf);
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellAdd.java b/src/main/java/org.onosproject.xran/codecs/pdu/ScellAdd.java
index a1d6c8f..3ee1f02 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellAdd.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/ScellAdd.java
@@ -10,321 +10,355 @@
 import org.openmuc.jasn1.ber.BerByteArrayOutputStream;
 import org.openmuc.jasn1.ber.BerLength;
 import org.openmuc.jasn1.ber.BerTag;
+import org.openmuc.jasn1.ber.types.BerBoolean;
+import org.openmuc.jasn1.ber.types.BerEnum;
+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;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
 public class ScellAdd implements Serializable {
 
-	private static final long serialVersionUID = 1L;
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private ScellsProp scellsProp = null;
+    public ScellAdd() {
+    }
+    public ScellAdd(byte[] code) {
+        this.code = code;
+    }
 
-	public static class ScellsProp implements Serializable {
+    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PropScell propScell) {
+        ScellAdd scellAdd = new ScellAdd();
+        scellAdd.setCrnti(crnti);
+        scellAdd.setEcgi(ecgi);
 
-		private static final long serialVersionUID = 1L;
+        propScell.setCrossCarrierSchedEnable(new BerBoolean(true));
+        propScell.setCaDirection(new BerEnum(new BigInteger("dl")));
+        propScell.setDeactTimer(new BerInteger(1000));
+        ScellsProp scellsProp = new ScellsProp();
+        scellsProp.addPropScell(propScell);
+        scellAdd.setScellsProp(scellsProp);
 
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		public byte[] code = null;
-		private List<PropScell> seqOf = null;
+        XrancPduBody body = new XrancPduBody();
+        body.setScellAdd(scellAdd);
 
-		public ScellsProp() {
-			seqOf = new ArrayList<PropScell>();
-		}
+        BerUTF8String ver = null;
+        try {
+            ver = new BerUTF8String("3");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        XrancApiID apiID = new XrancApiID(26);
+        XrancPduHdr hdr = new XrancPduHdr();
+        hdr.setVer(ver);
+        hdr.setApiId(apiID);
 
-		public ScellsProp(byte[] code) {
-			this.code = code;
-		}
+        XrancPdu pdu = new XrancPdu();
+        pdu.setHdr(hdr);
+        pdu.setBody(body);
 
-		public List<PropScell> getPropScell() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<PropScell>();
-			}
-			return seqOf;
-		}
+        return pdu;
+    }
 
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
+    public CRNTI getCrnti() {
+        return crnti;
+    }
 
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
 
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
+    public ECGI getEcgi() {
+        return ecgi;
+    }
 
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
 
-			codeLength += BerLength.encodeLength(os, codeLength);
+    public ScellsProp getScellsProp() {
+        return scellsProp;
+    }
 
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
+    public void setScellsProp(ScellsProp scellsProp) {
+        this.scellsProp = scellsProp;
+    }
 
-			return codeLength;
-		}
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
 
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
 
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
 
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
+        int codeLength = 0;
+        codeLength += scellsProp.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
 
-			while (subCodeLength < totalLength) {
-				PropScell element = new PropScell();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
 
-			}
-			codeLength += subCodeLength;
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
 
-			return codeLength;
-		}
+        codeLength += BerLength.encodeLength(os, codeLength);
 
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
 
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
+        return codeLength;
 
-		public void appendAsString(StringBuilder sb, int indentLevel) {
+    }
 
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            scellsProp = new ScellsProp();
+            subCodeLength += scellsProp.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("\"crnti\": ").append(crnti);
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("\"ecgi\": ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (scellsProp != null) {
+            sb.append("\"scellsProp\": ");
+            scellsProp.appendAsString(sb, indentLevel + 1);
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class ScellsProp implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        public byte[] code = null;
+        private List<PropScell> seqOf = null;
+
+        public ScellsProp() {
+            seqOf = new ArrayList<PropScell>();
+        }
+
+        public ScellsProp(byte[] code) {
+            this.code = code;
+        }
+
+        public List<PropScell> getPropScell() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<PropScell>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                PropScell element = new PropScell();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("[\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
 //				sb.append("null");
-			}
-			else {
-				Iterator<PropScell> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
+            } else {
+                Iterator<PropScell> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    it.next().appendAsString(sb, indentLevel + 1);
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        it.next().appendAsString(sb, indentLevel + 1);
+                    }
+                }
+            }
 
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("]");
+        }
 
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private ScellsProp scellsProp = null;
-	
-	public ScellAdd() {
-	}
-
-	public ScellAdd(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setScellsProp(ScellsProp scellsProp) {
-		this.scellsProp = scellsProp;
-	}
-
-	public ScellsProp getScellsProp() {
-		return scellsProp;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += scellsProp.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			scellsProp = new ScellsProp();
-			subCodeLength += scellsProp.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("\"crnti\": ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("\"ecgi\": ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (scellsProp != null) {
-			sb.append("\"scellsProp\": ");
-			scellsProp.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
+        public void addPropScell(PropScell propScell) {
+            seqOf.add(propScell);
+        }
+    }
 
 }
 
diff --git a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java b/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
index 278c7f6..02dd7d2 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/ScellDelete.java
@@ -10,321 +10,349 @@
 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;
 
 public class ScellDelete implements Serializable {
 
-	private static final long serialVersionUID = 1L;
+    public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+    private static final long serialVersionUID = 1L;
+    public byte[] code = null;
+    private CRNTI crnti = null;
+    private ECGI ecgi = null;
+    private ScellsInd scellsInd = null;
+    public ScellDelete() {
+    }
+    public ScellDelete(byte[] code) {
+        this.code = code;
+    }
 
-	public static class ScellsInd implements Serializable {
+    public static XrancPdu constructPacket(ECGI ecgi, CRNTI crnti, PCIARFCN pciarfcn) {
+        ScellDelete scellDelete = new ScellDelete();
+        scellDelete.setEcgi(ecgi);
+        scellDelete.setCrnti(crnti);
+        ScellsInd scellsInd = new ScellsInd();
+        scellsInd.addPCIARFCN(pciarfcn);
+        scellDelete.setScellsInd(scellsInd);
 
-		private static final long serialVersionUID = 1L;
+        BerUTF8String ver = null;
+        try {
+            ver = new BerUTF8String("3");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
 
-		public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-		public byte[] code = null;
-		private List<PCIARFCN> seqOf = null;
+        XrancApiID apiID = new XrancApiID(28);
+        XrancPduBody body = new XrancPduBody();
+        body.setScellDelete(scellDelete);
 
-		public ScellsInd() {
-			seqOf = new ArrayList<PCIARFCN>();
-		}
+        XrancPduHdr hdr = new XrancPduHdr();
+        hdr.setVer(ver);
+        hdr.setApiId(apiID);
 
-		public ScellsInd(byte[] code) {
-			this.code = code;
-		}
+        XrancPdu pdu = new XrancPdu();
+        pdu.setBody(body);
+        pdu.setHdr(hdr);
 
-		public List<PCIARFCN> getPCIARFCN() {
-			if (seqOf == null) {
-				seqOf = new ArrayList<PCIARFCN>();
-			}
-			return seqOf;
-		}
+        return pdu;
 
-		public int encode(BerByteArrayOutputStream os) throws IOException {
-			return encode(os, true);
-		}
+    }
 
-		public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+    public CRNTI getCrnti() {
+        return crnti;
+    }
 
-			if (code != null) {
-				for (int i = code.length - 1; i >= 0; i--) {
-					os.write(code[i]);
-				}
-				if (withTag) {
-					return tag.encode(os) + code.length;
-				}
-				return code.length;
-			}
+    public void setCrnti(CRNTI crnti) {
+        this.crnti = crnti;
+    }
 
-			int codeLength = 0;
-			for (int i = (seqOf.size() - 1); i >= 0; i--) {
-				codeLength += seqOf.get(i).encode(os, true);
-			}
+    public ECGI getEcgi() {
+        return ecgi;
+    }
 
-			codeLength += BerLength.encodeLength(os, codeLength);
+    public void setEcgi(ECGI ecgi) {
+        this.ecgi = ecgi;
+    }
 
-			if (withTag) {
-				codeLength += tag.encode(os);
-			}
+    public ScellsInd getScellsInd() {
+        return scellsInd;
+    }
 
-			return codeLength;
-		}
+    public void setScellsInd(ScellsInd scellsInd) {
+        this.scellsInd = scellsInd;
+    }
 
-		public int decode(InputStream is) throws IOException {
-			return decode(is, true);
-		}
+    public int encode(BerByteArrayOutputStream os) throws IOException {
+        return encode(os, true);
+    }
 
-		public int decode(InputStream is, boolean withTag) throws IOException {
-			int codeLength = 0;
-			int subCodeLength = 0;
-			if (withTag) {
-				codeLength += tag.decodeAndCheck(is);
-			}
+    public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
 
-			BerLength length = new BerLength();
-			codeLength += length.decode(is);
-			int totalLength = length.val;
+        if (code != null) {
+            for (int i = code.length - 1; i >= 0; i--) {
+                os.write(code[i]);
+            }
+            if (withTag) {
+                return tag.encode(os) + code.length;
+            }
+            return code.length;
+        }
 
-			while (subCodeLength < totalLength) {
-				PCIARFCN element = new PCIARFCN();
-				subCodeLength += element.decode(is, true);
-				seqOf.add(element);
-			}
-			if (subCodeLength != totalLength) {
-				throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+        int codeLength = 0;
+        codeLength += scellsInd.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 2
+        os.write(0xA2);
+        codeLength += 1;
 
-			}
-			codeLength += subCodeLength;
+        codeLength += ecgi.encode(os, false);
+        // write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+        os.write(0xA1);
+        codeLength += 1;
 
-			return codeLength;
-		}
+        codeLength += crnti.encode(os, false);
+        // write tag: CONTEXT_CLASS, PRIMITIVE, 0
+        os.write(0x80);
+        codeLength += 1;
 
-		public void encodeAndSave(int encodingSizeGuess) throws IOException {
-			BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-			encode(os, false);
-			code = os.getArray();
-		}
+        codeLength += BerLength.encodeLength(os, codeLength);
 
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			appendAsString(sb, 0);
-			return sb.toString();
-		}
+        if (withTag) {
+            codeLength += tag.encode(os);
+        }
 
-		public void appendAsString(StringBuilder sb, int indentLevel) {
+        return codeLength;
 
-			sb.append("[\n");
-			for (int i = 0; i < indentLevel + 1; i++) {
-				sb.append("\t");
-			}
-			if (seqOf == null) {
+    }
+
+    public int decode(InputStream is) throws IOException {
+        return decode(is, true);
+    }
+
+    public int decode(InputStream is, boolean withTag) throws IOException {
+        int codeLength = 0;
+        int subCodeLength = 0;
+        BerTag berTag = new BerTag();
+
+        if (withTag) {
+            codeLength += tag.decodeAndCheck(is);
+        }
+
+        BerLength length = new BerLength();
+        codeLength += length.decode(is);
+
+        int totalLength = length.val;
+        codeLength += totalLength;
+
+        subCodeLength += berTag.decode(is);
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
+            crnti = new CRNTI();
+            subCodeLength += crnti.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
+            ecgi = new ECGI();
+            subCodeLength += ecgi.decode(is, false);
+            subCodeLength += berTag.decode(is);
+        } else {
+            throw new IOException("Tag does not match the mandatory sequence element tag.");
+        }
+
+        if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
+            scellsInd = new ScellsInd();
+            subCodeLength += scellsInd.decode(is, false);
+            if (subCodeLength == totalLength) {
+                return codeLength;
+            }
+        }
+        throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
+
+
+    }
+
+    public void encodeAndSave(int encodingSizeGuess) throws IOException {
+        BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+        encode(os, false);
+        code = os.getArray();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        appendAsString(sb, 0);
+        return sb.toString();
+    }
+
+    public void appendAsString(StringBuilder sb, int indentLevel) {
+
+        sb.append("{");
+        sb.append("\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (crnti != null) {
+            sb.append("\"crnti\": ").append(crnti);
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (ecgi != null) {
+            sb.append("\"ecgi\": ");
+            ecgi.appendAsString(sb, indentLevel + 1);
+        }
+
+        sb.append(",\n");
+        for (int i = 0; i < indentLevel + 1; i++) {
+            sb.append("\t");
+        }
+        if (scellsInd != null) {
+            sb.append("\"scellsInd\": ");
+            scellsInd.appendAsString(sb, indentLevel + 1);
+        }
+
+        sb.append("\n");
+        for (int i = 0; i < indentLevel; i++) {
+            sb.append("\t");
+        }
+        sb.append("}");
+    }
+
+    public static class ScellsInd implements Serializable {
+
+        public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
+        private static final long serialVersionUID = 1L;
+        public byte[] code = null;
+        private List<PCIARFCN> seqOf = null;
+
+        public ScellsInd() {
+            seqOf = new ArrayList<PCIARFCN>();
+        }
+
+        public ScellsInd(byte[] code) {
+            this.code = code;
+        }
+
+        public List<PCIARFCN> getPCIARFCN() {
+            if (seqOf == null) {
+                seqOf = new ArrayList<PCIARFCN>();
+            }
+            return seqOf;
+        }
+
+        public int encode(BerByteArrayOutputStream os) throws IOException {
+            return encode(os, true);
+        }
+
+        public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
+
+            if (code != null) {
+                for (int i = code.length - 1; i >= 0; i--) {
+                    os.write(code[i]);
+                }
+                if (withTag) {
+                    return tag.encode(os) + code.length;
+                }
+                return code.length;
+            }
+
+            int codeLength = 0;
+            for (int i = (seqOf.size() - 1); i >= 0; i--) {
+                codeLength += seqOf.get(i).encode(os, true);
+            }
+
+            codeLength += BerLength.encodeLength(os, codeLength);
+
+            if (withTag) {
+                codeLength += tag.encode(os);
+            }
+
+            return codeLength;
+        }
+
+        public int decode(InputStream is) throws IOException {
+            return decode(is, true);
+        }
+
+        public int decode(InputStream is, boolean withTag) throws IOException {
+            int codeLength = 0;
+            int subCodeLength = 0;
+            if (withTag) {
+                codeLength += tag.decodeAndCheck(is);
+            }
+
+            BerLength length = new BerLength();
+            codeLength += length.decode(is);
+            int totalLength = length.val;
+
+            while (subCodeLength < totalLength) {
+                PCIARFCN element = new PCIARFCN();
+                subCodeLength += element.decode(is, true);
+                seqOf.add(element);
+            }
+            if (subCodeLength != totalLength) {
+                throw new IOException("Decoded SequenceOf or SetOf has wrong length. Expected " + totalLength + " but has " + subCodeLength);
+
+            }
+            codeLength += subCodeLength;
+
+            return codeLength;
+        }
+
+        public void encodeAndSave(int encodingSizeGuess) throws IOException {
+            BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
+            encode(os, false);
+            code = os.getArray();
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            appendAsString(sb, 0);
+            return sb.toString();
+        }
+
+        public void appendAsString(StringBuilder sb, int indentLevel) {
+
+            sb.append("[\n");
+            for (int i = 0; i < indentLevel + 1; i++) {
+                sb.append("\t");
+            }
+            if (seqOf == null) {
 //				sb.append("null");
-			}
-			else {
-				Iterator<PCIARFCN> it = seqOf.iterator();
-				if (it.hasNext()) {
-					it.next().appendAsString(sb, indentLevel + 1);
-					while (it.hasNext()) {
-						sb.append(",\n");
-						for (int i = 0; i < indentLevel + 1; i++) {
-							sb.append("\t");
-						}
-						it.next().appendAsString(sb, indentLevel + 1);
-					}
-				}
-			}
+            } else {
+                Iterator<PCIARFCN> it = seqOf.iterator();
+                if (it.hasNext()) {
+                    it.next().appendAsString(sb, indentLevel + 1);
+                    while (it.hasNext()) {
+                        sb.append(",\n");
+                        for (int i = 0; i < indentLevel + 1; i++) {
+                            sb.append("\t");
+                        }
+                        it.next().appendAsString(sb, indentLevel + 1);
+                    }
+                }
+            }
 
-			sb.append("\n");
-			for (int i = 0; i < indentLevel; i++) {
-				sb.append("\t");
-			}
-			sb.append("]");
-		}
+            sb.append("\n");
+            for (int i = 0; i < indentLevel; i++) {
+                sb.append("\t");
+            }
+            sb.append("]");
+        }
 
-	}
-
-	public static final BerTag tag = new BerTag(BerTag.UNIVERSAL_CLASS, BerTag.CONSTRUCTED, 16);
-
-	public byte[] code = null;
-	private CRNTI crnti = null;
-	private ECGI ecgi = null;
-	private ScellsInd scellsInd = null;
-	
-	public ScellDelete() {
-	}
-
-	public ScellDelete(byte[] code) {
-		this.code = code;
-	}
-
-	public void setCrnti(CRNTI crnti) {
-		this.crnti = crnti;
-	}
-
-	public CRNTI getCrnti() {
-		return crnti;
-	}
-
-	public void setEcgi(ECGI ecgi) {
-		this.ecgi = ecgi;
-	}
-
-	public ECGI getEcgi() {
-		return ecgi;
-	}
-
-	public void setScellsInd(ScellsInd scellsInd) {
-		this.scellsInd = scellsInd;
-	}
-
-	public ScellsInd getScellsInd() {
-		return scellsInd;
-	}
-
-	public int encode(BerByteArrayOutputStream os) throws IOException {
-		return encode(os, true);
-	}
-
-	public int encode(BerByteArrayOutputStream os, boolean withTag) throws IOException {
-
-		if (code != null) {
-			for (int i = code.length - 1; i >= 0; i--) {
-				os.write(code[i]);
-			}
-			if (withTag) {
-				return tag.encode(os) + code.length;
-			}
-			return code.length;
-		}
-
-		int codeLength = 0;
-		codeLength += scellsInd.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 2
-		os.write(0xA2);
-		codeLength += 1;
-		
-		codeLength += ecgi.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
-		codeLength += crnti.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 0
-		os.write(0x80);
-		codeLength += 1;
-		
-		codeLength += BerLength.encodeLength(os, codeLength);
-
-		if (withTag) {
-			codeLength += tag.encode(os);
-		}
-
-		return codeLength;
-
-	}
-
-	public int decode(InputStream is) throws IOException {
-		return decode(is, true);
-	}
-
-	public int decode(InputStream is, boolean withTag) throws IOException {
-		int codeLength = 0;
-		int subCodeLength = 0;
-		BerTag berTag = new BerTag();
-
-		if (withTag) {
-			codeLength += tag.decodeAndCheck(is);
-		}
-
-		BerLength length = new BerLength();
-		codeLength += length.decode(is);
-
-		int totalLength = length.val;
-		codeLength += totalLength;
-
-		subCodeLength += berTag.decode(is);
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 0)) {
-			crnti = new CRNTI();
-			subCodeLength += crnti.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
-			ecgi = new ECGI();
-			subCodeLength += ecgi.decode(is, false);
-			subCodeLength += berTag.decode(is);
-		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
-		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 2)) {
-			scellsInd = new ScellsInd();
-			subCodeLength += scellsInd.decode(is, false);
-			if (subCodeLength == totalLength) {
-				return codeLength;
-			}
-		}
-		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
-
-		
-	}
-
-	public void encodeAndSave(int encodingSizeGuess) throws IOException {
-		BerByteArrayOutputStream os = new BerByteArrayOutputStream(encodingSizeGuess);
-		encode(os, false);
-		code = os.getArray();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		appendAsString(sb, 0);
-		return sb.toString();
-	}
-
-	public void appendAsString(StringBuilder sb, int indentLevel) {
-
-		sb.append("{");
-		sb.append("\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (crnti != null) {
-			sb.append("\"crnti\": ").append(crnti);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (ecgi != null) {
-			sb.append("\"ecgi\": ");
-			ecgi.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append(",\n");
-		for (int i = 0; i < indentLevel + 1; i++) {
-			sb.append("\t");
-		}
-		if (scellsInd != null) {
-			sb.append("\"scellsInd\": ");
-			scellsInd.appendAsString(sb, indentLevel + 1);
-		}
-		
-		sb.append("\n");
-		for (int i = 0; i < indentLevel; i++) {
-			sb.append("\t");
-		}
-		sb.append("}");
-	}
+        public void addPCIARFCN(PCIARFCN pciarfcn) {
+            seqOf.add(pciarfcn);
+        }
+    }
 
 }
 
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 6efe465..60be502 100644
--- a/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java
+++ b/src/main/java/org.onosproject.xran/codecs/pdu/XICICConfig.java
@@ -37,7 +37,7 @@
 	private BerInteger startPrbUl = null;
 	private BerInteger endPrbUl = null;
 	private BerBitString subframeBitmaskUl = null;
-	
+
 	public XICICConfig() {
 	}
 
@@ -150,61 +150,79 @@
 		}
 
 		int codeLength = 0;
-		codeLength += subframeBitmaskUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 10
-		os.write(0x8A);
-		codeLength += 1;
-		
-		codeLength += endPrbUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 9
-		os.write(0x89);
-		codeLength += 1;
-		
-		codeLength += startPrbUl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 8
-		os.write(0x88);
-		codeLength += 1;
-		
-		codeLength += p0UePusch.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 7
-		os.write(0x87);
-		codeLength += 1;
-		
-		codeLength += subframeBitmaskDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 6
-		os.write(0x86);
-		codeLength += 1;
-		
-		codeLength += endPrbDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 5
-		os.write(0x85);
-		codeLength += 1;
-		
-		codeLength += startPrbDl.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 4
-		os.write(0x84);
-		codeLength += 1;
-		
-		codeLength += pa.encode(os, false);
-		// write tag: CONTEXT_CLASS, PRIMITIVE, 3
-		os.write(0x83);
-		codeLength += 1;
-		
+		if (subframeBitmaskUl != null) {
+			codeLength += subframeBitmaskUl.encode(os, false);
+			// write tag: CONTEXT_CLASS, PRIMITIVE, 10
+			os.write(0x8A);
+			codeLength += 1;
+		}
+
+		if (endPrbUl != null) {
+			codeLength += endPrbUl.encode(os, false);
+			// write tag: CONTEXT_CLASS, PRIMITIVE, 9
+			os.write(0x89);
+			codeLength += 1;
+		}
+
+		if (startPrbUl != null) {
+			codeLength += startPrbUl.encode(os, false);
+			// write tag: CONTEXT_CLASS, PRIMITIVE, 8
+			os.write(0x88);
+			codeLength += 1;
+		}
+
+		if (p0UePusch != null) {
+			codeLength += p0UePusch.encode(os, false);
+			// write tag: CONTEXT_CLASS, PRIMITIVE, 7
+			os.write(0x87);
+			codeLength += 1;
+		}
+
+		if (subframeBitmaskDl != null) {
+			codeLength += subframeBitmaskDl.encode(os, false);
+			// write tag: CONTEXT_CLASS, PRIMITIVE, 6
+			os.write(0x86);
+			codeLength += 1;
+		}
+
+		if (endPrbDl != null) {
+			codeLength += endPrbDl.encode(os, false);
+			// write tag: CONTEXT_CLASS, PRIMITIVE, 5
+			os.write(0x85);
+			codeLength += 1;
+		}
+
+		if (startPrbDl != null) {
+			codeLength += startPrbDl.encode(os, false);
+			// write tag: CONTEXT_CLASS, PRIMITIVE, 4
+			os.write(0x84);
+			codeLength += 1;
+		}
+
+		if (pa != null) {
+			codeLength += pa.encode(os, false);
+			// write tag: CONTEXT_CLASS, PRIMITIVE, 3
+			os.write(0x83);
+			codeLength += 1;
+		}
+
 		codeLength += crnti.encode(os, false);
 		// write tag: CONTEXT_CLASS, PRIMITIVE, 2
 		os.write(0x82);
 		codeLength += 1;
-		
-		codeLength += pciArfcn.encode(os, false);
-		// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
-		os.write(0xA1);
-		codeLength += 1;
-		
+
+		if (pciArfcn != null) {
+			codeLength += pciArfcn.encode(os, false);
+			// write tag: CONTEXT_CLASS, CONSTRUCTED, 1
+			os.write(0xA1);
+			codeLength += 1;
+		}
+
 		codeLength += ecgi.encode(os, false);
 		// write tag: CONTEXT_CLASS, CONSTRUCTED, 0
 		os.write(0xA0);
 		codeLength += 1;
-		
+
 		codeLength += BerLength.encodeLength(os, codeLength);
 
 		if (withTag) {
@@ -243,88 +261,88 @@
 		else {
 			throw new IOException("Tag does not match the mandatory sequence element tag.");
 		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.CONSTRUCTED, 1)) {
 			pciArfcn = new PCIARFCN();
 			subCodeLength += pciArfcn.decode(is, false);
 			subCodeLength += berTag.decode(is);
 		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 2)) {
 			crnti = new CRNTI();
 			subCodeLength += crnti.decode(is, false);
+			if (subCodeLength == totalLength) {
+				return codeLength;
+			}
 			subCodeLength += berTag.decode(is);
 		}
 		else {
 			throw new IOException("Tag does not match the mandatory sequence element tag.");
 		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 3)) {
 			pa = new XICICPA();
 			subCodeLength += pa.decode(is, false);
+			if (subCodeLength == totalLength) {
+				return codeLength;
+			}
 			subCodeLength += berTag.decode(is);
 		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 4)) {
 			startPrbDl = new BerInteger();
 			subCodeLength += startPrbDl.decode(is, false);
+			if (subCodeLength == totalLength) {
+				return codeLength;
+			}
 			subCodeLength += berTag.decode(is);
 		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 5)) {
 			endPrbDl = new BerInteger();
 			subCodeLength += endPrbDl.decode(is, false);
+			if (subCodeLength == totalLength) {
+				return codeLength;
+			}
 			subCodeLength += berTag.decode(is);
 		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 6)) {
 			subframeBitmaskDl = new BerBitString();
 			subCodeLength += subframeBitmaskDl.decode(is, false);
+			if (subCodeLength == totalLength) {
+				return codeLength;
+			}
 			subCodeLength += berTag.decode(is);
 		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 7)) {
 			p0UePusch = new BerInteger();
 			subCodeLength += p0UePusch.decode(is, false);
+			if (subCodeLength == totalLength) {
+				return codeLength;
+			}
 			subCodeLength += berTag.decode(is);
 		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 8)) {
 			startPrbUl = new BerInteger();
 			subCodeLength += startPrbUl.decode(is, false);
+			if (subCodeLength == totalLength) {
+				return codeLength;
+			}
 			subCodeLength += berTag.decode(is);
 		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 9)) {
 			endPrbUl = new BerInteger();
 			subCodeLength += endPrbUl.decode(is, false);
+			if (subCodeLength == totalLength) {
+				return codeLength;
+			}
 			subCodeLength += berTag.decode(is);
 		}
-		else {
-			throw new IOException("Tag does not match the mandatory sequence element tag.");
-		}
-		
+
 		if (berTag.equals(BerTag.CONTEXT_CLASS, BerTag.PRIMITIVE, 10)) {
 			subframeBitmaskUl = new BerBitString();
 			subCodeLength += subframeBitmaskUl.decode(is, false);
@@ -334,7 +352,7 @@
 		}
 		throw new IOException("Unexpected end of sequence, length tag: " + totalLength + ", actual sequence length: " + subCodeLength);
 
-		
+
 	}
 
 	public void encodeAndSave(int encodingSizeGuess) throws IOException {
diff --git a/src/main/java/org.onosproject.xran/controller/XranController.java b/src/main/java/org.onosproject.xran/controller/XranController.java
index 42ca41e..02f8378 100644
--- a/src/main/java/org.onosproject.xran/controller/XranController.java
+++ b/src/main/java/org.onosproject.xran/controller/XranController.java
@@ -39,4 +39,8 @@
     void removeListener(XranHostListener listener);
 
     SynchronousQueue<String> sendModifiedRRMConf(RRMConfig rrmConfig, boolean xICIC);
+
+    SynchronousQueue<String> sendScellAdd(RnibLink link);
+
+    boolean sendScellDelete(RnibLink link);
 }
diff --git a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
index a5e073a..1d9653d 100644
--- a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
+++ b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
@@ -107,8 +107,10 @@
     private LinkMap linkMap;
     /* MAPS */
     private ConcurrentMap<String, ECGI> legitCells = new ConcurrentHashMap<>();
-    private ConcurrentMap<CRNTI, SynchronousQueue<String>> hoQueue = new ConcurrentHashMap<CRNTI, SynchronousQueue<String>>();
-    private ConcurrentMap<ECGI, SynchronousQueue<String>> RRMCellQueue = new ConcurrentHashMap<ECGI, SynchronousQueue<String>>();
+    private ConcurrentMap<CRNTI, SynchronousQueue<String>> hoQueue = new ConcurrentHashMap<>();
+    private ConcurrentMap<ECGI, SynchronousQueue<String>> RRMCellQueue = new ConcurrentHashMap<>();
+    private ConcurrentMap<CRNTI, SynchronousQueue<String>> scellAddQueue = new ConcurrentHashMap<>();
+    private ConcurrentMap<CRNTI, SynchronousQueue<String>> scellDeleteQueue = new ConcurrentHashMap<>();
     /* AGENTS */
     private InternalXranDeviceAgent deviceAgent = new InternalXranDeviceAgent();
     private InternalXranHostAgent hostAgent = new InternalXranHostAgent();
@@ -215,6 +217,70 @@
         return queue;
     }
 
+    @Override
+    public SynchronousQueue<String> sendScellAdd(RnibLink link) {
+        RnibCell secondaryCell = link.getLinkId().getCell(),
+                primaryCell = linkMap.getPrimaryCell(link.getLinkId().getUe());
+        ECGI primaryEcgi = primaryCell.getEcgi();
+        ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
+
+        CRNTI crnti = linkMap.getCrnti(link.getLinkId().getMmeues1apid());
+
+        CellConfigReport cellReport = secondaryCell.getConf();
+
+        if (cellReport != null) {
+            PCIARFCN pciarfcn = new PCIARFCN();
+            pciarfcn.setPci(cellReport.getPci());
+            pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
+
+            PropScell propScell = new PropScell();
+            propScell.setPciArfcn(pciarfcn);
+
+            XrancPdu pdu = ScellAdd.constructPacket(primaryEcgi, crnti, propScell);
+            try {
+                ctx.writeAndFlush(getSctpMessage(pdu));
+                SynchronousQueue<String> queue = new SynchronousQueue<>();
+                scellAddQueue.put(crnti, queue);
+
+                return queue;
+            } catch (IOException e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean sendScellDelete(RnibLink link) {
+        RnibCell secondaryCell = link.getLinkId().getCell(),
+                primaryCell = linkMap.getPrimaryCell(link.getLinkId().getUe());
+        ECGI primaryEcgi = primaryCell.getEcgi();
+        ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
+
+        CRNTI crnti = linkMap.getCrnti(link.getLinkId().getMmeues1apid());
+
+        CellConfigReport cellReport = secondaryCell.getConf();
+
+        if (cellReport != null) {
+            PCIARFCN pciarfcn = new PCIARFCN();
+            pciarfcn.setPci(cellReport.getPci());
+            pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
+
+            XrancPdu pdu = ScellDelete.constructPacket(primaryEcgi, crnti, pciarfcn);
+
+            try {
+                ctx.writeAndFlush(getSctpMessage(pdu));
+                link.setType(RnibLink.Type.NON_SERVING);
+                return true;
+            } catch (IOException e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
     private void restartTimer(RnibUe ue) {
         Timer timer = new Timer();
         ue.setTimer(timer);
@@ -319,7 +385,7 @@
                 case HOST_MOVED: {
                     RnibUe ue = ueMap.get(hostIdtoMME(event.subject().id()));
                     if (ue != null) {
-                        ECGI ecgi_primary = linkMap.getPrimaryCell(ue);
+                        ECGI ecgi_primary = linkMap.getPrimaryCell(ue).getEcgi();
                         RnibCell primary = cellMap.get(ecgi_primary);
                         ue.setMeasConfig(null);
                         if (primary != null) {
@@ -797,7 +863,32 @@
                     ctx.writeAndFlush(getSctpMessage(xrancPdu));
                     break;
                 }
-                // TODO: Case 26: ScellAdd 27: ScellAddStatus 28: ScellDelete
+                case 27: {
+                    //Decode ScellAddStatus
+                    ScellAddStatus scellAddStatus = recv_pdu.getBody().getScellAddStatus();
+                    try {
+                        scellAddQueue.get(scellAddStatus.getCrnti()).put("Scell's status: " + scellAddStatus.getStatus());
+                        if (scellAddStatus.getStatus().getBerEnum().get(0).value.intValue() == 0) {
+
+                            scellAddStatus.getScellsInd().getPCIARFCN().forEach(
+                                    pciarfcn -> {
+                                        RnibCell cell = cellMap.get(pciarfcn);
+                                        RnibLink link = linkMap.get(cell.getEcgi(), scellAddStatus.getCrnti());
+                                        link.setType(RnibLink.Type.SERVING_SECONDARY_CA);
+                                    }
+                            );
+                        } else {
+                            log.error("Scell addition failed.");
+                        }
+                    } catch (InterruptedException e) {
+                        log.error(ExceptionUtils.getFullStackTrace(e));
+                        e.printStackTrace();
+                    } finally {
+                        scellAddQueue.remove(scellAddStatus.getCrnti());
+                    }
+                    break;
+                }
+                // TODO: 28: ScellDelete
 
                 case 30: {
                     // Decode RRMConfig Status
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") {
diff --git a/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java b/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
index 3cc0e01..d7b9904 100644
--- a/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
+++ b/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
@@ -19,7 +19,6 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
-import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.felix.scr.annotations.*;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -123,6 +122,7 @@
         return list;
     }
 
+
     @Override
     public RnibLink getLinkBetweenCellIdUeId(String eciHex, long euId) {
         EUTRANCellIdentifier eci = hexToECI(eciHex);
@@ -138,38 +138,21 @@
     }
 
     @Override
-    public boolean createLinkBetweenCellIdUeId(String eciHex, long euId, String type) {
-        RnibCell cell = getCell(eciHex);
-        RnibUe ue = getUe(euId);
-
-        if (cell != null && ue != null) {
-            RnibLink link = new RnibLink(cell, ue);
-
-            // TODO: check logic for each type
-            try {
-                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));
-            }
-            linkMap.put(link.getLinkId(), link);
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
     public void storeLink(RnibLink link) {
-        if (link.getLinkId() != null) {
-            linkMap.put(link.getLinkId(), link);
+        synchronized (this) {
+            if (link.getLinkId() != null) {
+                // if we add a primary link then change the primary to non serving
+                if (link.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
+                    RnibUe ue = link.getLinkId().getUe();
+                    getLinksByUeId(ue.getMmeS1apId().longValue())
+                            .forEach(l -> {
+                                if (l.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
+                                    l.setType(RnibLink.Type.NON_SERVING);
+                                }
+                            });
+                }
+                linkMap.put(link.getLinkId(), link);
+            }
         }
     }
 
diff --git a/src/main/java/org.onosproject.xran/rest/CellWebResource.java b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
index c62cd0e..25825a9 100644
--- a/src/main/java/org.onosproject.xran/rest/CellWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
@@ -94,8 +94,8 @@
             try {
                 ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
-                JsonNode rrmConf = jsonTree.get("RRMConf");
-                if (rrmConf != null) {
+                JsonNode rrmConf = jsonTree.path("RRMConf");
+                if (!rrmConf.isMissingNode()) {
                     final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
                     get(XranStore.class).modifyCellRrmConf(cell, rrmConf);
 
@@ -122,7 +122,9 @@
             }
         }
 
-        return Response.serverError().entity("cell not found").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 3640a1d..e3b2035 100644
--- a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
@@ -23,19 +23,14 @@
 import org.onosproject.xran.XranStore;
 import org.onosproject.xran.annotations.Patch;
 import org.onosproject.xran.controller.XranController;
+import org.onosproject.xran.entities.RnibCell;
 import org.onosproject.xran.entities.RnibLink;
+import org.onosproject.xran.entities.RnibUe;
 import org.openmuc.jasn1.ber.types.BerInteger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
+import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
@@ -110,62 +105,20 @@
             try {
                 ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
-                JsonNode type = jsonTree.get("type");
-                if (type != null) {
-                    final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
-                    RnibLink.Type linkType = RnibLink.Type.getEnum(type.asText());
-                    if (linkType.equals(RnibLink.Type.SERVING_PRIMARY)) {
-                        List<RnibLink> linksByUeId = get(XranStore.class).getLinksByUeId(dst);
-                        Optional<RnibLink> primary = linksByUeId.stream()
-                                .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
-                                .findFirst();
-                        if (primary.isPresent()) {
-                            queue[0] = get(XranController.class).sendHORequest(link, primary.get());
-                            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();
-                            }
-                        }
-                    }
+                JsonNode type = jsonTree.path("type");
+                if (!type.isMissingNode()) {
+                    RnibLink.Type anEnum = RnibLink.Type.getEnum(type.asText());
+                    return handleTypeChange(link, anEnum);
                 }
 
-                JsonNode trafficpercent = jsonTree.get("trafficpercent");
-                if (trafficpercent != null) {
-                    JsonNode jsonNode = trafficpercent.get("traffic-percent-dl");
-                    if (jsonNode != null) {
-                        link.getTrafficPercent().setTrafficPercentDl(new BerInteger(jsonNode.asInt()));
-                    }
-                    jsonNode = trafficpercent.get("traffic-percent-ul");
-                    if (jsonNode != null) {
-                        link.getTrafficPercent().setTrafficPercentUl(new BerInteger(jsonNode.asInt()));
-                    }
-                    return Response.ok("trafficpercent changed successfully").build();
+                JsonNode trafficpercent = jsonTree.path("trafficpercent");
+                if (!trafficpercent.isMissingNode()) {
+                    return handleTrafficChange(link, trafficpercent);
                 }
 
-                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();
-                    }
+                JsonNode rrmConf = jsonTree.path("RRMConf");
+                if (!rrmConf.isMissingNode()) {
+                    return handleRRMChange(link, rrmConf);
                 }
 
             } catch (Exception e) {
@@ -174,7 +127,7 @@
                 return Response.serverError().entity(ExceptionUtils.getFullStackTrace(e)).build();
             }
         }
-        return Response.serverError().entity("link not found").build();
+        return Response.serverError().entity("link not found use POST request").build();
     }
 
     /**
@@ -189,15 +142,38 @@
     @Path("{src},{dst}")
     @Consumes(MediaType.APPLICATION_JSON)
     public Response postLinks(@PathParam("src") String src, @PathParam("dst") long dst, InputStream stream) {
+        RnibCell cell = get(XranStore.class).getCell(src);
+        RnibUe ue = get(XranStore.class).getUe(dst);
+
+        if (cell == null) {
+            return Response.serverError()
+                    .entity("cell not found")
+                    .build();
+        }
+
+        if (ue == null) {
+            return Response.serverError()
+                    .entity("ue not found")
+                    .build();
+        }
+
+        if (get(XranStore.class).getLink(cell.getEcgi(), ue.getMmeS1apId()) != null) {
+            return Response.serverError()
+                    .entity("link exists use PATCH request")
+                    .build();
+        }
+
         try {
             ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
 
-            JsonNode type = jsonTree.get("type");
+            JsonNode type = jsonTree.path("type");
 
-            if (type != null) {
-                boolean b;
-                b = get(XranStore.class).createLinkBetweenCellIdUeId(src, dst, type.asText());
-                return ok(b).build();
+            if (!type.isMissingNode()) {
+                RnibLink link = new RnibLink(cell, ue);
+                link.setType(RnibLink.Type.getEnum(type.asText()));
+                get(XranStore.class).storeLink(link);
+
+                // TODO: trigger the scell add
             }
         } catch (Exception e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
@@ -207,7 +183,121 @@
                     .build();
         }
 
-        return Response.serverError().entity("unreachable code").build();
+        return Response.serverError()
+                .entity("unreachable code")
+                .build();
     }
 
+    private Response handleTypeChange(RnibLink link, RnibLink.Type newType) throws InterruptedException {
+        final SynchronousQueue<String>[] queue = new SynchronousQueue[1];
+
+        if (newType.equals(RnibLink.Type.SERVING_PRIMARY)) {
+            List<RnibLink> linksByUeId = get(XranStore.class).getLinksByUeId(link.getLinkId().getMmeues1apid().longValue());
+
+            Optional<RnibLink> primary = linksByUeId.stream()
+                    .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
+                    .findFirst();
+            if (primary.isPresent()) {
+                queue[0] = get(XranController.class).sendHORequest(link, primary.get());
+                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();
+                }
+            } else {
+                link.setType(RnibLink.Type.SERVING_PRIMARY);
+                return Response.ok()
+                        .entity("there was not another primary link")
+                        .build();
+            }
+        } else if (newType.equals(RnibLink.Type.NON_SERVING)) {
+            switch (link.getType()) {
+                case NON_SERVING:
+                    return Response.ok()
+                            .entity("It's already a non serving link!" + link)
+                            .build();
+                case SERVING_PRIMARY:
+                    return Response.serverError()
+                            .entity("Cannot change a Primary link.")
+                            .build();
+                case SERVING_SECONDARY_CA:
+                case SERVING_SECONDARY_DC:
+                    if (get(XranController.class).sendScellDelete(link)) {
+                        return Response.ok()
+                                .entity("Successfully changed link type to " + link.getType())
+                                .build();
+                    } else {
+                        return Response.serverError()
+                                .entity("Could not change link type.")
+                                .build();
+                    }
+            }
+        } else if (newType.equals(RnibLink.Type.SERVING_SECONDARY_CA)) {
+            switch (link.getType()) {
+                case SERVING_PRIMARY:
+                    return Response.serverError()
+                            .entity("Cannot change a Primary link.")
+                            .build();
+                case SERVING_SECONDARY_DC:
+                case NON_SERVING:
+                    queue[0] = get(XranController.class).sendScellAdd(link);
+                    String poll = queue[0].poll(5, TimeUnit.SECONDS);
+                    if (poll != null) {
+                        return Response.ok()
+                                .entity("Successfully changed link type to " + link.getType())
+                                .build();
+                    } else {
+                        return Response.serverError()
+                                .entity("did not receive response in time")
+                                .build();
+                    }
+                case SERVING_SECONDARY_CA:
+                    return Response.ok()
+                            .entity("It's already a service secondary ca link!")
+                            .build();
+            }
+        }
+
+        return Response.serverError()
+                .entity("Unknown type")
+                .build();
+    }
+
+    private Response handleTrafficChange(RnibLink link, JsonNode trafficpercent) {
+        JsonNode jsonNode = trafficpercent.path("traffic-percent-dl");
+        if (!jsonNode.isMissingNode()) {
+            link.getTrafficPercent().setTrafficPercentDl(new BerInteger(jsonNode.asInt()));
+        }
+
+        jsonNode = trafficpercent.path("traffic-percent-ul");
+        if (!jsonNode.isMissingNode()) {
+            link.getTrafficPercent().setTrafficPercentUl(new BerInteger(jsonNode.asInt()));
+        }
+
+        return Response.ok("trafficpercent changed successfully").build();
+    }
+
+    private Response handleRRMChange(RnibLink link, JsonNode rrmConf) throws InterruptedException {
+        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();
+        }
+    }
 }
diff --git a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
index 862acf6..033f132 100644
--- a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
+++ b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
@@ -45,15 +45,7 @@
     public void putPrimaryLink(RnibCell cell, RnibUe ue) {
         RnibLink link = new RnibLink(cell, ue);
         link.setType(RnibLink.Type.SERVING_PRIMARY);
-        synchronized (xranStore) {
-            xranStore.getLinksByUeId(ue.getMmeS1apId().longValue())
-                    .forEach(l -> {
-                        if (l.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
-                            l.setType(RnibLink.Type.SERVING_SECONDARY);
-                        }
-                    });
-            xranStore.storeLink(link);
-        }
+        xranStore.storeLink(link);
         crntiMme.put(ue.getRanId(), ue.getMmeS1apId());
     }
 
@@ -116,12 +108,14 @@
         return false;
     }
 
-    public ECGI getPrimaryCell(RnibUe ue) {
+    public RnibCell getPrimaryCell(RnibUe ue) {
         List<RnibLink> linksByUeId = xranStore.getLinksByUeId(ue.getMmeS1apId().longValue());
-        Optional<RnibLink> primary = linksByUeId.stream().filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY)).findFirst();
+        Optional<RnibLink> primary = linksByUeId.stream()
+                .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
+                .findFirst();
 
         if (primary.isPresent()) {
-            return primary.get().getLinkId().getEcgi();
+            return primary.get().getLinkId().getCell();
         }
         return null;
     }
