diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
index d0e5122..09e0117 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 Open Networking Laboratory
+ * Copyright 2014-2015 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.
@@ -13,47 +13,52 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-
-
 package org.onlab.packet.ndp;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.onlab.packet.Data;
+import org.onlab.packet.MacAddress;
 
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
 /**
  * Tests for class {@link NeighborSolicitation}.
  */
 public class NeighborSolicitationTest {
     private static final byte[] TARGET_ADDRESS = {
-            (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
-            (byte) 0xca, (byte) 0x2a, (byte) 0x14, (byte) 0xff, (byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce
+        (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18,
+        (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
+        (byte) 0xca, (byte) 0x2a, (byte) 0x14, (byte) 0xff,
+        (byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce
     };
     private static final byte[] TARGET_ADDRESS2 = {
-            (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
-            (byte) 0xe6, (byte) 0xce, (byte) 0x8f, (byte) 0xff, (byte) 0xfe, (byte) 0x54, (byte) 0x37, (byte) 0xc8
+        (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18,
+        (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
+        (byte) 0xe6, (byte) 0xce, (byte) 0x8f, (byte) 0xff,
+        (byte) 0xfe, (byte) 0x54, (byte) 0x37, (byte) 0xc8
     };
-    private static Data data;
+    private static final MacAddress MAC_ADDRESS =
+        MacAddress.valueOf("11:22:33:44:55:66");
+
     private static byte[] bytePacket;
 
     @BeforeClass
     public static void setUpBeforeClass() throws Exception {
-        data = new Data();
-        data.setData("".getBytes());
-
-        byte[] bytePayload = data.serialize();
         byte[] byteHeader = {
-                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
-                (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
-                (byte) 0xca, (byte) 0x2a, (byte) 0x14, (byte) 0xff, (byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce
+            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+            (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18,
+            (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
+            (byte) 0xca, (byte) 0x2a, (byte) 0x14, (byte) 0xff,
+            (byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce,
+            (byte) 0x02, (byte) 0x01, (byte) 0x11, (byte) 0x22,
+            (byte) 0x33, (byte) 0x44, (byte) 0x55, (byte) 0x66
         };
-        bytePacket = new byte[byteHeader.length + bytePayload.length];
+        bytePacket = new byte[byteHeader.length];
         System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
-        System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
     }
 
     /**
@@ -63,7 +68,8 @@
     public void testSerialize() {
         NeighborSolicitation ns = new NeighborSolicitation();
         ns.setTargetAddress(TARGET_ADDRESS);
-        ns.setPayload(data);
+        ns.addOption(NeighborDiscoveryOptions.TYPE_TARGET_LL_ADDRESS,
+                     MAC_ADDRESS.toBytes());
 
         assertArrayEquals(ns.serialize(), bytePacket);
     }
@@ -77,6 +83,13 @@
         ns.deserialize(bytePacket, 0, bytePacket.length);
 
         assertArrayEquals(ns.getTargetAddress(), TARGET_ADDRESS);
+
+        // Check the option(s)
+        assertThat(ns.getOptions().size(), is(1));
+        NeighborDiscoveryOptions.Option option = ns.getOptions().get(0);
+        assertThat(option.type(),
+                   is(NeighborDiscoveryOptions.TYPE_TARGET_LL_ADDRESS));
+        assertArrayEquals(option.data(), MAC_ADDRESS.toBytes());
     }
 
     /**
@@ -86,9 +99,13 @@
     public void testEqual() {
         NeighborSolicitation ns1 = new NeighborSolicitation();
         ns1.setTargetAddress(TARGET_ADDRESS);
+        ns1.addOption(NeighborDiscoveryOptions.TYPE_TARGET_LL_ADDRESS,
+                      MAC_ADDRESS.toBytes());
 
         NeighborSolicitation ns2 = new NeighborSolicitation();
         ns2.setTargetAddress(TARGET_ADDRESS2);
+        ns2.addOption(NeighborDiscoveryOptions.TYPE_TARGET_LL_ADDRESS,
+                      MAC_ADDRESS.toBytes());
 
         assertTrue(ns1.equals(ns1));
         assertFalse(ns1.equals(ns2));
