diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java
index 3cdfa42..b412cdb 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java
@@ -232,6 +232,7 @@
                         .withIsEtr(etr)
                         .withIsSecurity(security)
                         .withNonce(nonce)
+                        .withMapRecords(mapRecords)
                         .build();
         }
     }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java
index 9ceef6c..e4ea7db 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java
@@ -77,7 +77,8 @@
             // let's skip the reserved field
             byteBuf.skipBytes(RESERVED_SKIP_LENGTH);
 
-            short maskLength = (short) byteBuf.readUnsignedShort();
+            // mask length -> 8 bits
+            short maskLength = byteBuf.readUnsignedByte();
 
             LispAfiAddress prefix = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
 
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotifyTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotifyTest.java
index 3cea68e..434e22a 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotifyTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotifyTest.java
@@ -15,18 +15,25 @@
  */
 package org.onosproject.lisp.msg.protocols;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.testing.EqualsTester;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.packet.IpAddress;
 import org.onosproject.lisp.msg.exceptions.LispParseError;
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
+import org.onosproject.lisp.msg.protocols.LispMapRecord.MapRecordBuilder;
+import org.onosproject.lisp.msg.types.LispIpv4Address;
+
+import java.util.List;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.onosproject.lisp.msg.protocols.DefaultLispMapNotify.*;
+import static org.onosproject.lisp.msg.protocols.DefaultLispMapRecord.DefaultMapRecordBuilder;
 
 /**
  * Unit tests for DefaultLispMapNotify class.
@@ -40,23 +47,29 @@
     @Before
     public void setup() {
 
-        LispMapNotify.NotifyBuilder builder1 =
+        NotifyBuilder builder1 =
                         new DefaultNotifyBuilder();
 
+        List<LispMapRecord> records1 = ImmutableList.of(getMapRecord(), getMapRecord());
+
         notify1 = builder1
                         .withKeyId((short) 1)
                         .withNonce(1L)
+                        .withMapRecords(records1)
                         .build();
 
-        LispMapNotify.NotifyBuilder builder2 =
+        NotifyBuilder builder2 =
                         new DefaultNotifyBuilder();
 
+        List<LispMapRecord> records2 = ImmutableList.of(getMapRecord(), getMapRecord());
+
         sameAsNotify1 = builder2
                         .withKeyId((short) 1)
                         .withNonce(1L)
+                        .withMapRecords(records2)
                         .build();
 
-        LispMapNotify.NotifyBuilder builder3 =
+        NotifyBuilder builder3 =
                         new DefaultNotifyBuilder();
 
         notify2 = builder3
@@ -65,6 +78,21 @@
                         .build();
     }
 
+    private LispMapRecord getMapRecord() {
+        MapRecordBuilder builder1 = new DefaultMapRecordBuilder();
+
+        LispIpv4Address ipv4Locator1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
+
+        return builder1
+                .withRecordTtl(100)
+                .withAuthoritative(true)
+                .withMapVersionNumber((short) 1)
+                .withMaskLength((byte) 0x01)
+                .withAction(LispMapReplyAction.NativelyForward)
+                .withEidPrefixAfi(ipv4Locator1)
+                .build();
+    }
+
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -78,6 +106,7 @@
 
         assertThat(notify.getKeyId(), is((short) 1));
         assertThat(notify.getNonce(), is(1L));
+        assertThat(notify.getRecordCount(), is(2));
     }
 
     @Test
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecordTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecordTest.java
index 8a1190e..aa1c7df 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecordTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecordTest.java
@@ -42,8 +42,7 @@
     @Before
     public void setup() {
 
-        LispMapRecord.MapRecordBuilder builder1 =
-                        new DefaultMapRecordBuilder();
+        MapRecordBuilder builder1 = new DefaultMapRecordBuilder();
 
         LispIpv4Address ipv4Locator1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
 
@@ -56,8 +55,7 @@
                         .withEidPrefixAfi(ipv4Locator1)
                         .build();
 
-        LispMapRecord.MapRecordBuilder builder2 =
-                        new DefaultMapRecordBuilder();
+        MapRecordBuilder builder2 = new DefaultMapRecordBuilder();
 
         sameAsRecord1 = builder2
                         .withRecordTtl(100)
@@ -68,8 +66,7 @@
                         .withEidPrefixAfi(ipv4Locator1)
                         .build();
 
-        LispMapRecord.MapRecordBuilder builder3 =
-                        new DefaultMapRecordBuilder();
+        MapRecordBuilder builder3 = new DefaultMapRecordBuilder();
 
         LispIpv4Address ipv4Locator2 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2"));
 
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegisterTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegisterTest.java
index f7d8d46..ff2c104 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegisterTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegisterTest.java
@@ -15,19 +15,28 @@
  */
 package org.onosproject.lisp.msg.protocols;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.testing.EqualsTester;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.packet.IpAddress;
 import org.onosproject.lisp.msg.exceptions.LispParseError;
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
 import org.onosproject.lisp.msg.protocols.DefaultLispMapRegister.RegisterReader;
 import org.onosproject.lisp.msg.protocols.DefaultLispMapRegister.RegisterWriter;
