diff --git a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
index 5e62271..ed7b4f1 100644
--- a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
+++ b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
@@ -19,7 +19,6 @@
 import org.onosproject.xran.XranStore;
 import org.onosproject.xran.codecs.api.CRNTI;
 import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.MMEUES1APID;
 import org.onosproject.xran.entities.RnibCell;
 import org.onosproject.xran.entities.RnibLink;
 import org.onosproject.xran.entities.RnibUe;
@@ -63,7 +62,20 @@
         return link;
     }
 
-    public RnibLink get(ECGI src, MMEUES1APID dst) {
+    public RnibLink putNonServingLink(RnibCell cell, Long ueId) {
+        RnibLink link = null;
+        RnibUe ue = ueMap.get(ueId);
+
+        if (ue != null) {
+            link = new RnibLink(cell, ue);
+            xranStore.storeLink(link);
+        } else {
+            log.error("Could not find mapping for CRNTI to UE. Aborting creation of non-serving link");
+        }
+        return link;
+    }
+
+    public RnibLink get(ECGI src, Long dst) {
         if (src != null && dst != null) {
             return xranStore.getLink(src, dst);
         }
@@ -74,17 +86,17 @@
         RnibUe ue = ueMap.get(src, dst);
 
         if (ue != null) {
-            return xranStore.getLink(src, ue.getMmeS1apId());
+            return xranStore.getLink(src, ue.getId());
         }
         return null;
     }
 
-    public CRNTI getCrnti(MMEUES1APID mme) {
-        return ueMap.getCrntUe().inverse().get(mme).getValue();
+    public CRNTI getCrnti(Long ueId) {
+        return ueMap.getCrntUe().inverse().get(ueId).getValue();
     }
 
     public RnibCell getPrimaryCell(RnibUe ue) {
-        List<RnibLink> linksByUeId = xranStore.getLinksByUeId(ue.getMmeS1apId().longValue());
+        List<RnibLink> linksByUeId = xranStore.getLinksByUeId(ue.getId());
         Optional<RnibLink> primary = linksByUeId.stream()
                 .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
                 .findFirst();
diff --git a/src/main/java/org.onosproject.xran/wrapper/UeMap.java b/src/main/java/org.onosproject.xran/wrapper/UeMap.java
index 1938a79..8b2110d 100644
--- a/src/main/java/org.onosproject.xran/wrapper/UeMap.java
+++ b/src/main/java/org.onosproject.xran/wrapper/UeMap.java
@@ -16,25 +16,18 @@
 
 package org.onosproject.xran.wrapper;
 
-import com.google.common.base.Objects;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.HashBiMap;
-import io.netty.channel.ChannelHandlerContext;
-import javafx.util.Pair;
-import org.onosproject.net.HostId;
 import org.onosproject.xran.XranStore;
 import org.onosproject.xran.codecs.api.CRNTI;
 import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.ENBUES1APID;
 import org.onosproject.xran.codecs.api.MMEUES1APID;
 import org.onosproject.xran.entities.RnibCell;
 import org.onosproject.xran.entities.RnibUe;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
+import org.onosproject.xran.identifiers.EcgiCrntiPair;
 
 public class UeMap {
-    private BiMap<EcgiCrntiPair, MMEUES1APID> crntUe = HashBiMap.create();
+    private BiMap<EcgiCrntiPair, Long> crntUe = HashBiMap.create();
 
     private XranStore xranStore;
 
@@ -42,75 +35,44 @@
         this.xranStore = xranStore;
     }
 
-    public BiMap<EcgiCrntiPair, MMEUES1APID> getCrntUe() {
+    public BiMap<EcgiCrntiPair, Long> getCrntUe() {
         return crntUe;
     }
 
     public void putCrnti(RnibCell cell, RnibUe ue) {
-        CRNTI ranId = ue.getRanId();
+        CRNTI ranId = ue.getCrnti();
         ECGI ecgi = cell.getEcgi();
         if (ranId != null && ecgi != null) {
-            crntUe.put(EcgiCrntiPair.valueOf(cell.getEcgi(),ue.getRanId()), ue.getMmeS1apId());
+            EcgiCrntiPair oldPair = crntUe.inverse().get(ue.getId()),
+                    newPair = EcgiCrntiPair.valueOf(cell.getEcgi(), ue.getCrnti());
+            if (oldPair == null) {
+                crntUe.put(newPair, ue.getId());
+            } else {
+                crntUe.inverse().remove(ue.getId());
+                crntUe.put(newPair, ue.getId());
+            }
         }
     }
 
     public void put(RnibCell cell, RnibUe ue) {
-
-        MMEUES1APID mmeS1apId = ue.getMmeS1apId();
-        if (mmeS1apId != null) {
-            xranStore.storeUe(ue);
-            putCrnti(cell, ue);
-        }
+        xranStore.storeUe(ue);
+        putCrnti(cell, ue);
     }
 
     public RnibUe get(ECGI ecgi, CRNTI crnti) {
-        MMEUES1APID mme = crntUe.get(EcgiCrntiPair.valueOf(ecgi, crnti));
-        if (mme != null) {
-            return xranStore.getUe(mme);
+        Long aLong = crntUe.get(EcgiCrntiPair.valueOf(ecgi, crnti));
+        if (aLong != null) {
+            return xranStore.getUe(aLong);
         }
         return null;
     }
 
-    public RnibUe get(MMEUES1APID mme) {
-        if (mme != null) {
-            return xranStore.getUe(mme);
-        }
-        return null;
+    public RnibUe get(Long ueId) {
+        return xranStore.getUe(ueId);
     }
 
-    public boolean remove(MMEUES1APID id) {
-        crntUe.inverse().remove(id);
-        return xranStore.removeUe(id);
-    }
-
-    public static class EcgiCrntiPair extends Pair<ECGI, CRNTI> {
-
-        /**
-         * Creates a new pair
-         *
-         * @param key   The key for this pair
-         * @param value The value to use for this pair
-         */
-        public EcgiCrntiPair(ECGI key, CRNTI value) {
-            super(key, value);
-        }
-
-        public static EcgiCrntiPair valueOf(ECGI key, CRNTI value) {
-            return new EcgiCrntiPair(key, value);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hashCode(getKey(), getValue());
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o instanceof EcgiCrntiPair) {
-                return ((EcgiCrntiPair) o).getKey().equals(getKey()) &&
-                        ((EcgiCrntiPair) o).getValue().equals(getValue());
-            }
-            return super.equals(o);
-        }
+    public boolean remove(Long ueId) {
+        crntUe.inverse().remove(ueId);
+        return xranStore.removeUe(ueId);
     }
 }
