diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/cli/DHCPRemoveStaticMapping.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/cli/DHCPRemoveStaticMapping.java
index c238d12..e8f16a4 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/cli/DHCPRemoveStaticMapping.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/cli/DHCPRemoveStaticMapping.java
@@ -34,7 +34,7 @@
     String macAddr = null;
 
     private static final String DHCP_SUCCESS = "Static Mapping Successfully Removed.";
-    private static final String DHCP_FAILURE = "Static Mapping Failed. " +
+    private static final String DHCP_FAILURE = "Static Mapping Removal Failed. " +
                                                 "Either the mapping does not exist or it is not static.";
 
     @Override
diff --git a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/rest/DHCPWebResource.java b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/rest/DHCPWebResource.java
index 639dbf0..deb38c9 100644
--- a/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/rest/DHCPWebResource.java
+++ b/onos-app-dhcpserver/src/main/java/org/onosproject/dhcpserver/rest/DHCPWebResource.java
@@ -15,20 +15,34 @@
  */
 package org.onosproject.dhcpserver.rest;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
 import org.onosproject.dhcpserver.DHCPService;
 import org.onosproject.rest.AbstractWebResource;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
 
 /**
  * Manage DHCP address assignments.
  */
-@Path("/")
+@Path("dhcp")
 public class DHCPWebResource extends AbstractWebResource {
 
+    final DHCPService service = get(DHCPService.class);
+
     /**
      * Get DHCP server configuration data.
      * Shows lease, renewal and rebinding times in seconds.
@@ -46,30 +60,101 @@
         return ok(node.toString()).build();
     }
 
-
-    // POST should accept a single mac/ip binding with
-    /*
-        {
-            "mac": "00:......00",
-            "ip": "12.34.56.78"
-        }
+    /**
+     * Get all MAC/IP mappings.
+     * Shows all MAC/IP mappings held by the DHCP server.
+     *
+     * @return 200 OK
      */
+    @GET
+    @Path("mappings")
+    public Response listMappings() {
+        ObjectNode root = mapper().createObjectNode();
 
-    //    @POST
-    //    @Path("mappings")
+        final Map<MacAddress, Ip4Address> intents = service.listMapping();
+        ArrayNode arrayNode = root.putArray("mappings");
+        intents.entrySet().forEach(i -> arrayNode.add(mapper().createObjectNode()
+                .put("mac", i.getKey().toString())
+                .put("ip", i.getValue().toString())));
+
+        return ok(root.toString()).build();
+    }
 
 
 
-    // GET all mappings should look like this:
-    /*
-        {
-            "mappings": [
-                {
-                    "mac": "00:......00",
-                    "ip": "12.34.56.78",
-                    ...
+    /**
+     * Get all available IPs.
+     * Shows all the IPs in the free pool of the DHCP Server.
+     *
+     * @return 200 OK
+     */
+    @GET
+    @Path("available")
+    public Response listAvailableIPs() {
+        final Iterable<Ip4Address> availableIPList = service.getAvailableIPs();
+
+        final ObjectNode root = mapper().createObjectNode();
+        ArrayNode arrayNode = root.putArray("availableIP");
+        availableIPList.forEach(i -> arrayNode.add(i.toString()));
+        return ok(root.toString()).build();
+    }
+
+    /**
+     * Post a new static MAC/IP binding.
+     * Registers a static binding to the DHCP server, and displays the current set of bindings.
+     *
+     * @return 200 OK
+     */
+    @POST
+    @Path("mappings")
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response setMapping(InputStream stream) {
+        ObjectNode root = mapper().createObjectNode();
+
+        try {
+            ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+            JsonNode macID = jsonTree.get("mac");
+            JsonNode ip = jsonTree.get("ip");
+            if (macID != null && ip != null) {
+
+                if (!service.setStaticMapping(MacAddress.valueOf(macID.asText()),
+                        Ip4Address.valueOf(ip.asText()))) {
+                    throw new IllegalArgumentException("Static Mapping Failed. The IP maybe unavailable.");
                 }
-            ]
+            }
+
+            final Map<MacAddress, Ip4Address> intents = service.listMapping();
+            ArrayNode arrayNode = root.putArray("mappings");
+            intents.entrySet().forEach(i -> arrayNode.add(mapper().createObjectNode()
+                    .put("mac", i.getKey().toString())
+                    .put("ip", i.getValue().toString())));
+        } catch (IOException e) {
+            throw new IllegalArgumentException(e.getMessage());
         }
+        return ok(root.toString()).build();
+    }
+
+    /**
+     * Delete a static MAC/IP binding.
+     * Removes a static binding from the DHCP Server, and displays the current set of bindings.
+     *
+     * @return 200 OK
      */
+    @DELETE
+    @Path("mappings/{macID}")
+    public Response deleteMapping(@PathParam("macID") String macID) {
+
+        ObjectNode root = mapper().createObjectNode();
+
+        if (!service.removeStaticMapping(MacAddress.valueOf(macID))) {
+            throw new IllegalArgumentException("Static Mapping Removal Failed.");
+        }
+        final Map<MacAddress, Ip4Address> intents = service.listMapping();
+        ArrayNode arrayNode = root.putArray("mappings");
+        intents.entrySet().forEach(i -> arrayNode.add(mapper().createObjectNode()
+                .put("mac", i.getKey().toString())
+                .put("ip", i.getValue().toString())));
+
+        return ok(root.toString()).build();
+    }
 }
