diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
index 013ac89..7fdd08e 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
@@ -19,15 +19,13 @@
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.TpPort;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstackvtap.api.OpenstackVtap;
 import org.onosproject.openstackvtap.api.OpenstackVtapAdminService;
-import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
 
-import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolTypeFromString;
 import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getVtapTypeFromString;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.makeVtapCriterion;
 
 /**
  * Adds a openstack vtap rule.
@@ -76,38 +74,19 @@
 
     @Override
     protected void doExecute() {
-        DefaultOpenstackVtapCriterion.Builder vtapCriterionBuilder = DefaultOpenstackVtapCriterion.builder();
-        if (makeCriterion(vtapCriterionBuilder)) {
-            OpenstackVtap.Type type = getVtapTypeFromString(vtapTypeStr);
-
-            if (type == null) {
-                print("Invalid vtap type");
-                return;
-            }
-
-            OpenstackVtap vtap = vtapService.createVtap(type, vtapCriterionBuilder.build());
-            if (vtap != null) {
-                print("Created OpenstackVtap with id { %s }", vtap.id().toString());
-            } else {
-                print("Failed to create OpenstackVtap");
-            }
-        }
-    }
-
-    private boolean makeCriterion(DefaultOpenstackVtapCriterion.Builder vtapCriterionBuilder) {
-        try {
-            vtapCriterionBuilder.srcIpPrefix(IpPrefix.valueOf(srcIp));
-            vtapCriterionBuilder.dstIpPrefix(IpPrefix.valueOf(dstIp));
-        } catch (Exception e) {
-            print("Inputted valid source IP & destination IP in CIDR (e.g., \"10.1.0.4/32\")");
-            return false;
+        OpenstackVtapCriterion criterion =
+                makeVtapCriterion(srcIp, dstIp, ipProto, srcTpPort, dstTpPort);
+        OpenstackVtap.Type type = getVtapTypeFromString(vtapTypeStr);
+        if (type == null) {
+            print("Invalid vtap type");
+            return;
         }
 
-        vtapCriterionBuilder.ipProtocol(getProtocolTypeFromString(ipProto.toLowerCase()));
-
-        vtapCriterionBuilder.srcTpPort(TpPort.tpPort(srcTpPort));
-        vtapCriterionBuilder.dstTpPort(TpPort.tpPort(dstTpPort));
-
-        return true;
+        OpenstackVtap vtap = vtapService.createVtap(type, criterion);
+        if (vtap != null) {
+            print("Created OpenstackVtap with id { %s }", vtap.id().toString());
+        } else {
+            print("Failed to create OpenstackVtap");
+        }
     }
 }
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodec.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodec.java
new file mode 100644
index 0000000..608362b
--- /dev/null
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/codec/OpenstackVtapCriterionCodec.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstackvtap.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.TpPort;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
+import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolStringFromType;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getProtocolTypeFromString;
+
+/**
+ * Openstack vTap codec used for serializing and de-serializing JSON string.
+ */
+public final class OpenstackVtapCriterionCodec extends JsonCodec<OpenstackVtapCriterion> {
+
+    private static final String SRC_IP = "srcIp";
+    private static final String DST_IP = "dstIp";
+    private static final String IP_PROTOCOL = "ipProto";
+    private static final String SRC_PORT = "srcPort";
+    private static final String DST_PORT = "dstPort";
+
+    private static final String MISSING_MESSAGE = " is required in OpenstackVtapCriterion";
+
+    @Override
+    public ObjectNode encode(OpenstackVtapCriterion entity, CodecContext context) {
+        String protoStr = getProtocolStringFromType(entity.ipProtocol());
+
+        return context.mapper().createObjectNode()
+                .put(SRC_IP, entity.srcIpPrefix().address().toString())
+                .put(DST_IP, entity.dstIpPrefix().address().toString())
+                .put(IP_PROTOCOL, protoStr)
+                .put(SRC_PORT, entity.srcTpPort().toString())
+                .put(DST_PORT, entity.dstTpPort().toString());
+    }
+
+    @Override
+    public OpenstackVtapCriterion decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        OpenstackVtapCriterion.Builder cBuilder = DefaultOpenstackVtapCriterion.builder();
+
+        // parse source IP address
+        IpPrefix srcIp = IpPrefix.valueOf(IpAddress.valueOf(nullIsIllegal(
+                json.get(SRC_IP).asText(), SRC_IP + MISSING_MESSAGE)), 32);
+        // parse destination IP address
+        IpPrefix dstIp = IpPrefix.valueOf(IpAddress.valueOf(nullIsIllegal(
+                json.get(DST_IP).asText(), DST_IP + MISSING_MESSAGE)), 32);
+
+        cBuilder.srcIpPrefix(srcIp);
+        cBuilder.dstIpPrefix(dstIp);
+
+        // parse IP protocol
+        String ipProtoStr = json.get(IP_PROTOCOL).asText();
+        if (ipProtoStr != null) {
+            cBuilder.ipProtocol(getProtocolTypeFromString(ipProtoStr));
+        }
+
+        // parse source port number
+        int srcPort = json.get(SRC_PORT).asInt(0);
+
+        // parse destination port number
+        int dstPort = json.get(DST_PORT).asInt(0);
+
+        cBuilder.srcTpPort(TpPort.tpPort(srcPort));
+        cBuilder.dstTpPort(TpPort.tpPort(dstPort));
+
+        return cBuilder.build();
+    }
+}
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java
index 7950bee..6907d4b 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/util/OpenstackVtapUtil.java
@@ -18,6 +18,7 @@
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
+import org.onlab.packet.TpPort;
 import org.onosproject.net.Host;
 import org.onosproject.net.behaviour.TunnelDescription;
 import org.onosproject.net.group.DefaultGroupKey;
