diff --git a/core/api/src/main/java/org/onosproject/net/HostId.java b/core/api/src/main/java/org/onosproject/net/HostId.java
index 519945d..3e0d2b2 100644
--- a/core/api/src/main/java/org/onosproject/net/HostId.java
+++ b/core/api/src/main/java/org/onosproject/net/HostId.java
@@ -61,9 +61,9 @@
     }
 
     /**
-     * Returns the host MAC address.
+     * Returns the host vlan Id.
      *
-     * @return MAC address
+     * @return vlan Id
      */
     public VlanId vlanId() {
         return vlanId;
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostProviderService.java b/core/api/src/main/java/org/onosproject/net/host/HostProviderService.java
index 27b8c83..8678a29 100644
--- a/core/api/src/main/java/org/onosproject/net/host/HostProviderService.java
+++ b/core/api/src/main/java/org/onosproject/net/host/HostProviderService.java
@@ -25,7 +25,7 @@
 
     /**
      * Notifies the core when a host has been detected on a network along with
-     * information that identifies the hoot location.
+     * information that identifies the host location.
      *
      * @param hostId          id of the host that been detected
      * @param hostDescription description of host and its location
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/HostsWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/HostsWebResource.java
index 7b24929..95afe99 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/HostsWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/HostsWebResource.java
@@ -15,17 +15,42 @@
  */
 package org.onosproject.rest.resources;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.host.DefaultHostDescription;
+import org.onosproject.net.host.HostProvider;
+import org.onosproject.net.host.HostProviderRegistry;
+import org.onosproject.net.host.HostProviderService;
 import org.onosproject.net.host.HostService;
+import org.onosproject.net.provider.ProviderId;
 import org.onosproject.rest.AbstractWebResource;
 
+import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
 
 import static org.onlab.util.Tools.nullIsNotFound;
 import static org.onosproject.net.HostId.hostId;
@@ -36,6 +61,8 @@
 @Path("hosts")
 public class HostsWebResource extends AbstractWebResource {
 
+    @Context
+    UriInfo uriInfo;
     public static final String HOST_NOT_FOUND = "Host is not found";
 
     @GET
@@ -51,7 +78,7 @@
     @Path("{id}")
     public Response getHostById(@PathParam("id") String id) {
         final Host host = nullIsNotFound(get(HostService.class).getHost(hostId(id)),
-                HOST_NOT_FOUND);
+                                         HOST_NOT_FOUND);
         final ObjectNode root = codec(Host.class).encode(host, this);
         return ok(root).build();
     }
@@ -62,9 +89,121 @@
     public Response getHostByMacAndVlan(@PathParam("mac") String mac,
                                         @PathParam("vlan") String vlan) {
         final Host host = nullIsNotFound(get(HostService.class).getHost(hostId(mac + "/" + vlan)),
-                HOST_NOT_FOUND);
+                                         HOST_NOT_FOUND);
         final ObjectNode root = codec(Host.class).encode(host, this);
         return ok(root).build();
     }
+
+    /**
+     * Creates a new host based on JSON input and adds it to the current
+     * host inventory.
+     *
+     * @param stream input JSON
+     * @return status of the request - CREATED if the JSON is correct,
+     * BAD_REQUEST if the JSON is invalid
+     */
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response createAndAddHost(InputStream stream) {
+        URI location;
+        try {
+            // Parse the input stream
+            ObjectNode root = (ObjectNode) mapper().readTree(stream);
+
+            HostProviderRegistry hostProviderRegistry = get(HostProviderRegistry.class);
+            InternalHostProvider hostProvider = new InternalHostProvider(hostProviderRegistry);
+            hostProvider.register();
+            HostId hostId = hostProvider.parseHost(root);
+
+            UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
+                    .path("hosts")
+                    .path(hostId.mac().toString())
+                    .path(hostId.vlanId().toString());
+            location = locationBuilder.build();
+            hostProvider.unregister();
+
+        } catch (IOException ex) {
+            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
+        }
+        return Response
+                .created(location)
+                .build();
+    }
+
+    /**
+     * Produces annotations from specified JsonNode. Copied from the ConfigProvider
+     * class for use in the POST method.
+     *
+     * @param node node to be annotated
+     * @return SparseAnnotations object with information about node
+     */
+    private SparseAnnotations annotations(JsonNode node) {
+        if (node == null) {
+            return DefaultAnnotations.EMPTY;
+        }
+
+        DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
+        Iterator<String> it = node.fieldNames();
+        while (it.hasNext()) {
+            String k = it.next();
+            builder.set(k, node.get(k).asText());
+        }
+        return builder.build();
+    }
+
+    private final class InternalHostProvider implements HostProvider {
+        private final ProviderId providerId =
+                new ProviderId("host", "org.onosproject.rest", true);
+        private HostProviderRegistry hostProviderRegistry;
+        private HostProviderService hostProviderService;
+
+        public void triggerProbe(Host host) {
+            // No need to implement since we don't need to check if the host exists
+        }
+
+        private InternalHostProvider(HostProviderRegistry hostProviderRegistry) {
+            this.hostProviderRegistry = hostProviderRegistry;
+        }
+
+        private void register() {
+            this.hostProviderService = hostProviderRegistry.register(this);
+        }
+
+        private void unregister() {
+            hostProviderRegistry.unregister(this);
+        }
+
+        public ProviderId id() {
+            return providerId;
+        }
+
+        /**
+         * Creates and adds new host based on given data and returns its host ID.
+         * @param node JsonNode containing host information
+         * @return host ID of new host created
+         */
+        private HostId parseHost(JsonNode node) {
+            MacAddress mac = MacAddress.valueOf(node.get("mac").asText());
+            VlanId vlanId = VlanId.vlanId(((short) node.get("vlan").asInt((VlanId.UNTAGGED))));
+            JsonNode locationNode = node.get("location");
+            String deviceAndPort = locationNode.get("elementId").asText() + "/" +
+                    locationNode.get("port").asText();
+            HostLocation hostLocation = new HostLocation(ConnectPoint.deviceConnectPoint(deviceAndPort), 0);
+
+            Iterator<JsonNode> ipStrings = node.get("ipAddresses").elements();
+            Set<IpAddress> ips = new HashSet<>();
+            while (ipStrings.hasNext()) {
+                ips.add(IpAddress.valueOf(ipStrings.next().asText()));
+            }
+            SparseAnnotations annotations = annotations(node);
+            // Update host inventory
+
+            HostId hostId = HostId.hostId(mac, vlanId);
+            DefaultHostDescription desc = new DefaultHostDescription(mac, vlanId, hostLocation, ips, annotations);
+            hostProviderService.hostDetected(hostId, desc);
+            return hostId;
+        }
+    }
 }
 
