diff --git a/apps/dhcp/src/main/java/org/onosproject/dhcp/impl/DHCPManager.java b/apps/dhcp/src/main/java/org/onosproject/dhcp/impl/DHCPManager.java
index 04bba9c..8084654 100644
--- a/apps/dhcp/src/main/java/org/onosproject/dhcp/impl/DHCPManager.java
+++ b/apps/dhcp/src/main/java/org/onosproject/dhcp/impl/DHCPManager.java
@@ -25,6 +25,7 @@
 import org.onlab.packet.ARP;
 import org.onlab.packet.DHCP;
 import org.onlab.packet.DHCPOption;
+import org.onlab.packet.DHCPPacketType;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.Ip4Address;
@@ -395,7 +396,7 @@
                 builder.setOutput(sourcePoint.port());
 
                 packetService.emit(new DefaultOutboundPacket(sourcePoint.deviceId(),
-                                    builder.build(), ByteBuffer.wrap(reply.serialize())));
+                        builder.build(), ByteBuffer.wrap(reply.serialize())));
             }
         }
 
@@ -435,20 +436,20 @@
                 }
 
                 String ipOffered = "";
-                DHCP.DHCPMessageType outgoingPacketType;
+                DHCPPacketType outgoingPacketType;
                 MacAddress clientMAC = new MacAddress(dhcpPayload.getClientHardwareAddress());
 
-                if (incomingPacketType == DHCP.DHCPMessageType.MessageType_Discover.getValue()) {
+                if (incomingPacketType == DHCPPacketType.DHCPDISCOVER.getValue()) {
 
-                    outgoingPacketType = DHCP.DHCPMessageType.MessageType_Offer;
+                    outgoingPacketType = DHCPPacketType.DHCPOFFER;
                     ipOffered = dhcpStore.suggestIP(clientMAC, requestedIP).toString();
 
-                    Ethernet ethReply = buildReply(packet, ipOffered, outgoingPacketType.getValue());
+                    Ethernet ethReply = buildReply(packet, ipOffered, (byte) outgoingPacketType.getValue());
                     sendReply(context, ethReply);
 
-                } else if (incomingPacketType == DHCP.DHCPMessageType.MessageType_Request.getValue()) {
+                } else if (incomingPacketType == DHCPPacketType.DHCPREQUEST.getValue()) {
 
-                    outgoingPacketType = DHCP.DHCPMessageType.MessageType_ACK;
+                    outgoingPacketType = DHCPPacketType.DHCPACK;
 
                     if (flagIfServerIP && flagIfRequestedIP) {
                         // SELECTING state
@@ -456,7 +457,7 @@
                                 dhcpStore.assignIP(clientMAC, requestedIP, leaseTime)) {
 
                             Ethernet ethReply = buildReply(packet, requestedIP.toString(),
-                                    outgoingPacketType.getValue());
+                                    (byte) outgoingPacketType.getValue());
                             sendReply(context, ethReply);
                             discoverHost(context, requestedIP);
                         }
@@ -464,7 +465,7 @@
                         // INIT-REBOOT state
                         if (dhcpStore.assignIP(clientMAC, requestedIP, leaseTime)) {
                             Ethernet ethReply = buildReply(packet, requestedIP.toString(),
-                                    outgoingPacketType.getValue());
+                                    (byte) outgoingPacketType.getValue());
                             sendReply(context, ethReply);
                             discoverHost(context, requestedIP);
                         }
@@ -475,13 +476,13 @@
                             Ip4Address clientIaddr = Ip4Address.valueOf(ciaadr);
                             if (dhcpStore.assignIP(clientMAC, clientIaddr, leaseTime)) {
                                 Ethernet ethReply = buildReply(packet, clientIaddr.toString(),
-                                        outgoingPacketType.getValue());
+                                        (byte) outgoingPacketType.getValue());
                                 sendReply(context, ethReply);
                                 discoverHost(context, clientIaddr);
                             }
                         }
                     }