@@ -25,7 +26,9 @@
 import org.onosproject.openstackvtap.api.OpenstackVtap;
 import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
 import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
+import org.onosproject.openstackvtap.impl.DefaultOpenstackVtapCriterion;
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.ByteArrayOutputStream;
 import java.nio.charset.StandardCharsets;
@@ -38,6 +41,8 @@
  */
 public final class OpenstackVtapUtil {
 
+    private static final Logger log = LoggerFactory.getLogger(OpenstackVtapUtil.class);
+
     private static final String VTAP_TUNNEL_GRE = "vtap_gre";
     private static final String VTAP_TUNNEL_VXLAN = "vtap_vxlan";
     private static final String VTAP_GROUP_KEY = "VTAP_GROUP_KEY";
@@ -70,6 +75,27 @@
     }
 
     /**
+     * Obtains IP protocol string from the given type.
+     *
+     * @param type protocol type
+     * @return IP protocol string
+     */
+    public static String getProtocolStringFromType(byte type) {
+        switch (type) {
+            case IPv4.PROTOCOL_TCP:
+                return "tcp";
+            case IPv4.PROTOCOL_UDP:
+                return "udp";
+            case IPv4.PROTOCOL_ICMP:
+                return "icmp";
+            case 0:
+                return "any";
+            default:
+                throw new IllegalArgumentException("Invalid vtap protocol type");
+        }
+    }
+
+    /**
      * Obtains openstack vtap type from the given string.
      *
      * @param str vtap type string
@@ -179,6 +205,38 @@
     }
 
     /**
+     * Makes Openstack vTap criterion from the given src, dst IP and port.
+     *
+     * @param srcIp     source IP address
+     * @param dstIp     destination IP address
+     * @param ipProto   IP protocol
+     * @param srcPort   source port
+     * @param dstPort   destination port
+     * @return openstack vTap criterion
+     */
+    public static OpenstackVtapCriterion makeVtapCriterion(String srcIp,
+                                                           String dstIp,
+                                                           String ipProto,
+                                                           int srcPort,
+                                                           int dstPort) {
+        OpenstackVtapCriterion.Builder cBuilder = DefaultOpenstackVtapCriterion.builder();
+
+        try {
+            cBuilder.srcIpPrefix(IpPrefix.valueOf(srcIp));
+            cBuilder.dstIpPrefix(IpPrefix.valueOf(dstIp));
+        } catch (Exception e) {
+            log.error("The given IP addresses are invalid");
+         }
+
+        cBuilder.ipProtocol(getProtocolTypeFromString(ipProto.toLowerCase()));
+
+        cBuilder.srcTpPort(TpPort.tpPort(srcPort));
+        cBuilder.dstTpPort(TpPort.tpPort(dstPort));
+
+        return cBuilder.build();
+    }
+
+    /**
      * Print stack trace of given exception.
      *
      * @param log logger for using print
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
index 509a286..a318320 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
@@ -19,7 +19,9 @@
 
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.codec.CodecService;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
 import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
+import org.onosproject.openstackvtap.codec.OpenstackVtapCriterionCodec;
 import org.onosproject.openstackvtap.codec.OpenstackVtapNetworkCodec;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -44,6 +46,7 @@
     @Activate
     protected void activate() {
         codecService.registerCodec(OpenstackVtapNetwork.class, new OpenstackVtapNetworkCodec());
+        codecService.registerCodec(OpenstackVtapCriterion.class, new OpenstackVtapCriterionCodec());
 
         log.info("Started");
     }
@@ -51,6 +54,7 @@
     @Deactivate
     protected void deactivate() {
         codecService.unregisterCodec(OpenstackVtapNetwork.class);
+        codecService.unregisterCodec(OpenstackVtapCriterion.class);
 
         log.info("Stopped");
     }
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapWebResource.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapWebResource.java
index f4c3084..5021887 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapWebResource.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapWebResource.java
@@ -15,14 +15,38 @@
  */
 package org.onosproject.openstackvtap.web;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Sets;
+import org.onosproject.openstackvtap.api.OpenstackVtap;
+import org.onosproject.openstackvtap.api.OpenstackVtapCriterion;
+import org.onosproject.openstackvtap.api.OpenstackVtapId;
+import org.onosproject.openstackvtap.api.OpenstackVtapService;
 import org.onosproject.rest.AbstractWebResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+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.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.InputStream;
