diff --git a/apps/dhcp/api/src/main/java/org/onosproject/dhcp/DhcpService.java b/apps/dhcp/api/src/main/java/org/onosproject/dhcp/DhcpService.java
index e356c38..ae61023 100644
--- a/apps/dhcp/api/src/main/java/org/onosproject/dhcp/DhcpService.java
+++ b/apps/dhcp/api/src/main/java/org/onosproject/dhcp/DhcpService.java
@@ -58,15 +58,15 @@
 
     /**
      * Registers a static IP mapping with the DHCP Server.
-     * Supports the request from OpenStack
+     * Supports rangeNotEnforced option
      *
      * @param macID macID of the client
      * @param ipAddress IP Address requested for the client
-     * @param fromOpenStack true if the request is from OpenStack
-     * @param addressList subnetMask, DHCP/Router/Domain Server IP Address if the request from OpenStack
+     * @param rangeNotEnforced true if rangeNotEnforced was set and the mapping will be eternal
+     * @param addressList subnetMask, DHCP/Router/DNS IP Addresses if rangeNotEnforced was set
      * @return true if the mapping was successfully added, false otherwise
      */
-    boolean setStaticMapping(MacAddress macID, Ip4Address ipAddress, boolean fromOpenStack,
+    boolean setStaticMapping(MacAddress macID, Ip4Address ipAddress, boolean rangeNotEnforced,
                              List<Ip4Address> addressList);
 
     /**
diff --git a/apps/dhcp/api/src/main/java/org/onosproject/dhcp/DhcpStore.java b/apps/dhcp/api/src/main/java/org/onosproject/dhcp/DhcpStore.java
index bd2e16b..cdfadf7 100644
--- a/apps/dhcp/api/src/main/java/org/onosproject/dhcp/DhcpStore.java
+++ b/apps/dhcp/api/src/main/java/org/onosproject/dhcp/DhcpStore.java
@@ -52,12 +52,11 @@
      * @param hostId Host Id of the client requesting an IP
      * @param ipAddr IP Address being requested
      * @param leaseTime Lease time offered by the server for this mapping
-     * @param fromOpenStack true if the request is from Openstack
-     * @param addressList subnetMask, DHCP IP Address, Router IP Address, Domain Server IP Address if the request
-     *                    from OpenStack
+     * @param rangeNotEnforced true if rangeNotEnforced was set
+     * @param addressList subnetMask, DHCP/Router/DNS IP Addresses if rangeNotEnforced was set
      * @return returns true if the assignment was successful, false otherwise
      */
-    boolean assignIP(HostId hostId, Ip4Address ipAddr, int leaseTime, boolean fromOpenStack,
+    boolean assignIP(HostId hostId, Ip4Address ipAddr, int leaseTime, boolean rangeNotEnforced,
                      List<Ip4Address> addressList);
 
 
@@ -95,11 +94,11 @@
      *
      * @param macID macID of the client
      * @param ipAddr IP Address requested for the client
-     * @param fromOpenStack true if the request is from Openstack
-     * @param addressList subnetMask, DHCP/Router/Domain Server IP Address if the request from OpenStack
+     * @param rangeNotEnforced true if rangeNotEnforced was set
+     * @param addressList subnetMask, DHCP/Router/DNS IP Addresses rangeNotEnforced was set
      * @return true if the mapping was successfully registered, false otherwise
      */
-    boolean assignStaticIP(MacAddress macID, Ip4Address ipAddr, boolean fromOpenStack, List<Ip4Address> addressList);
+    boolean assignStaticIP(MacAddress macID, Ip4Address ipAddr, boolean rangeNotEnforced, List<Ip4Address> addressList);
 
     /**
      * Removes a static IP mapping associated with the given MAC ID from the DHCP Server.
diff --git a/apps/dhcp/api/src/main/java/org/onosproject/dhcp/IpAssignment.java b/apps/dhcp/api/src/main/java/org/onosproject/dhcp/IpAssignment.java
index 998579e..5610fec 100644
--- a/apps/dhcp/api/src/main/java/org/onosproject/dhcp/IpAssignment.java
+++ b/apps/dhcp/api/src/main/java/org/onosproject/dhcp/IpAssignment.java
@@ -41,7 +41,7 @@
 
     private final Ip4Address domainServer;
 
-    private final boolean fromOpenStack;
+    private final boolean rangeNotEnforced;
 
     private final AssignmentStatus assignmentStatus;
 
@@ -54,7 +54,7 @@
         /**
          * IP Assignment has been requested by a OpenStack.
          */
-        Option_Requested_From_OpenStack,
+        Option_RangeNotEnforced,
         /**
          * IP has been assigned to a host.
          */
@@ -78,13 +78,13 @@
      * @param dhcpServer
      * @param routerAddress
      * @param domainServer
-     * @param fromOpenStack
+     * @param rangeNotEnforced
      */
     private IpAssignment(Ip4Address ipAddress,
                          long leasePeriod,
                          Date timestamp,
                          AssignmentStatus assignmentStatus, Ip4Address subnetMask, Ip4Address dhcpServer,
-                         Ip4Address routerAddress, Ip4Address domainServer, boolean fromOpenStack) {
+                         Ip4Address routerAddress, Ip4Address domainServer, boolean rangeNotEnforced) {
         this.ipAddress = ipAddress;
         this.leasePeriod = leasePeriod;
         this.timestamp = timestamp;
@@ -93,7 +93,7 @@
         this.dhcpServer = dhcpServer;
         this.routerAddress = routerAddress;
         this.domainServer = domainServer;
-        this.fromOpenStack = fromOpenStack;
+        this.rangeNotEnforced = rangeNotEnforced;
     }
 
     /**
@@ -157,8 +157,8 @@
         return domainServer;
     }
 
-    public boolean fromOpenStack() {
-        return fromOpenStack;
+    public boolean rangeNotEnforced() {
+        return rangeNotEnforced;
     }
 
     @Override
@@ -172,7 +172,7 @@
                 .add("dhcpServer", dhcpServer)
                 .add("routerAddress", routerAddress)
                 .add("domainServer", domainServer)
-                .add("fromOpenStack", fromOpenStack)
+                .add("rangeNotEnforced", rangeNotEnforced)
                 .toString();
     }
 
@@ -216,7 +216,7 @@
 
         private Ip4Address routerAddress;
 
-        private boolean fromOpenStack = false;
+        private boolean rangeNotEnforced = false;
 
         private Builder() {
 
@@ -232,7 +232,7 @@
         public IpAssignment build() {
             validateInputs();
             return new IpAssignment(ipAddress, leasePeriod, timeStamp, assignmentStatus, subnetMask,
-                    dhcpServer, domainServer, routerAddress, fromOpenStack);
+                    dhcpServer, domainServer, routerAddress, rangeNotEnforced);
         }
 
         public Builder ipAddress(Ip4Address addr) {
@@ -275,8 +275,8 @@
             return this;
         }
 
-        public Builder fromOpenStack(boolean fromOpenStack) {
-            this.fromOpenStack = fromOpenStack;
+        public Builder rangeNotEnforced(boolean rangeNotEnforced) {
+            this.rangeNotEnforced = rangeNotEnforced;
             return this;
         }
 
@@ -287,16 +287,16 @@
             checkNotNull(leasePeriod, "Lease Period must be specified");
             checkNotNull(timeStamp, "Timestamp must be specified");
 
-            if (fromOpenStack) {
-                checkNotNull(subnetMask, "subnetMask must be specified in case of OpenStack");
-                checkNotNull(dhcpServer, "dhcpServer must be specified in case of OpenStack");
-                checkNotNull(domainServer, "domainServer must be specified in case of OpenStack");
-                checkNotNull(routerAddress, "routerAddress must be specified in case of OpenStack");
+            if (rangeNotEnforced) {
+                checkNotNull(subnetMask, "subnetMask must be specified in case of rangeNotEnforced");
+                checkNotNull(dhcpServer, "dhcpServer must be specified in case of rangeNotEnforced");
+                checkNotNull(domainServer, "domainServer must be specified in case of rangeNotEnforced");
+                checkNotNull(routerAddress, "routerAddress must be specified in case of rangeNotEnforced");
             }
 
             switch (assignmentStatus) {
                 case Option_Requested:
-                case Option_Requested_From_OpenStack:
+                case Option_RangeNotEnforced:
                 case Option_Assigned:
                 case Option_Expired:
                     break;
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);