+import org.onosproject.lisp.msg.protocols.LispMapRecord.MapRecordBuilder;
+import org.onosproject.lisp.msg.protocols.LispMapRegister.RegisterBuilder;
+import org.onosproject.lisp.msg.types.LispIpv4Address;
+
+import java.util.List;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onosproject.lisp.msg.protocols.DefaultLispMapRecord.DefaultMapRecordBuilder;
+import static org.onosproject.lisp.msg.protocols.DefaultLispMapRegister.DefaultRegisterBuilder;
 
 /**
  * Unit tests for DefaultLispMapRegister class.
@@ -41,28 +50,31 @@
     @Before
     public void setup() {
 
-        LispMapRegister.RegisterBuilder builder1 =
-                        new DefaultLispMapRegister.DefaultRegisterBuilder();
+        RegisterBuilder builder1 = new DefaultRegisterBuilder();
+
+        List<LispMapRecord> records1 = ImmutableList.of(getMapRecord(), getMapRecord());
 
         register1 = builder1
                         .withIsProxyMapReply(true)
                         .withIsWantMapNotify(false)
                         .withKeyId((short) 1)
                         .withNonce(1L)
+                        .withMapRecords(records1)
                         .build();
 
-        LispMapRegister.RegisterBuilder builder2 =
-                        new DefaultLispMapRegister.DefaultRegisterBuilder();
+        RegisterBuilder builder2 = new DefaultRegisterBuilder();
+
+        List<LispMapRecord> records2 = ImmutableList.of(getMapRecord(), getMapRecord());
 
         sameAsRegister1 = builder2
                         .withIsProxyMapReply(true)
                         .withIsWantMapNotify(false)
                         .withKeyId((short) 1)
                         .withNonce(1L)
+                        .withMapRecords(records2)
                         .build();
 
-        LispMapRegister.RegisterBuilder builder3 =
-                        new DefaultLispMapRegister.DefaultRegisterBuilder();
+        RegisterBuilder builder3 = new DefaultRegisterBuilder();
 
         register2 = builder3
                         .withIsProxyMapReply(true)
@@ -72,6 +84,21 @@
                         .build();
     }
 
+    private LispMapRecord getMapRecord() {
+        MapRecordBuilder builder1 = new DefaultMapRecordBuilder();
+
+        LispIpv4Address ipv4Locator1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
+
+        return builder1
+                .withRecordTtl(100)
+                .withAuthoritative(true)
+                .withMapVersionNumber((short) 1)
+                .withMaskLength((byte) 0x01)
+                .withAction(LispMapReplyAction.NativelyForward)
+                .withEidPrefixAfi(ipv4Locator1)
+                .build();
+    }
+
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -87,6 +114,7 @@
         assertThat(register.isWantMapNotify(), is(false));
         assertThat(register.getKeyId(), is((short) 1));
         assertThat(register.getNonce(), is(1L));
+        assertThat(register.getRecordCount(), is(2));
     }
 
     @Test
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReplyTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReplyTest.java
index e771d15..e72b6ca 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReplyTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReplyTest.java
@@ -15,19 +15,28 @@
  */
 package org.onosproject.lisp.msg.protocols;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.testing.EqualsTester;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.packet.IpAddress;
 import org.onosproject.lisp.msg.exceptions.LispParseError;
 import org.onosproject.lisp.msg.exceptions.LispReaderException;
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
 import org.onosproject.lisp.msg.protocols.DefaultLispMapReply.ReplyReader;
 import org.onosproject.lisp.msg.protocols.DefaultLispMapReply.ReplyWriter;
