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;