+import java.util.Set;
+
+import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+import static javax.ws.rs.core.Response.created;
+import static javax.ws.rs.core.Response.noContent;
+import static org.onlab.util.Tools.readTreeFromStream;
+import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getVtapTypeFromString;
 
 /**
  * Handles REST API call of openstack vtap.
@@ -30,16 +54,119 @@
 @Path("vtap")
 public class OpenstackVtapWebResource extends AbstractWebResource {
 
-    private final ObjectNode root = mapper().createObjectNode();
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String MESSAGE_VTAP = "Received vtap %s request";
+    private static final String CREATE = "CREATE";
+    private static final String QUERY = "QUERY";
+    private static final String DELETE = "DELETE";
+
+    private static final String VTAP = "vtap";
+    private static final String CRITERION = "criterion";
+    private static final String TYPE = "type";
+    private static final String ID = "id";
+
+    private final ObjectNode  root = mapper().createObjectNode();
+    private final ArrayNode jsonVtaps = root.putArray("vtaps");
+
+    private final OpenstackVtapService vtapService = get(OpenstackVtapService.class);
+
+    @Context
+    private UriInfo uriInfo;
 
     /**
-     * OpenstackVtapServiceImpl method.
+     * Creates an openstack vTap from the JSON input stream.
      *
-     * @return 200 OK
+     * @param input openstack vtap JSON input stream
+     * @return 201 CREATED if the JSON is correct, 400 BAD_REQUEST if the JSON
+     * is invalid or duplicated vtap already exists
+     *
+     * @onos.rsModel OpenstackVtap
+     */
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response createVtap(InputStream input) {
+        log.trace(String.format(MESSAGE_VTAP, CREATE));
+
+        OpenstackVtap vtap = readAndCreateVtap(input);
+
+        UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
+                .path(VTAP)
+                .path(vtap.id().toString());
+
+        return created(locationBuilder.build()).build();
+    }
+
+    /**
+     * Removes an openstack vTap with the given vTap UUID.
+     *
+     * @param id openstack vtap UUID
+     * @return 204 NO_CONTENT, 400 BAD_REQUEST if the JSON is malformed
+     */
+    @DELETE
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("{id}")
+    public Response deleteVtap(@PathParam(ID) String id) {
+        log.trace(String.format(MESSAGE_VTAP, DELETE + id));
+
+        vtapService.removeVtap(OpenstackVtapId.vtapId(id));
+        return noContent().build();
+    }
+
+    /**
+     * Gets openstack vtap entities.
+     *
+     * @return 200 OK with openstack vtap entities
+     *         404 NOT_FOUND if openstack vtap does not exist
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    public Response dummy() {
+    public Response getVtaps() {
+        log.trace(String.format(MESSAGE_VTAP, QUERY));
+
+        Set<OpenstackVtap> allVtaps = vtapService.getVtaps(OpenstackVtap.Type.VTAP_ALL);
+        Set<OpenstackVtap> txVtaps = vtapService.getVtaps(OpenstackVtap.Type.VTAP_TX);
+        Set<OpenstackVtap> rxVtaps = vtapService.getVtaps(OpenstackVtap.Type.VTAP_RX);
+        Set<OpenstackVtap> anyVtaps = vtapService.getVtaps(OpenstackVtap.Type.VTAP_ANY);
+
+        Set<OpenstackVtap> vTaps = Sets.newConcurrentHashSet();
+        vTaps.addAll(allVtaps);
+        vTaps.addAll(txVtaps);
+        vTaps.addAll(rxVtaps);
+        vTaps.addAll(anyVtaps);
+
+        for (OpenstackVtap vtap : vTaps) {
+            ObjectNode json = mapper().createObjectNode();
+            json.set(CRITERION, codec(OpenstackVtapCriterion.class)
+                    .encode(vtap.vtapCriterion(), this));
+            json.put(TYPE, vtap.type().name());
+            json.put(ID, vtap.id().toString());
+
+            jsonVtaps.add(json);
+        }
+
         return ok(root).build();
     }
+
+    private OpenstackVtap readAndCreateVtap(InputStream input) {
+        OpenstackVtap.Type type = OpenstackVtap.Type.VTAP_ALL;
+        OpenstackVtapCriterion criterion;
+        try {
+            JsonNode jsonTree = readTreeFromStream(mapper().enable(INDENT_OUTPUT), input);
+            String typeStr = jsonTree.path(TYPE).asText();
+
+            if (typeStr != null) {
+                type = getVtapTypeFromString(typeStr);
+            }
+
+            ObjectNode jsonCriterion = jsonTree.path(CRITERION).deepCopy();
+            criterion = codec(OpenstackVtapCriterion.class).decode(jsonCriterion, this);
+        } catch (Exception e) {
+            throw new IllegalArgumentException(e);
+        }
+
+        return vtapService.createVtap(type, criterion);
+    }
 }