+import org.onosproject.lisp.msg.types.LispIpv4Address;
+
+import java.util.List;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onosproject.lisp.msg.protocols.DefaultLispMapRecord.DefaultMapRecordBuilder;
+import static org.onosproject.lisp.msg.protocols.DefaultLispMapRecord.MapRecordBuilder;
+import static org.onosproject.lisp.msg.protocols.DefaultLispMapReply.DefaultReplyBuilder;
+import static org.onosproject.lisp.msg.protocols.DefaultLispMapReply.ReplyBuilder;
 
 /**
  * Unit tests for DefaultLispMapReply class.
@@ -41,28 +50,32 @@
     @Before
     public void setup() {
 
-        LispMapReply.ReplyBuilder builder1 =
-                        new DefaultLispMapReply.DefaultReplyBuilder();
+        ReplyBuilder builder1 = new DefaultReplyBuilder();
+
+        List<LispMapRecord> records1 = ImmutableList.of(getMapRecord(), getMapRecord());
 
         reply1 = builder1
                         .withIsEtr(true)
                         .withIsProbe(false)
                         .withIsSecurity(true)
                         .withNonce(1L)
+                        .withMapRecords(records1)
                         .build();
 
-        LispMapReply.ReplyBuilder builder2 =
-                        new DefaultLispMapReply.DefaultReplyBuilder();
+        ReplyBuilder builder2 = new DefaultReplyBuilder();
+
+        List<LispMapRecord> records2 = ImmutableList.of(getMapRecord(), getMapRecord());
 
         sameAsReply1 = builder2
                         .withIsEtr(true)
                         .withIsProbe(false)
                         .withIsSecurity(true)
                         .withNonce(1L)
+                        .withMapRecords(records2)
                         .build();
 
-        LispMapReply.ReplyBuilder builder3 =
-                        new DefaultLispMapReply.DefaultReplyBuilder();
+        ReplyBuilder builder3 = new DefaultReplyBuilder();
+
         reply2 = builder3
                         .withIsEtr(false)
                         .withIsProbe(true)
@@ -71,6 +84,21 @@
                         .build();
     }
 
+    private LispMapRecord getMapRecord() {
+        MapRecordBuilder builder1 = new DefaultMapRecordBuilder();
+
+        LispIpv4Address ipv4Locator1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
+
+        return builder1
+                .withRecordTtl(100)
+                .withAuthoritative(true)
+                .withMapVersionNumber((short) 1)
+                .withMaskLength((byte) 0x01)
+                .withAction(LispMapReplyAction.NativelyForward)
+                .withEidPrefixAfi(ipv4Locator1)
+                .build();
+    }
+
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -86,6 +114,7 @@
         assertThat(reply.isProbe(), is(false));
         assertThat(reply.isSecurity(), is(true));
         assertThat(reply.getNonce(), is(1L));
+        assertThat(reply.getRecordCount(), is(2));
     }
 
     @Test
diff --git a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequestTest.java b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequestTest.java
index 469ce50..6a4fd54 100644
--- a/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequestTest.java
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequestTest.java
@@ -54,6 +54,7 @@
         LispIpv4Address ipv4Rloc2 = new LispIpv4Address(IpAddress.valueOf("10.1.1.2"));
 
         List<LispAfiAddress> rlocs1 = ImmutableList.of(ipv4Rloc1, ipv4Rloc2);
+        List<LispEidRecord> records1 = ImmutableList.of(getEidRecord(), getEidRecord());
 
         request1 = builder1
                         .withIsAuthoritative(true)
@@ -64,10 +65,12 @@
                         .withIsSmrInvoked(false)
                         .withSourceEid(ipv4Eid1)
                         .withItrRlocs(rlocs1)
+                        .withEidRecords(records1)
                         .withNonce(1L)
                         .build();
 
         RequestBuilder builder2 = new DefaultRequestBuilder();
+        List<LispEidRecord> records2 = ImmutableList.of(getEidRecord(), getEidRecord());
 
         sameAsRequest1 = builder2
                         .withIsAuthoritative(true)
@@ -78,6 +81,7 @@
                         .withIsSmrInvoked(false)
                         .withSourceEid(ipv4Eid1)
                         .withItrRlocs(rlocs1)
+                        .withEidRecords(records2)
                         .withNonce(1L)
                         .build();
 
@@ -85,8 +89,8 @@
 
         LispIpv4Address ipv4Eid2 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2"));
 
-        LispIpv4Address ipv4Rloc3 = new LispIpv4Address(IpAddress.valueOf("10.1.1.1"));
-        LispIpv4Address ipv4Rloc4 = new LispIpv4Address(IpAddress.valueOf("10.1.1.2"));
+        LispIpv4Address ipv4Rloc3 = new LispIpv4Address(IpAddress.valueOf("20.1.1.1"));
+        LispIpv4Address ipv4Rloc4 = new LispIpv4Address(IpAddress.valueOf("20.1.1.2"));
 
         List<LispAfiAddress> rlocs2 = ImmutableList.of(ipv4Rloc3, ipv4Rloc4);
 
@@ -103,6 +107,11 @@
                         .build();
     }
 
+    private LispEidRecord getEidRecord() {
+        LispIpv4Address eid = new LispIpv4Address(IpAddress.valueOf("20.1.1.1"));
+        return new LispEidRecord((byte) 24, eid);
+    }
+
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -121,6 +130,7 @@
         assertThat(request.isSmr(), is(true));
         assertThat(request.isSmrInvoked(), is(false));
         assertThat(request.getNonce(), is(1L));
+        assertThat(request.getRecordCount(), is(2));
     }
 
     @Test
