diff --git a/apps/mfwd/src/main/java/org/onosproject/mfwd/rest/McastResource.java b/apps/mfwd/src/main/java/org/onosproject/mfwd/rest/McastResource.java
index 878e21d..608e044 100644
--- a/apps/mfwd/src/main/java/org/onosproject/mfwd/rest/McastResource.java
+++ b/apps/mfwd/src/main/java/org/onosproject/mfwd/rest/McastResource.java
@@ -15,58 +15,135 @@
  */
 package org.onosproject.mfwd.rest;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
+import javax.ws.rs.DELETE;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import org.onlab.packet.IpPrefix;
-import org.onlab.rest.BaseResource;
-import org.onosproject.mfwd.impl.McastRouteGroup;
+import org.onosproject.mfwd.impl.McastConnectPoint;
 import org.onosproject.mfwd.impl.McastRouteTable;
+import org.onosproject.mfwd.impl.McastRouteBase;
+import org.onosproject.mfwd.impl.MRibCodec;
+import org.onosproject.rest.AbstractWebResource;
+
+import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Rest API for Multicast Forwarding.
  */
 @Path("mcast")
-public class McastResource extends BaseResource {
+public class McastResource extends AbstractWebResource  {
+
+    private final Logger log = getLogger(getClass());
+    private static final String SOURCE_ADDRESS = "sourceAddress";
+    private static final String GROUP_ADDRESS = "groupAddress";
+    private static final String INGRESS_POINT = "ingressPoint";
+    private static final String EGRESS_POINT = "egressPoint";
+    private static final String MCAST_GROUP = "mcastGroup";
 
     /**
      * Retrieve the multicast route table.
+     *
      * @return the multicast route table.
      * @throws IOException if an error occurs
      */
+    @Path("show")
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public Response showAll() throws IOException {
-        ObjectMapper mapper = new ObjectMapper();
-        McastRouteTable mcastRouteTable = McastRouteTable.getInstance();
-        Map<IpPrefix, McastRouteGroup> map = mcastRouteTable.getMrib4();
-        return Response.ok(mapper.createObjectNode().toString()).build();
+        McastRouteTable mrt = McastRouteTable.getInstance();
+        ObjectNode pushContent = new MRibCodec().encode(mrt , this);
+        return ok(pushContent.toString()).build();
     }
 
     /**
-     * Static join of a multicast flow.
-     * @param input source, group, ingress connectPoint egress connectPoints
-     * @return status of static join
-     * @throws IOException if an error occurs
+     * Static join a multicast flow.
+     *
+     * @param sAddr source address to join
+     * @param gAddr group address to join
+     * @param ports ingress and egress ConnectPoints to join
+     * @return the Result of the join
+     * @throws IOException if something failed with the join command
      */
+    @Path("/join")
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response join(InputStream input) throws IOException {
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response join(@QueryParam("src") String sAddr,
+                    @QueryParam("grp") String gAddr,
+                    @DefaultValue("") @QueryParam("ports") String ports)
+                    throws IOException {
+
         ObjectMapper mapper = new ObjectMapper();
-        JsonNode cfg = mapper.readTree(input);
-        return null;
+        log.debug("Source IP Address: " + sAddr);
+        log.debug("Destination IP Address: " + gAddr);
+        log.debug("Ingress and Egress ports: " + ports);
+
+        String output = "Insertion Faild";
+        if (sAddr != null && gAddr != null && ports != null) {
+
+            String[] portArr = ports.split(",");
+            log.debug("Port Array Length: " + portArr.length);
+            McastRouteTable mrt = McastRouteTable.getInstance();
+            McastRouteBase mr = mrt.addRoute(sAddr, gAddr);
+
+            // Port format "of:0000000000000023/4"
+            log.debug("checking inside outer if: " + portArr.length);
+
+            if (mr != null && portArr != null && portArr.length > 0) {
+
+                String inCP = portArr[0];
+                log.debug("Ingress port provided: " + inCP);
+                mr.addIngressPoint(inCP);
+
+                for (int i = 1; i < portArr.length; i++) {
+                    String egCP = portArr[i];
+                    log.debug("Egress port provided: " + egCP);
+                    mr.addEgressPoint(egCP, McastConnectPoint.JoinSource.STATIC);
+                }
+                mrt.printMcastRouteTable();
+                output = "Successfully Inserted";
+            }
+        } else {
+            output = "Please Insert the rest uri correctly";
+        }
+        return Response.ok(output).build();
+    }
+
+    /**
+     * Delete multicast state.
+     *
+     * @param src address to be deleted
+     * @param grp address to be deleted
+     * @return status of delete if successful
+     */
+    @Path("/delete")
+    @DELETE
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response removeMcastFlow(@QueryParam("src") String src,
+                    @QueryParam("grp") String grp) {
+
+        String resp = "Failed to delete";
+        log.info("Source IP Address to delete: " + src);
+        log.info("Destination IP Address to delete: " + grp);
+        McastRouteTable mrt = McastRouteTable.getInstance();
+        if (src != null && grp != null) {
+            mrt.removeRoute(src, grp);
+            resp = "Deleted flow for src " + src + " and grp " + grp;
+        }
+
+        return Response.ok(resp).build();
     }
 }
