diff --git a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispRadixTreeDatabase.java b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispRadixTreeDatabase.java
index 0cb9d9e..0826d24 100644
--- a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispRadixTreeDatabase.java
+++ b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispRadixTreeDatabase.java
@@ -15,43 +15,114 @@
  */
 package org.onosproject.lisp.ctl.impl;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.lisp.ctl.impl.tree.IpConcurrentRadixTree;
+import org.onosproject.lisp.msg.protocols.DefaultLispProxyMapRecord.DefaultMapWithProxyBuilder;
 import org.onosproject.lisp.msg.protocols.LispEidRecord;
 import org.onosproject.lisp.msg.protocols.LispMapRecord;
+import org.onosproject.lisp.msg.protocols.LispProxyMapRecord;
+import org.slf4j.Logger;
 
 import java.util.List;
 
+import static org.onosproject.lisp.ctl.impl.util.LispMapUtil.cidrfy;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * A radix tree based LISP mapping database.
  */
-public class LispRadixTreeDatabase implements LispMappingDatabase {
+public final class LispRadixTreeDatabase implements LispMappingDatabase {
+
+    private static final Logger log = getLogger(LispRadixTreeDatabase.class);
+
+    private final IpConcurrentRadixTree<LispProxyMapRecord> radixTree =
+            new IpConcurrentRadixTree<>();
+
+    /**
+     * Prevents object instantiation from external.
+     */
+    private LispRadixTreeDatabase() {
+    }
+
+    /**
+     * Obtains a singleton instance.
+     *
+     * @return singleton instance
+     */
+    public static LispRadixTreeDatabase getInstance() {
+        return SingletonHelper.INSTANCE;
+    }
 
     @Override
     public void putMapRecord(LispEidRecord eid, LispMapRecord rloc,
                              boolean proxyMapReply) {
-        //TODO: requires implementation
+        final LispProxyMapRecord mapWithProxy = new DefaultMapWithProxyBuilder()
+                .withMapRecord(rloc)
+                .withIsProxyMapReply(proxyMapReply)
+                .build();
+        radixTree.put(getIpPrefix(eid), mapWithProxy);
+        log.debug("Inserted a new map record for key {}", eid.toString());
     }
 
     @Override
     public void removeMapRecordByEid(LispEidRecord eid) {
-        //TODO: requires implementation
+        if (radixTree.remove(getIpPrefix(eid))) {
+            log.debug("Removed a map record with key {}", eid.toString());
+        }
     }
 
     @Override
     public void removeAllMapRecords() {
-        //TODO: requires implementation
+        radixTree.clear();
+        log.debug("Clear all map records");
     }
 
     @Override
     public LispMapRecord getMapRecordByEidRecord(LispEidRecord eid,
                                                  boolean proxyMapReply) {
-        //TODO: requires implementation
+        final LispProxyMapRecord record =
+                radixTree.getValueForClosestParentAddress(getIpPrefix(eid));
+        if (record != null && record.isProxyMapReply() == proxyMapReply) {
+            return record.getMapRecord();
+        }
         return null;
     }
 
     @Override
     public List<LispMapRecord> getMapRecordByEidRecords(List<LispEidRecord> eids,
                                                         boolean proxyMapReply) {
-        //TODO: requires implementation
-        return null;
+        final List<LispMapRecord> mapRecords = Lists.newArrayList();
+        eids.parallelStream().forEach(eidRecord -> {
+            final LispMapRecord mapRecord =
+                    getMapRecordByEidRecord(eidRecord, proxyMapReply);
+            if (mapRecord != null) {
+                mapRecords.add(mapRecord);
+            }
+        });
+        return ImmutableList.copyOf(mapRecords);
+    }
+
+    /**
+     * Prevents object instantiation from external.
+     */
+    private static final class SingletonHelper {
+        private static final String ILLEGAL_ACCESS_MSG = "Should not instantiate this class.";
+        private static final LispRadixTreeDatabase INSTANCE = new LispRadixTreeDatabase();
+
+        private SingletonHelper() {
+            throw new IllegalAccessError(ILLEGAL_ACCESS_MSG);
+        }
+    }
+
+    /**
+     * Obtains the IP prefix from LISP EID record.
+     *
+     * @param eidRecord LISP EID record
+     * @return IP prefix object
+     */
+    private IpPrefix getIpPrefix(LispEidRecord eidRecord) {
+        return IpPrefix.valueOf(cidrfy(eidRecord));
     }
 }
