diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecord.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecord.java
index df9012a..6f00376 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecord.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecord.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.lisp.msg.protocols;
 
+import com.google.common.base.Objects;
 import org.onosproject.lisp.msg.types.LispAfiAddress;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
+
 /**
  * Default implementation of LispMapRecord.
  */
@@ -88,6 +91,42 @@
         return eidPrefixAfi;
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("record TTL", recordTtl)
+                .add("locatorCount", locatorCount)
+                .add("maskLength", maskLength)
+                .add("action", action)
+                .add("authoritative", authoritative)
+                .add("mapVersionNumber", mapVersionNumber)
+                .add("EID prefix AFI address", eidPrefixAfi).toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        DefaultLispMapRecord that = (DefaultLispMapRecord) o;
+        return Objects.equal(recordTtl, that.recordTtl) &&
+                Objects.equal(locatorCount, that.locatorCount) &&
+                Objects.equal(maskLength, that.maskLength) &&
+                Objects.equal(action, that.action) &&
+                Objects.equal(authoritative, that.authoritative) &&
+                Objects.equal(mapVersionNumber, that.mapVersionNumber) &&
+                Objects.equal(eidPrefixAfi, that.eidPrefixAfi);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(recordTtl, locatorCount, maskLength, action,
+                                authoritative, mapVersionNumber, eidPrefixAfi);
+    }
+
     public static final class DefaultMapRecordBuilder implements MapRecordBuilder {
 
         private int recordTtl;
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
new file mode 100644
index 0000000..219d6ab
--- /dev/null
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotifyTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.lisp.msg.protocols;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for DefaultLispMapNotify class.
+ */
+public class DefaultLispMapNotifyTest {
+
+    private LispMapNotify notify1;
+    private LispMapNotify sameAsNotify1;
+    private LispMapNotify notify2;
+
+    @Before
+    public void setup() {
+
+        LispMapNotify.NotifyBuilder builder1 =
+                        new DefaultLispMapNotify.DefaultNotifyBuilder();
+
+        notify1 = builder1
+                        .withKeyId((short) 1)
+                        .withNonce(1L)
+                        .withRecordCount((byte) 0x01)
+                        .build();
+
+        LispMapNotify.NotifyBuilder builder2 =
+                        new DefaultLispMapNotify.DefaultNotifyBuilder();
+
+        sameAsNotify1 = builder2
+                        .withKeyId((short) 1)
+                        .withNonce(1L)
+                        .withRecordCount((byte) 0x01)
+                        .build();
+
+        LispMapNotify.NotifyBuilder builder3 =
+                        new DefaultLispMapNotify.DefaultNotifyBuilder();
+
+        notify2 = builder3
+                        .withKeyId((short) 2)
+                        .withNonce(2L)
+                        .withRecordCount((byte) 0x02)
+                        .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(notify1, sameAsNotify1)
+                .addEqualityGroup(notify2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        DefaultLispMapNotify notify = (DefaultLispMapNotify) notify1;
+
+        assertThat(notify.getKeyId(), is((short) 1));
+        assertThat(notify.getNonce(), is(1L));
+        assertThat(notify.getRecordCount(), is((byte) 0x01));
+    }
+}
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
new file mode 100644
index 0000000..78af45d
--- /dev/null
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecordTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.lisp.msg.protocols;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for DefaultLispMapRecord class.
+ */
+public class DefaultLispMapRecordTest {
+
+    private LispMapRecord record1;
+    private LispMapRecord sameAsRecord1;
+    private LispMapRecord record2;
+
+    @Before
+    public void setup() {
+
+        LispMapRecord.MapRecordBuilder builder1 =
+                        new DefaultLispMapRecord.DefaultMapRecordBuilder();
+
+        record1 = builder1
+                        .withRecordTtl(100)
+                        .withAuthoritative(true)
+                        .withLocatorCount(100)
+                        .withMapVersionNumber((short) 1)
+                        .withMaskLength((byte) 0x01)
+                        .build();
+
+        LispMapRecord.MapRecordBuilder builder2 =
+                        new DefaultLispMapRecord.DefaultMapRecordBuilder();
+
+        sameAsRecord1 = builder2
+                        .withRecordTtl(100)
+                        .withAuthoritative(true)
+                        .withLocatorCount(100)
+                        .withMapVersionNumber((short) 1)
+                        .withMaskLength((byte) 0x01)
+                        .build();
+
+        LispMapRecord.MapRecordBuilder builder3 =
+                        new DefaultLispMapRecord.DefaultMapRecordBuilder();
+
+        record2 = builder3
+                        .withRecordTtl(200)
+                        .withAuthoritative(false)
+                        .withLocatorCount(200)
+                        .withMapVersionNumber((short) 2)
+                        .withMaskLength((byte) 0x02)
+                        .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(record1, sameAsRecord1)
+                .addEqualityGroup(record2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        DefaultLispMapRecord record = (DefaultLispMapRecord) record1;
+
+        assertThat(record.getRecordTtl(), is(100));
+        assertThat(record.isAuthoritative(), is(true));
+        assertThat(record.getLocatorCount(), is(100));
+        assertThat(record.getMapVersionNumber(), is((short) 1));
+        assertThat(record.getMaskLength(), is((byte) 0x01));
+    }
+}
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
new file mode 100644
index 0000000..940345c
--- /dev/null
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegisterTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.lisp.msg.protocols;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for DefaultLispMapRegister class.
+ */
+public class DefaultLispMapRegisterTest {
+
+    private LispMapRegister register1;
+    private LispMapRegister sameAsRegister1;
+    private LispMapRegister register2;
+
+    @Before
+    public void setup() {
+
+        LispMapRegister.RegisterBuilder builder1 =
+                        new DefaultLispMapRegister.DefaultRegisterBuilder();
+
+        register1 = builder1
+                        .withIsProxyMapReply(true)
+                        .withIsWantMapNotify(false)
+                        .withKeyId((short) 1)
+                        .withNonce(1L)
+                        .withRecordCount((byte) 0x01)
+                        .build();
+
+        LispMapRegister.RegisterBuilder builder2 =
+                        new DefaultLispMapRegister.DefaultRegisterBuilder();
+
+        sameAsRegister1 = builder2
+                        .withIsProxyMapReply(true)
+                        .withIsWantMapNotify(false)
+                        .withKeyId((short) 1)
+                        .withNonce(1L)
+                        .withRecordCount((byte) 0x01)
+                        .build();
+
+        LispMapRegister.RegisterBuilder builder3 =
+                        new DefaultLispMapRegister.DefaultRegisterBuilder();
+
+        register2 = builder3
+                        .withIsProxyMapReply(true)
+                        .withIsWantMapNotify(false)
+                        .withKeyId((short) 2)
+                        .withNonce(2L)
+                        .withRecordCount((byte) 0x02)
+                        .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(register1, sameAsRegister1)
+                .addEqualityGroup(register2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        DefaultLispMapRegister register = (DefaultLispMapRegister) register1;
+
+        assertThat(register.isProxyMapReply(), is(true));
+        assertThat(register.isWantMapNotify(), is(false));
+        assertThat(register.getKeyId(), is((short) 1));
+        assertThat(register.getNonce(), is(1L));
+        assertThat(register.getRecordCount(), is((byte) 0x01));
+    }
+}
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
new file mode 100644
index 0000000..e078cd9
--- /dev/null
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReplyTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.lisp.msg.protocols;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for DefaultLispMapReply class.
+ */
+public class DefaultLispMapReplyTest {
+
+    private LispMapReply reply1;
+    private LispMapReply sameAsReply1;
+    private LispMapReply reply2;
+
+    @Before
+    public void setup() {
+
+        LispMapReply.ReplyBuilder builder1 =
+                        new DefaultLispMapReply.DefaultReplyBuilder();
+
+        reply1 = builder1
+                        .withIsEtr(true)
+                        .withIsProbe(false)
+                        .withIsSecurity(true)
+                        .withNonce(1L)
+                        .withRecordCount((byte) 0x01)
+                        .build();
+
+        LispMapReply.ReplyBuilder builder2 =
+                        new DefaultLispMapReply.DefaultReplyBuilder();
+
+        sameAsReply1 = builder2
+                        .withIsEtr(true)
+                        .withIsProbe(false)
+                        .withIsSecurity(true)
+                        .withNonce(1L)
+                        .withRecordCount((byte) 0x01)
+                        .build();
+
+        LispMapReply.ReplyBuilder builder3 =
+                        new DefaultLispMapReply.DefaultReplyBuilder();
+        reply2 = builder3
+                        .withIsEtr(false)
+                        .withIsProbe(true)
+                        .withIsSecurity(false)
+                        .withNonce(2L)
+                        .withRecordCount((byte) 0x02)
+                        .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(reply1, sameAsReply1)
+                .addEqualityGroup(reply2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        DefaultLispMapReply reply = (DefaultLispMapReply) reply1;
+
+        assertThat(reply.isEtr(), is(true));
+        assertThat(reply.isProbe(), is(false));
+        assertThat(reply.isSecurity(), is(true));
+        assertThat(reply.getNonce(), is(1L));
+        assertThat(reply.getRecordCount(), is((byte) 0x01));
+    }
+}
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
new file mode 100644
index 0000000..13fafc8
--- /dev/null
+++ b/protocols/lisp/msg/src/test/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequestTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.lisp.msg.protocols;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for DefaultLispMapRequest class.
+ */
+public class DefaultLispMapRequestTest {
+
+    private LispMapRequest request1;
+    private LispMapRequest sameAsRequest1;
+    private LispMapRequest request2;
+
+    @Before
+    public void setup() {
+
+        LispMapRequest.RequestBuilder builder1 =
+                        new DefaultLispMapRequest.DefaultRequestBuilder();
+
+        request1 = builder1
+                        .withIsAuthoritative(true)
+                        .withIsMapDataPresent(true)
+                        .withIsPitr(false)
+                        .withIsProbe(false)
+                        .withIsSmr(true)
+                        .withIsSmrInvoked(false)
+                        .withNonce(1L)
+                        .withRecordCount((byte) 0x01)
+                        .build();
+
+        LispMapRequest.RequestBuilder builder2 =
+                        new DefaultLispMapRequest.DefaultRequestBuilder();
+
+        sameAsRequest1 = builder2
+                        .withIsAuthoritative(true)
+                        .withIsMapDataPresent(true)
+                        .withIsPitr(false)
+                        .withIsProbe(false)
+                        .withIsSmr(true)
+                        .withIsSmrInvoked(false)
+                        .withNonce(1L)
+                        .withRecordCount((byte) 0x01)
+                        .build();
+
+        LispMapRequest.RequestBuilder builder3 =
+                        new DefaultLispMapRequest.DefaultRequestBuilder();
+
+        request2 = builder3
+                        .withIsAuthoritative(false)
+                        .withIsMapDataPresent(false)
+                        .withIsPitr(true)
+                        .withIsProbe(true)
+                        .withIsSmr(false)
+                        .withIsSmrInvoked(true)
+                        .withNonce(2L)
+                        .withRecordCount((byte) 0x02)
+                        .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(request1, sameAsRequest1)
+                .addEqualityGroup(request2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        DefaultLispMapRequest request = (DefaultLispMapRequest) request1;
+
+        assertThat(request.isAuthoritative(), is(true));
+        assertThat(request.isMapDataPresent(), is(true));
+        assertThat(request.isPitr(), is(false));
+        assertThat(request.isProbe(), is(false));
+        assertThat(request.isSmr(), is(true));
+        assertThat(request.isSmrInvoked(), is(false));
+        assertThat(request.getNonce(), is(1L));
+        assertThat(request.getRecordCount(), is((byte) 0x01));
+    }
+}
