diff --git a/app/src/main/java/org/opencord/dhcpl2relay/impl/DhcpL2Relay.java b/app/src/main/java/org/opencord/dhcpl2relay/impl/DhcpL2Relay.java
index 0e5b593..2c1081b 100755
--- a/app/src/main/java/org/opencord/dhcpl2relay/impl/DhcpL2Relay.java
+++ b/app/src/main/java/org/opencord/dhcpl2relay/impl/DhcpL2Relay.java
@@ -784,10 +784,21 @@
                     updateDhcpRelayCountersStore(entry, DhcpL2RelayCounters.valueOf("DHCPACK"));
                     break;
                 case DHCPDECLINE:
+                    Ethernet ethernetPacketDecline =
+                            processDhcpPacketFromClient(context, packet);
+                    if (ethernetPacketDecline != null) {
+                        forwardPacket(ethernetPacketDecline, context);
+                    }
                     entry = getSubscriberInfoFromClient(context);
                     updateDhcpRelayCountersStore(entry, DhcpL2RelayCounters.valueOf("DHCPDECLINE"));
                     break;
                 case DHCPNAK:
+                    //reply to dhcp client.
+                    Ethernet ethernetPacketNak =
+                            processDhcpPacketFromServer(context, packet);
+                    if (ethernetPacketNak != null) {
+                        sendReply(ethernetPacketNak, dhcpPayload, context);
+                    }
                     entry = getSubscriberInfoFromServer(dhcpPayload, context);
                     updateDhcpRelayCountersStore(entry, DhcpL2RelayCounters.valueOf("DHCPNACK"));
                     break;
diff --git a/app/src/test/java/org/opencord/dhcpl2relay/impl/DhcpL2RelayTest.java b/app/src/test/java/org/opencord/dhcpl2relay/impl/DhcpL2RelayTest.java
index a0cab4a..6d0524e 100755
--- a/app/src/test/java/org/opencord/dhcpl2relay/impl/DhcpL2RelayTest.java
+++ b/app/src/test/java/org/opencord/dhcpl2relay/impl/DhcpL2RelayTest.java
@@ -151,6 +151,39 @@
     }
 
     /**
+     * Tests the DHCP relay app by sending DHCP Nak Packet.
+     *
+     * @throws Exception when an unhandled error occurs
+     */
+    @Test
+    public void testDhcpNak() {
+
+        Ethernet nakPacket = constructDhcpNakPacket(SERVER_MAC,
+                CLIENT_MAC, DESTINATION_ADDRESS_IP, DHCP_CLIENT_IP_ADDRESS);
+
+        sendPacket(nakPacket, ConnectPoint.deviceConnectPoint(OLT_DEV_ID + "/" + 1));
+
+        Ethernet nakRelayed = (Ethernet) getPacket();
+        compareServerPackets(nakPacket, nakRelayed);
+    }
+
+    /**
+     * Tests the DHCP relay app by sending DHCP Decline Packet.
+     *
+     * @throws Exception when an unhandled error occurs
+     */
+    @Test
+    public void testDhcpDecline() {
+
+        Ethernet declinePacket = constructDhcpDeclinePacket(CLIENT_MAC);
+
+        sendPacket(declinePacket, ConnectPoint.deviceConnectPoint(OLT_DEV_ID + "/" + 1));
+
+        Ethernet declineRelayed = (Ethernet) getPacket();
+        compareClientPackets(declinePacket, declineRelayed);
+    }
+
+    /**
      * Tests the DHCP global counters.
      */
     @Test
diff --git a/app/src/test/java/org/opencord/dhcpl2relay/impl/DhcpL2RelayTestBase.java b/app/src/test/java/org/opencord/dhcpl2relay/impl/DhcpL2RelayTestBase.java
index 85854ab..3d88b38 100755
--- a/app/src/test/java/org/opencord/dhcpl2relay/impl/DhcpL2RelayTestBase.java
+++ b/app/src/test/java/org/opencord/dhcpl2relay/impl/DhcpL2RelayTestBase.java
@@ -729,6 +729,46 @@
     }
 
     /**
+     * Constructs DHCP Nak Packet.
+     *
+     * @return Ethernet packet
+     */
+    Ethernet constructDhcpNakPacket(MacAddress servMac, MacAddress clientMac,
+                                    String ipAddress, String dhcpClientIpAddress) {
+
+        Ethernet pkt = construcEthernetPacket(servMac, clientMac, ipAddress, DHCP.OPCODE_REPLY,
+                clientMac, Ip4Address.valueOf(dhcpClientIpAddress));
+
+        IPv4 ipv4Packet = (IPv4) pkt.getPayload();
+        UDP udpPacket = (UDP) ipv4Packet.getPayload();
+        DHCP dhcpPacket = (DHCP) udpPacket.getPayload();
+
+        dhcpPacket.setOptions(constructDhcpOptions(DHCP.MsgType.DHCPNAK));
+
+        return pkt;
+    }
+
+    /**
+     * Constructs DHCP Decline Packet.
+     *
+     * @return Ethernet packet
+     */
+    Ethernet constructDhcpDeclinePacket(MacAddress clientMac) {
+
+        Ethernet pkt = construcEthernetPacket(clientMac, MacAddress.BROADCAST,
+                "255.255.255.255", DHCP.OPCODE_REQUEST, MacAddress.NONE,
+                Ip4Address.valueOf("0.0.0.0"));
+
+        IPv4 ipv4Packet = (IPv4) pkt.getPayload();
+        UDP udpPacket = (UDP) ipv4Packet.getPayload();
+        DHCP dhcpPacket = (DHCP) udpPacket.getPayload();
+
+        dhcpPacket.setOptions(constructDhcpOptions(DHCP.MsgType.DHCPDECLINE));
+
+        return pkt;
+    }
+
+    /**
      * Constructs DHCP Discover Options.
      *
      * @return Ethernet packet
