diff --git a/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java b/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
index b8a93bb..ffe6c41 100644
--- a/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
+++ b/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
@@ -48,8 +48,8 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IPacket;
 import org.onlab.packet.IPv6;
-import org.onlab.packet.NeighborAdvertisement;
-import org.onlab.packet.NeighborSolicitation;
+import org.onlab.packet.ndp.NeighborAdvertisement;
+import org.onlab.packet.ndp.NeighborSolicitation;
 import org.onlab.packet.VlanId;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
diff --git a/utils/misc/src/main/java/org/onlab/packet/ICMP6.java b/utils/misc/src/main/java/org/onlab/packet/ICMP6.java
index 4ad8f19..13deab2 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ICMP6.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ICMP6.java
@@ -18,6 +18,11 @@
 
 package org.onlab.packet;
 
+import org.onlab.packet.ndp.NeighborAdvertisement;
+import org.onlab.packet.ndp.NeighborSolicitation;
+import org.onlab.packet.ndp.Redirect;
+import org.onlab.packet.ndp.RouterAdvertisement;
+import org.onlab.packet.ndp.RouterSolicitation;
 import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Map;
@@ -32,12 +37,16 @@
     public static final byte ROUTER_ADVERTISEMENT = (byte) 0x86;
     public static final byte NEIGHBOR_SOLICITATION = (byte) 0x87;
     public static final byte NEIGHBOR_ADVERTISEMENT = (byte) 0x88;
+    public static final byte REDIRECT = (byte) 0x89;
     public static final Map<Byte, Class<? extends IPacket>> PROTOCOL_CLASS_MAP =
             new HashMap<>();
 
     static {
+        ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.ROUTER_SOLICITATION, RouterSolicitation.class);
+        ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.ROUTER_ADVERTISEMENT, RouterAdvertisement.class);
         ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.NEIGHBOR_SOLICITATION, NeighborSolicitation.class);
         ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.NEIGHBOR_ADVERTISEMENT, NeighborAdvertisement.class);
+        ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.REDIRECT, Redirect.class);
     }
 
     protected byte icmpType;
diff --git a/utils/misc/src/main/java/org/onlab/packet/NeighborAdvertisement.java b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborAdvertisement.java
similarity index 95%
rename from utils/misc/src/main/java/org/onlab/packet/NeighborAdvertisement.java
rename to utils/misc/src/main/java/org/onlab/packet/ndp/NeighborAdvertisement.java
index 4b8688b..f144b84 100644
--- a/utils/misc/src/main/java/org/onlab/packet/NeighborAdvertisement.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborAdvertisement.java
@@ -16,13 +16,18 @@
 
 
 