-                } else if (incomingPacketType == DHCP.DHCPMessageType.MessageType_Release.getValue()) {
+                } else if (incomingPacketType == DHCPPacketType.DHCPRELEASE.getValue()) {
 
                     dhcpStore.releaseIP(clientMAC);
                 }
@@ -628,7 +629,7 @@
             }
             if ((cfg.startIP() != null) && (cfg.endIP() != null)) {
                 dhcpStore.populateIPPoolfromRange(Ip4Address.valueOf(cfg.startIP()),
-                                                    Ip4Address.valueOf(cfg.endIP()));
+                        Ip4Address.valueOf(cfg.endIP()));
             }
         }
 
diff --git a/apps/dhcp/src/test/java/org/onosproject/dhcp/impl/DHCPManagerTest.java b/apps/dhcp/src/test/java/org/onosproject/dhcp/impl/DHCPManagerTest.java
index 3eda1bc..0abdc33 100644
--- a/apps/dhcp/src/test/java/org/onosproject/dhcp/impl/DHCPManagerTest.java
+++ b/apps/dhcp/src/test/java/org/onosproject/dhcp/impl/DHCPManagerTest.java
@@ -21,6 +21,7 @@
 import org.junit.Test;
 import org.onlab.packet.DHCP;
 import org.onlab.packet.DHCPOption;
+import org.onlab.packet.DHCPPacketType;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.Ip4Address;
@@ -102,7 +103,7 @@
      */
     @Test
     public void testDiscover() {
-        Ethernet reply = constructDHCPPacket(DHCP.DHCPMessageType.MessageType_Discover);
+        Ethernet reply = constructDHCPPacket(DHCPPacketType.DHCPDISCOVER);
         sendPacket(reply);
     }
 
@@ -111,7 +112,7 @@
      */
     @Test
     public void testRequest() {
-        Ethernet reply = constructDHCPPacket(DHCP.DHCPMessageType.MessageType_Request);
+        Ethernet reply = constructDHCPPacket(DHCPPacketType.DHCPREQUEST);
         sendPacket(reply);
     }
 
@@ -131,10 +132,10 @@
 
     /**
      * Constructs an Ethernet packet containing a DHCP Payload.
-     * @param messageType DHCP Message Type
+     * @param packetType DHCP Message Type
      * @return Ethernet packet
      */
-    private Ethernet constructDHCPPacket(DHCP.DHCPMessageType messageType) {
+    private Ethernet constructDHCPPacket(DHCPPacketType packetType) {
 
         // Ethernet Frame.
         Ethernet ethReply = new Ethernet();
@@ -173,7 +174,7 @@
         // DHCP Message Type.
         option.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
         option.setLength((byte) 1);
-        byte[] optionData = {messageType.getValue()};
+        byte[] optionData = {(byte) packetType.getValue()};
         option.setData(optionData);
         optionList.add(option);
 
diff --git a/utils/misc/src/main/java/org/onlab/packet/DHCP.java b/utils/misc/src/main/java/org/onlab/packet/DHCP.java
index f7a6685..de5b43f 100644
--- a/utils/misc/src/main/java/org/onlab/packet/DHCP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/DHCP.java
@@ -73,22 +73,6 @@
         }
     }
 
-    public enum DHCPMessageType {
-        MessageType_Discover((byte) 1), MessageType_Offer((byte) 2), MessageType_Request((byte) 3),
-        MessageType_Decline((byte) 4), MessageType_ACK((byte) 5), MessageType_Nak((byte) 6),
-        MessageType_Release((byte) 7), MessageType_Inform((byte) 8);
-
-        protected byte value;
-
-        private DHCPMessageType(final byte value) {
-            this.value = value;
-        }
-
-        public byte getValue() {
-            return this.value;
-        }
-    }
-
     protected byte opCode;
     protected byte hardwareType;
     protected byte hardwareAddressLength;
