diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
index e7acf66..a1707e0 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
@@ -241,12 +241,12 @@
     }
 
     @Override
-    public boolean setStaticMapping(MacAddress macID, Ip4Address ipAddress, boolean fromOpenStack,
+    public boolean setStaticMapping(MacAddress macID, Ip4Address ipAddress, boolean rangeNotEnforced,
                                     List<Ip4Address> addressList) {
         log.debug("setStaticMapping is called with Mac: {}, Ip: {} addressList: {}",
                 macID.toString(), ipAddress.toString(), addressList.toString());
 
-        return dhcpStore.assignStaticIP(macID, ipAddress, fromOpenStack, addressList);
+        return dhcpStore.assignStaticIP(macID, ipAddress, rangeNotEnforced, addressList);
     }
 
     @Override
@@ -279,7 +279,7 @@
 
             ipAssignment = dhcpStore.getIpAssignmentFromAllocationMap(HostId.hostId(packet.getSourceMAC()));
 
-            if (ipAssignment != null && ipAssignment.fromOpenStack()) {
+            if (ipAssignment != null && ipAssignment.rangeNotEnforced()) {
                 subnetMaskReply = ipAssignment.subnetMask();
                 dhcpServerReply = ipAssignment.dhcpServer();
                 domainServerReply = ipAssignment.domainServer();
@@ -484,8 +484,9 @@
                     if (flagIfServerIP && flagIfRequestedIP) {
                         // SELECTING state
 
+
                         if (dhcpStore.getIpAssignmentFromAllocationMap(HostId.hostId(clientMac))
-                                .fromOpenStack()) {
+                                .rangeNotEnforced()) {
                             outgoingPacketType = DHCPPacketType.DHCPACK;
                             Ethernet ethReply = buildReply(packet, requestedIP, (byte) outgoingPacketType.getValue());
                             sendReply(context, ethReply);
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DistributedDhcpStore.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DistributedDhcpStore.java
index 0f25495..ad4522c 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DistributedDhcpStore.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DistributedDhcpStore.java
@@ -106,7 +106,7 @@
             IpAssignment.AssignmentStatus status = assignmentInfo.assignmentStatus();
             Ip4Address ipAddr = assignmentInfo.ipAddress();
 
-            if (assignmentInfo.fromOpenStack()) {
+            if (assignmentInfo.rangeNotEnforced()) {
                 return assignmentInfo.ipAddress();
             } else if (status == IpAssignment.AssignmentStatus.Option_Assigned ||
                     status == IpAssignment.AssignmentStatus.Option_Requested) {
@@ -163,12 +163,15 @@
     }
 
     @Override
-    public boolean assignIP(HostId hostId, Ip4Address ipAddr, int leaseTime, boolean fromOpenStack,
+    public boolean assignIP(HostId hostId, Ip4Address ipAddr, int leaseTime, boolean rangeNotEnforced,
                             List<Ip4Address> addressList) {
 
         IpAssignment assignmentInfo;
 
+        log.debug("Assign IP Called w/ Ip4Address: {}, HostId: {}", ipAddr.toString(), hostId.mac().toString());
+
         if (allocationMap.containsKey(hostId)) {
+
             assignmentInfo = allocationMap.get(hostId).value();
             IpAssignment.AssignmentStatus status = assignmentInfo.assignmentStatus();
 
@@ -212,17 +215,17 @@
                 allocationMap.put(hostId, assignmentInfo);
                 return true;
             }
-        } else if (fromOpenStack) {
+        } else if (rangeNotEnforced) {
             assignmentInfo = IpAssignment.builder()
                                     .ipAddress(ipAddr)
                                     .timestamp(new Date())
                                     .leasePeriod(leaseTime)
-                                    .fromOpenStack(true)
-                                    .assignmentStatus(IpAssignment.AssignmentStatus.Option_Requested_From_OpenStack)
+                                    .rangeNotEnforced(true)
+                                    .assignmentStatus(IpAssignment.AssignmentStatus.Option_RangeNotEnforced)
                                     .subnetMask((Ip4Address) addressList.toArray()[0])
                                     .dhcpServer((Ip4Address) addressList.toArray()[1])
-                                    .domainServer((Ip4Address) addressList.toArray()[2])
-                                    .routerAddress((Ip4Address) addressList.toArray()[3])
+                                    .routerAddress((Ip4Address) addressList.toArray()[2])
+                                    .domainServer((Ip4Address) addressList.toArray()[3])
                                     .build();
             allocationMap.put(hostId, assignmentInfo);
             return true;
@@ -259,7 +262,7 @@
         for (Map.Entry<HostId, Versioned<IpAssignment>> entry: allocationMap.entrySet()) {
             assignment = entry.getValue().value();
             if (assignment.assignmentStatus() == IpAssignment.AssignmentStatus.Option_Assigned
-                    || assignment.assignmentStatus() == IpAssignment.AssignmentStatus.Option_Requested_From_OpenStack) {
+                    || assignment.assignmentStatus() == IpAssignment.AssignmentStatus.Option_RangeNotEnforced) {
                 validMapping.put(entry.getKey(), assignment);
             }
         }
@@ -276,10 +279,10 @@
     }
 
     @Override
-    public boolean assignStaticIP(MacAddress macID, Ip4Address ipAddr, boolean fromOpenStack,
+    public boolean assignStaticIP(MacAddress macID, Ip4Address ipAddr, boolean rangeNotEnforced,
                                   List<Ip4Address> addressList) {
         HostId host = HostId.hostId(macID);
-        return assignIP(host, ipAddr, -1, fromOpenStack, addressList);
+        return assignIP(host, ipAddr, -1, rangeNotEnforced, addressList);
     }
 
     @Override
@@ -287,6 +290,12 @@
         HostId host = HostId.hostId(macID);
         if (allocationMap.containsKey(host)) {
             IpAssignment assignment = allocationMap.get(host).value();
+
+            if (assignment.rangeNotEnforced()) {
+                allocationMap.remove(host);
+                return true;
+            }
+
             Ip4Address freeIP = assignment.ipAddress();
             if (assignment.leasePeriod() < 0) {
                 allocationMap.remove(host);