-package org.onlab.packet;
+package org.onlab.packet.ndp;
+
+import org.onlab.packet.BasePacket;
+import org.onlab.packet.Data;
+import org.onlab.packet.IPacket;
+import org.onlab.packet.Ip6Address;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
 /**
- * Implements ICMPv6 Neighbor Solicitation packet format. (RFC 4861)
+ * Implements ICMPv6 Neighbor Advertisement packet format. (RFC 4861)
  */
 public class NeighborAdvertisement extends BasePacket {
     public static final byte HEADER_LENGTH = 20; // bytes
diff --git a/utils/misc/src/main/java/org/onlab/packet/NeighborSolicitation.java b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborSolicitation.java
similarity index 95%
rename from utils/misc/src/main/java/org/onlab/packet/NeighborSolicitation.java
rename to utils/misc/src/main/java/org/onlab/packet/ndp/NeighborSolicitation.java
index 21ddc3a..6da8503 100644
--- a/utils/misc/src/main/java/org/onlab/packet/NeighborSolicitation.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborSolicitation.java
@@ -16,7 +16,12 @@
 
 
 
-package org.onlab.packet;
+package org.onlab.packet.ndp;
+
+import org.onlab.packet.BasePacket;
+import org.onlab.packet.Data;
+import org.onlab.packet.IPacket;
+import org.onlab.packet.Ip6Address;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
diff --git a/utils/misc/src/main/java/org/onlab/packet/NeighborSolicitation.java b/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
similarity index 66%
copy from utils/misc/src/main/java/org/onlab/packet/NeighborSolicitation.java
copy to utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
index 21ddc3a..2c9450b 100644
--- a/utils/misc/src/main/java/org/onlab/packet/NeighborSolicitation.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
@@ -16,18 +16,24 @@
 
 
 
-package org.onlab.packet;
+package org.onlab.packet.ndp;
+
+import org.onlab.packet.BasePacket;
+import org.onlab.packet.Data;
+import org.onlab.packet.IPacket;
+import org.onlab.packet.Ip6Address;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
 /**
- * Implements ICMPv6 Neighbor Solicitation packet format. (RFC 4861)
+ * Implements ICMPv6 Redirect packet format. (RFC 4861)
  */
-public class NeighborSolicitation extends BasePacket {
-    public static final byte HEADER_LENGTH = 20; // bytes
+public class Redirect extends BasePacket {
+    public static final byte HEADER_LENGTH = 36; // bytes
 
     protected byte[] targetAddress = new byte[Ip6Address.BYTE_LENGTH];
+    protected byte[] destinationAddress = new byte[Ip6Address.BYTE_LENGTH];
 
     /**
      * Gets target address.
@@ -44,11 +50,31 @@
      * @param targetAddress the target IPv6 address to set
      * @return this
      */
-    public NeighborSolicitation setTargetAddress(final byte[] targetAddress) {
+    public Redirect setTargetAddress(final byte[] targetAddress) {
         this.targetAddress = Arrays.copyOfRange(targetAddress, 0, Ip6Address.BYTE_LENGTH);
         return this;
     }
 
+    /**
+     * Gets destination address.
+     *
+     * @return the destination IPv6 address
+     */
+    public byte[] getDestinationAddress() {
+        return this.destinationAddress;
+    }
+
+    /**
+     * Sets destination address.
+     *
+     * @param destinationAddress the destination IPv6 address to set
+     * @return this
+     */
+    public Redirect setDestinationAddress(final byte[] destinationAddress) {
+        this.destinationAddress = Arrays.copyOfRange(destinationAddress, 0, Ip6Address.BYTE_LENGTH);
+        return this;
+    }
+
     @Override
     public byte[] serialize() {
         byte[] payloadData = null;
@@ -64,6 +90,8 @@
 
         bb.putInt(0);
         bb.put(this.targetAddress, 0, Ip6Address.BYTE_LENGTH);
+        bb.put(this.destinationAddress, 0, Ip6Address.BYTE_LENGTH);
+
         if (payloadData != null) {
             bb.put(payloadData);
         }
@@ -77,6 +105,7 @@
 
         bb.getInt();
         bb.get(this.targetAddress, 0, Ip6Address.BYTE_LENGTH);
+        bb.get(this.destinationAddress, 0, Ip6Address.BYTE_LENGTH);
 
         this.payload = new Data();
         this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
@@ -100,6 +129,10 @@
         for (int i = 0; i < 4; i++) {
             result = prime * result + bb.getInt();
         }
+        bb = ByteBuffer.wrap(this.destinationAddress);
+        for (int i = 0; i < 4; i++) {
+            result = prime * result + bb.getInt();
+        }
         return result;
     }
 
@@ -116,13 +149,16 @@
         if (!super.equals(obj)) {
             return false;
         }
-        if (!(obj instanceof NeighborSolicitation)) {
+        if (!(obj instanceof Redirect)) {
             return false;
         }
-        final NeighborSolicitation other = (NeighborSolicitation) obj;
+        final Redirect other = (Redirect) obj;
         if (!Arrays.equals(this.targetAddress, other.targetAddress)) {
             return false;
         }
+        if (!Arrays.equals(this.destinationAddress, other.destinationAddress)) {
+            return false;
+        }
         return true;
     }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/RouterAdvertisement.java b/utils/misc/src/main/java/org/onlab/packet/ndp/RouterAdvertisement.java
new file mode 100644
index 0000000..7d36133
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/RouterAdvertisement.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright 2014 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.onlab.packet.ndp;
+
+import org.onlab.packet.BasePacket;
+import org.onlab.packet.Data;
+import org.onlab.packet.IPacket;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Implements ICMPv6 Router Advertisement packet format. (RFC 4861)
+ */
+public class RouterAdvertisement extends BasePacket {
+    public static final byte HEADER_LENGTH = 12; // bytes
+
+    protected byte currentHopLimit;
+    protected byte mFlag;
+    protected byte oFlag;
+    protected short routerLifetime;
+    protected int reachableTime;
+    protected int retransmitTimer;
+
+    /**
+     * Gets current hop limit.
+     *
+     * @return the current hop limit
+     */
+    public byte getCurrentHopLimit() {
+        return this.currentHopLimit;
+    }
+
+    /**
+     * Sets current hop limit.
+     *
+     * @param currentHopLimit the current hop limit to set
+     * @return this
+     */
+    public RouterAdvertisement setCurrentHopLimit(final byte currentHopLimit) {
+        this.currentHopLimit = currentHopLimit;
+        return this;
+    }
+
+    /**
+     * Gets managed address configuration flag.
+     *
+     * @return the managed address configuration flag
+     */
+    public byte getMFlag() {
+        return this.mFlag;
+    }
+
+    /**
+     * Sets managed address configuration flag.
+     *
+     * @param mFlag the managed address configuration flag to set
+     * @return this
+     */
+    public RouterAdvertisement setMFlag(final byte mFlag) {
+        this.mFlag = mFlag;
+        return this;
+    }
+
+    /**
+     * Gets other configuration flag.
+     *
+     * @return the other configuration flag
+     */
+    public byte getOFlag() {
+        return this.oFlag;
+    }
+
+    /**
+     * Sets other configuration flag.
+     *
+     * @param oFlag the other configuration flag to set
+     * @return this
+     */
+    public RouterAdvertisement setOFlag(final byte oFlag) {
+        this.oFlag = oFlag;
+        return this;
+    }
+
+    /**
+     * Gets router lifetime.
+     *
+     * @return the router lifetime
+     */
+    public short getRouterLifetime() {
+        return this.routerLifetime;
+    }
+
+    /**
+     * Sets router lifetime.
+     *
+     * @param routerLifetime the router lifetime to set
+     * @return this
+     */
+    public RouterAdvertisement setRouterLifetime(final short routerLifetime) {
+        this.routerLifetime = routerLifetime;
+        return this;
+    }
+
+    /**
+     * Gets reachable time.
+     *
+     * @return the reachable time
+     */
+    public int getReachableTime() {
+        return this.reachableTime;
+    }
+
+    /**
+     * Sets reachable time.
+     *
+     * @param reachableTime the reachable time to set
+     * @return this
+     */
+    public RouterAdvertisement setReachableTime(final int reachableTime) {
+        this.reachableTime = reachableTime;
+        return this;
+    }
+
+    /**
+     * Gets retransmission timer.
+     *
+     * @return the retransmission timer
+     */
+    public int getRetransmitTimer() {
+        return this.retransmitTimer;
+    }
+
+    /**
+     * Sets retransmission timer.
+     *
+     * @param retransmitTimer the retransmission timer to set
+     * @return this
+     */
+    public RouterAdvertisement setRetransmitTimer(final int retransmitTimer) {
+        this.retransmitTimer = retransmitTimer;
+        return this;
+    }
+
+    @Override
+    public byte[] serialize() {
+        byte[] payloadData = null;
+        if (this.payload != null) {
+            this.payload.setParent(this);
+            payloadData = this.payload.serialize();
+        }
+
+        int payloadLength = payloadData == null ? 0 : (short) payloadData.length;
+
+        final byte[] data = new byte[HEADER_LENGTH + payloadLength];
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+
+        bb.put(this.currentHopLimit);
+        bb.put((byte) ((this.mFlag & 0x1) << 7 | (this.oFlag & 0x1) << 6));
+        bb.putShort(routerLifetime);
+        bb.putInt(reachableTime);
+        bb.putInt(retransmitTimer);
+
+        if (payloadData != null) {
+            bb.put(payloadData);
+        }
+
+        return data;
+    }
+
+    @Override
+    public IPacket deserialize(byte[] data, int offset, int length) {
+        final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+        int bscratch;
+
+        this.currentHopLimit = bb.get();
+        bscratch = bb.get();
+        this.mFlag = (byte) ((bscratch >> 7) & 0x1);
+        this.oFlag = (byte) ((bscratch >> 6) & 0x1);
+        this.routerLifetime = bb.getShort();
+        this.reachableTime = bb.getInt();
+        this.retransmitTimer = bb.getInt();
+
+        this.payload = new Data();
+        this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
+                - bb.position());
+        this.payload.setParent(this);
+
+        return this;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 5807;
+        int result = super.hashCode();
+        result = prime * result + this.currentHopLimit;
+        result = prime * result + this.mFlag;
+        result = prime * result + this.oFlag;
+        result = prime * result + this.routerLifetime;
+        result = prime * result + this.reachableTime;
+        result = prime * result + this.retransmitTimer;
+        return result;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof RouterAdvertisement)) {
+            return false;
+        }
+        final RouterAdvertisement other = (RouterAdvertisement) obj;
+        if (this.currentHopLimit != other.currentHopLimit) {
+            return false;
+        }
+        if (this.mFlag != other.mFlag) {
+            return false;
+        }
+        if (this.oFlag != other.oFlag) {
+            return false;
+        }
+        if (this.routerLifetime != other.routerLifetime) {
+            return false;
+        }
+        if (this.reachableTime != other.reachableTime) {
+            return false;
+        }
+        if (this.retransmitTimer != other.retransmitTimer) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/RouterSolicitation.java b/utils/misc/src/main/java/org/onlab/packet/ndp/RouterSolicitation.java
new file mode 100644
index 0000000..5334d54
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/RouterSolicitation.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2014 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.onlab.packet.ndp;
+
+import org.onlab.packet.BasePacket;
+import org.onlab.packet.Data;
+import org.onlab.packet.IPacket;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Implements ICMPv6 Router Solicitation packet format. (RFC 4861)
+ */
+public class RouterSolicitation extends BasePacket {
+    public static final byte HEADER_LENGTH = 4; // bytes
+
+    @Override
+    public byte[] serialize() {
+        byte[] payloadData = null;
+        if (this.payload != null) {
+            this.payload.setParent(this);
+            payloadData = this.payload.serialize();
+        }
+
+        int payloadLength = payloadData == null ? 0 : (short) payloadData.length;
+
+        final byte[] data = new byte[HEADER_LENGTH + payloadLength];
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+
+        bb.putInt(0);
+
+        if (payloadData != null) {
+            bb.put(payloadData);
+        }
+
+        return data;
+    }
+
+    @Override
+    public IPacket deserialize(byte[] data, int offset, int length) {
+        final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+
+        bb.getInt();
+
+        this.payload = new Data();
+        this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
+                - bb.position());
+        this.payload.setParent(this);
+
+        return this;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode() {
+        return super.hashCode();
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof RouterSolicitation)) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/package-info.java b/utils/misc/src/main/java/org/onlab/packet/ndp/package-info.java
new file mode 100644
index 0000000..443cce0
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2014 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.
+ */
+
+/**
+ * Utilities for decoding and encoding packets of Neighbor Discovery Protocol
+ * for IPv6 (RFC 4861).
+ */
+package org.onlab.packet.ndp;
diff --git a/utils/misc/src/test/java/org/onlab/packet/NeighborAdvertisementTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
similarity index 92%
rename from utils/misc/src/test/java/org/onlab/packet/NeighborAdvertisementTest.java
rename to utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
index 8627a9b..d0aa944 100644
--- a/utils/misc/src/test/java/org/onlab/packet/NeighborAdvertisementTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
@@ -16,13 +16,17 @@
 
 
 
-package org.onlab.packet;
+package org.onlab.packet.ndp;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.onlab.packet.Data;
 
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
 
 /**
  * Tests for class {@link NeighborAdvertisement}.
@@ -61,6 +65,7 @@
         na.setSolicitedFlag((byte) 1);
         na.setOverrideFlag((byte) 1);
         na.setTargetAddress(TARGET_ADDRESS);
+        na.setPayload(data);
 
         assertArrayEquals(na.serialize(), bytePacket);
     }
diff --git a/utils/misc/src/test/java/org/onlab/packet/NeighborSolicitationTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
similarity index 91%
rename from utils/misc/src/test/java/org/onlab/packet/NeighborSolicitationTest.java
rename to utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
index bb6ec60..d0e5122 100644
--- a/utils/misc/src/test/java/org/onlab/packet/NeighborSolicitationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
@@ -16,15 +16,17 @@
 
 
 
-package org.onlab.packet;
+package org.onlab.packet.ndp;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.onlab.packet.Data;
 
-import static org.junit.Assert.*;
-
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 /**
- * Tests for class {@link org.onlab.packet.NeighborSolicitation}.
+ * Tests for class {@link NeighborSolicitation}.
  */
 public class NeighborSolicitationTest {
     private static final byte[] TARGET_ADDRESS = {
@@ -61,6 +63,7 @@
     public void testSerialize() {
         NeighborSolicitation ns = new NeighborSolicitation();
         ns.setTargetAddress(TARGET_ADDRESS);
+        ns.setPayload(data);
 
         assertArrayEquals(ns.serialize(), bytePacket);
     }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java
new file mode 100644
index 0000000..2f419c7
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2014 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.onlab.packet.ndp;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onlab.packet.Data;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * Tests for class {@link Redirect}.
+ */
+public class RedirectTest {
+    private static final byte[] TARGET_ADDRESS = {
+            (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
+            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
+    };
+    private static final byte[] DESTINATION_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
+    };
+    private static final byte[] DESTINATION_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
+    };
+    private static Data data;
+    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) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (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
+        };
+        bytePacket = new byte[byteHeader.length + bytePayload.length];
+        System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
+        System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
+    }
+
+    /**
+     * Tests serialize and setters.
+     */
+    @Test
+    public void testSerialize() {
+        Redirect rd = new Redirect();
+        rd.setTargetAddress(TARGET_ADDRESS);
+        rd.setDestinationAddress(DESTINATION_ADDRESS);
+        rd.setPayload(data);
+
+        assertArrayEquals(rd.serialize(), bytePacket);
+    }
+
+    /**
+     * Tests deserialize and getters.
+     */
+    @Test
+    public void testDeserialize() {
+        Redirect rd = new Redirect();
+        rd.deserialize(bytePacket, 0, bytePacket.length);
+
+        assertArrayEquals(rd.getTargetAddress(), TARGET_ADDRESS);
+        assertArrayEquals(rd.getDestinationAddress(), DESTINATION_ADDRESS);
+    }
+
+    /**
+     * Tests comparator.
+     */
+    @Test
+    public void testEqual() {
+        Redirect rd1 = new Redirect();
+        rd1.setTargetAddress(TARGET_ADDRESS);
+        rd1.setDestinationAddress(DESTINATION_ADDRESS);
+
+        Redirect rd2 = new Redirect();
+        rd2.setTargetAddress(TARGET_ADDRESS);
+        rd2.setDestinationAddress(DESTINATION_ADDRESS2);
+
+        assertTrue(rd1.equals(rd1));
+        assertFalse(rd1.equals(rd2));
+    }
+}
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java
new file mode 100644
index 0000000..2fd1815
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2014 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.onlab.packet.ndp;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onlab.packet.Data;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for class {@link RouterAdvertisement}.
+ */
+public class RouterAdvertisementTest {
+    private static Data data;
+    private static byte[] bytePacket;
+
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        data = new Data();
+        data.setData("".getBytes());
+
+        byte[] bytePayload = data.serialize();
+        byte[] byteHeader = {
+                (byte) 0x03, (byte) 0xc0, (byte) 0x02, (byte) 0x58,
+                (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0xe8,
+                (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xf4
+        };
+        bytePacket = new byte[byteHeader.length + bytePayload.length];
+        System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
+        System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
+    }
+
+    /**
+     * Tests serialize and setters.
+     */
+    @Test
+    public void testSerialize() {
+        RouterAdvertisement ra = new RouterAdvertisement();
+        ra.setCurrentHopLimit((byte) 3);
+        ra.setMFlag((byte) 1);
+        ra.setOFlag((byte) 1);
+        ra.setRouterLifetime((short) 0x258);
+        ra.setReachableTime(0x3e8);
+        ra.setRetransmitTimer(0x1f4);
+        ra.setPayload(data);
+
+        assertArrayEquals(ra.serialize(), bytePacket);
+    }
+
+    /**
+     * Tests deserialize and getters.
+     */
+    @Test
+    public void testDeserialize() {
+        RouterAdvertisement ra = new RouterAdvertisement();
+        ra.deserialize(bytePacket, 0, bytePacket.length);
+
+        assertThat(ra.getCurrentHopLimit(), is((byte) 3));
+        assertThat(ra.getMFlag(), is((byte) 1));
+        assertThat(ra.getOFlag(), is((byte) 1));
+        assertThat(ra.getRouterLifetime(), is((short) 0x258));
+        assertThat(ra.getReachableTime(), is(0x3e8));
+        assertThat(ra.getRetransmitTimer(), is(0x1f4));
+    }
+
+    /**
+     * Tests comparator.
+     */
+    @Test
+    public void testEqual() {
+        RouterAdvertisement ra1 = new RouterAdvertisement();
+        ra1.setCurrentHopLimit((byte) 3);
+        ra1.setMFlag((byte) 1);
+        ra1.setOFlag((byte) 1);
+        ra1.setRouterLifetime((short) 0x258);
+        ra1.setReachableTime(0x3e8);
+        ra1.setRetransmitTimer(0x1f4);
+
+        RouterAdvertisement ra2 = new RouterAdvertisement();
+        ra2.setCurrentHopLimit((byte) 3);
+        ra2.setMFlag((byte) 0);
+        ra2.setOFlag((byte) 0);
+        ra2.setRouterLifetime((short) 0x1f4);
+        ra2.setReachableTime(0x3e8);
+        ra2.setRetransmitTimer(0x1f4);
+
+        assertTrue(ra1.equals(ra1));
+        assertFalse(ra1.equals(ra2));
+    }
+}
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java
new file mode 100644
index 0000000..a5ce194
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2014 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.onlab.packet.ndp;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onlab.packet.Data;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for class {@link RouterSolicitation}.
+ */
+public class RouterSolicitationTest {
+    private static final byte[] OPTION = {
+        (byte) 0x01, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01
+    };
+    private static Data data;
+    private static byte[] bytePacket;
+
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        data = new Data();
+        data.setData(OPTION);
+
+        byte[] bytePayload = data.serialize();
+        byte[] byteHeader = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
+        bytePacket = new byte[byteHeader.length + bytePayload.length];
+        System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
+        System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
+    }
+
+    /**
+     * Tests serialize and setters.
+     */
+    @Test
+    public void testSerialize() {
+        RouterSolicitation rs = new RouterSolicitation();
+        rs.setPayload(data);
+
+        assertArrayEquals(rs.serialize(), bytePacket);
+    }
+
+    /**
+     * Tests deserialize and getters.
+     */
+    @Test
+    public void testDeserialize() {
+        RouterSolicitation rs = new RouterSolicitation();
+        rs.deserialize(bytePacket, 0, bytePacket.length);
+    }
+
+    /**
+     * Tests comparator.
+     */
+    @Test
+    public void testEqual() {
+        RouterSolicitation rs1 = new RouterSolicitation();
+
+        assertTrue(rs1.equals(rs1));
+    }
+}
