diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmConnectionInfo.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmConnectionInfo.java
index cf8c393..1a54fe9 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmConnectionInfo.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmConnectionInfo.java
@@ -26,6 +26,7 @@
     private final NodeId connectedTo;
     private final long connectTime;
     private final FpmPeer peer;
+    private final boolean acceptRoutes;
 
     /**
      * Creates a new connection info.
@@ -34,13 +35,31 @@
      * @param peer FPM peer
      * @param connectTime time the connection was made
      */
+    @Deprecated
     public FpmConnectionInfo(NodeId connectedTo, FpmPeer peer, long connectTime) {
         this.connectedTo = connectedTo;
         this.peer = peer;
         this.connectTime = connectTime;
+        this.acceptRoutes = true;
     }
 
     /**
+     * Creates a new connection info.
+     *
+     * @param connectedTo ONOS node the FPM peer is connected to
+     * @param peer FPM peer
+     * @param connectTime time the connection was made
+     * @param acceptRoutes flag to accept or discard routes
+     */
+    FpmConnectionInfo(NodeId connectedTo, FpmPeer peer, long connectTime, boolean acceptRoutes) {
+        this.connectedTo = connectedTo;
+        this.peer = peer;
+        this.connectTime = connectTime;
+        this.acceptRoutes = acceptRoutes;
+    }
+
+
+    /**
      * Returns the node the FPM peers is connected to.
      *
      * @return ONOS node
@@ -66,4 +85,13 @@
     public long connectTime() {
         return connectTime;
     }
+
+    /**
+     * Returns the acceptRoutes flag status of the peer.
+     *
+     * @return acceptRoutes flag
+     */
+    public boolean isAcceptRoutes() {
+        return acceptRoutes;
+    }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmInfoService.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmInfoService.java
index c604707..a56c48d 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmInfoService.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmInfoService.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.routing.fpm;
 
+import java.util.Collection;
 import java.util.Map;
 
+
 /**
  * Provides information about the FPM route receiver module.
  */
@@ -41,4 +43,12 @@
      * Pushes all local FPM routes to route store.
      */
     void pushFpmRoutes();
+
+    /**
+     * Updates the acceptRoute flag to either accept or discard routes for input peers address.
+     *
+     * @param peers peers for which flag is updated
+     */
+    void updateAcceptRouteFlag(Collection<FpmPeerAcceptRoutes> peers);
+
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
index 0e26b43..4cec95d 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
@@ -90,6 +90,8 @@
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Set;
+import java.util.Iterator;
+
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -526,6 +528,7 @@
     private void clearRoutes(FpmPeer peer) {
         log.info("Clearing all routes for peer {}", peer);
         Map<IpPrefix, Route> routes = fpmRoutes.remove(peer);
+
         if (routes != null) {
             updateRouteStore(Lists.newArrayList(), routes.values());
         }
@@ -679,6 +682,44 @@
                         e -> toFpmInfo(e.getKey(), e.getValue())));
     }
 
+
+
+    @Override
+    public void updateAcceptRouteFlag(Collection<FpmPeerAcceptRoutes> modifiedPeers) {
+            modifiedPeers.forEach(modifiedPeer -> {
+                log.debug("FPM connection to {} is disabled", modifiedPeer);
+                NodeId localNode = clusterService.getLocalNode().id();
+                log.debug("Peer Flag {}", modifiedPeer.isAcceptRoutes());
+                peers.compute(modifiedPeer.peer(), (p, infos) -> {
+                    if (infos == null) {
+                        return null;
+                    }
+                    Iterator<FpmConnectionInfo> iterator = infos.iterator();
+                    if (iterator.hasNext()) {
+                        FpmConnectionInfo connectionInfo = iterator.next();
+                        if (connectionInfo.isAcceptRoutes() == modifiedPeer.isAcceptRoutes()) {
+                            return null;
+                        }
+                        localPeers.remove(modifiedPeer.peer());
+                        infos.remove(connectionInfo);
+                        infos.add(new FpmConnectionInfo(localNode, modifiedPeer.peer(),
+                                                    System.currentTimeMillis(), modifiedPeer.isAcceptRoutes()));
+                        localPeers.put(modifiedPeer.peer(), infos);
+                    }
+                    Map<IpPrefix, Route> routes = fpmRoutes.get(modifiedPeer.peer());
+                    if (routes != null && !modifiedPeer.isAcceptRoutes()) {
+                        updateRouteStore(Lists.newArrayList(), routes.values());
+                    } else {
+                        updateRouteStore(routes.values(), Lists.newArrayList());
+                    }
+
+                    return infos;
+                });
+            });
+
+    }
+
+
     private class InternalFpmListener implements FpmListener {
         @Override
         public void fpmMessage(FpmPeer peer, FpmHeader fpmMessage) {
@@ -698,7 +739,7 @@
                     infos = new HashSet<>();
                 }
 
-                infos.add(new FpmConnectionInfo(localNode, peer, System.currentTimeMillis()));
+                infos.add(new FpmConnectionInfo(localNode, peer, System.currentTimeMillis(), true));
                 localPeers.put(peer, infos);
                 return infos;
             });
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmPeerAcceptRoutes.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmPeerAcceptRoutes.java
new file mode 100644
index 0000000..18ce018
--- /dev/null
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmPeerAcceptRoutes.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2017-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.routing.fpm;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * Represents an FPM peer with accept routes flag.
+ */
+public class FpmPeerAcceptRoutes {
+
+    private final boolean isAcceptRoutes;
+    private final FpmPeer peer;
+
+
+
+    /**
+     * Creates a new FPM peer.
+     *
+     * @param peer Fpm Peer
+     * @param isAcceptRoutes is route accepted on peer
+     *
+     */
+    public FpmPeerAcceptRoutes(FpmPeer peer, boolean isAcceptRoutes) {
+        this.peer = peer;
+        this.isAcceptRoutes = isAcceptRoutes;
+    }
+
+    /**
+     * Returns isAcceptRoutes flag status.
+     *
+     * @return isAcceptRoutes
+     */
+    public boolean isAcceptRoutes() {
+        return isAcceptRoutes;
+    }
+
+    /**
+     * Returns the FPM peer.
+     *
+     * @return FPM peer
+     */
+    public FpmPeer peer() {
+        return peer;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(isAcceptRoutes, peer);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+
+        if (!(other instanceof FpmPeerAcceptRoutes)) {
+            return false;
+        }
+
+        FpmPeerAcceptRoutes that = (FpmPeerAcceptRoutes) other;
+
+        return Objects.equals(this.isAcceptRoutes, that.isAcceptRoutes) &&
+                Objects.equals(this.peer, that.peer);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("peer", peer)
+                .add("isAcceptRoutes", isAcceptRoutes)
+                .toString();
+    }
+
+}
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmAcceptRoutesInfoCommand.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmAcceptRoutesInfoCommand.java
new file mode 100644
index 0000000..89941ce
--- /dev/null
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmAcceptRoutesInfoCommand.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2017-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.routing.fpm.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.routing.fpm.FpmInfoService;
+import org.onosproject.routing.fpm.FpmPeer;
+import org.onosproject.routing.fpm.FpmPeerInfo;
+
+import java.util.Comparator;
+import java.util.Map;
+
+/**
+ * Displays the acceptRoute flag value for given peer.
+ */
+@Command(scope = "onos", name = "fpm-get-accept-route",
+        description = "Displays the acceptRoute flag value for given peer")
+public class FpmAcceptRoutesInfoCommand extends AbstractShellCommand {
+
+    private static final String FORMAT = "peer %s  port %s acceptRoutes %s";
+
+    @Argument(index = 0, name = "peerAddress", description = "Peer Ip address",
+            required = false, multiValued = false)
+    String peerAddress = null;
+
+
+
+    @Override
+    protected void execute() {
+        FpmInfoService fpmInfo = get(FpmInfoService.class);
+        if (peerAddress != null) {
+            IpAddress address = IpAddress.valueOf(peerAddress);
+            fpmInfo.peers().entrySet().stream()
+                    .filter(peer -> peer.getKey().address().equals(address))
+                    .map(Map.Entry::getValue)
+                    .forEach(this::print);
+        } else {
+            fpmInfo.peers().entrySet().stream()
+                    .sorted(Comparator.<Map.Entry<FpmPeer, FpmPeerInfo>, IpAddress>comparing(e -> e.getKey().address())
+                            .thenComparing(e -> e.getKey().port()))
+                    .map(Map.Entry::getValue)
+                    .forEach(this::print);
+        }
+    }
+
+    private void print(FpmPeerInfo info) {
+        info.connections().forEach(cinfo ->
+            print(FORMAT, cinfo.peer().address(),
+                    cinfo.peer().port(),
+                    cinfo.isAcceptRoutes())
+        );
+    }
+}
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmConnectionsList.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmConnectionsList.java
index f55f00e..d7b36b6 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmConnectionsList.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmConnectionsList.java
@@ -17,6 +17,7 @@
 package org.onosproject.routing.fpm.cli;
 
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Argument;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
@@ -35,29 +36,42 @@
         description = "Displays the current FPM connections")
 public class FpmConnectionsList extends AbstractShellCommand {
 
-    private static final String FORMAT = "peer %s:%s connected to %s since %s %s (%d routes locally)";
+    private static final String FORMAT = "peer %s:%s connected to %s since %s %s (%d routes locally) acceptRoutes %s";
+
+    @Argument(index = 0, name = "peerAddress", description = "Peer Ip address",
+            required = false, multiValued = false)
+    String peerAddress = null;
 
     @Override
     protected void execute() {
         FpmInfoService fpmInfo = get(FpmInfoService.class);
-
         print(String.format("PD Pushing is %s.", fpmInfo.isPdPushEnabled() ? "enabled" : "disabled"));
+        if (peerAddress != null) {
+            IpAddress address = IpAddress.valueOf(peerAddress);
+            fpmInfo.peers().entrySet().stream()
+                    .filter(peer -> peer.getKey().address().equals(address))
+                    .map(Map.Entry::getValue)
+                    .forEach(this::print);
+        } else {
+            fpmInfo.peers().entrySet().stream()
+                    .sorted(Comparator.<Map.Entry<FpmPeer, FpmPeerInfo>, IpAddress>comparing(e -> e.getKey().address())
+                            .thenComparing(e -> e.getKey().port()))
+                    .map(Map.Entry::getValue)
+                    .forEach(this::print);
+        }
 
-        fpmInfo.peers().entrySet().stream()
-                .sorted(Comparator.<Map.Entry<FpmPeer, FpmPeerInfo>, IpAddress>comparing(e -> e.getKey().address())
-                        .thenComparing(e -> e.getKey().port()))
-                .map(Map.Entry::getValue)
-                .forEach(this::print);
+
     }
 
     private void print(FpmPeerInfo info) {
         ClusterService clusterService = get(ClusterService.class);
 
         info.connections().forEach(cinfo ->
-            print(FORMAT, cinfo.peer().address(), cinfo.peer().port(),
-                    cinfo.connectedTo(), Tools.timeAgo(cinfo.connectTime()),
-                    cinfo.connectedTo().equals(clusterService.getLocalNode().id()) ? "*" : "",
-                    info.routes())
+                print(FORMAT, cinfo.peer().address(), cinfo.peer().port(),
+                        cinfo.connectedTo(), Tools.timeAgo(cinfo.connectTime()),
+                        cinfo.connectedTo().equals(clusterService.getLocalNode().id()) ? "*" : "",
+                        info.routes(),
+                        cinfo.isAcceptRoutes())
         );
     }
 }
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmSetAcceptRoutesCommand.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmSetAcceptRoutesCommand.java
new file mode 100644
index 0000000..2ec0713
--- /dev/null
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmSetAcceptRoutesCommand.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2017-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.routing.fpm.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.routing.fpm.FpmInfoService;
+import org.onosproject.routing.fpm.FpmPeer;
+import org.onosproject.routing.fpm.FpmPeerAcceptRoutes;
+
+import java.util.Collections;
+
+/**
+ * Sets acceptRoute flag for given peer.
+ */
+@Command(scope = "onos", name = "fpm-set-accept-routes",
+        description = "Adds a flag to Fpm peer to accept or discard routes")
+public class FpmSetAcceptRoutesCommand extends AbstractShellCommand {
+    @Argument(index = 0, name = "peerAddress", description = "IpAddress of peer",
+            required = true)
+    String peerAddressString = null;
+
+    @Argument(index = 1, name = "peerPort", description = "Port of peer",
+            required = true)
+    String peerPort = null;
+
+    @Argument(index = 1, name = "acceptRoutes", description = "Flag to accept or discard routes",
+            required = true)
+    String acceptRoutesString = null;
+
+    @Override
+    protected void execute() {
+        FpmInfoService service = AbstractShellCommand.get(FpmInfoService.class);
+
+        IpAddress peerAddress = IpAddress.valueOf(peerAddressString);
+        boolean isAcceptRoutes =  Boolean.parseBoolean(acceptRoutesString);
+        int port = Integer.parseInt(peerPort);
+        FpmPeer peer = new FpmPeer(peerAddress, port);
+        service.updateAcceptRouteFlag(Collections.singleton(new FpmPeerAcceptRoutes(peer, isAcceptRoutes)));
+
+    }
+}
diff --git a/apps/routing/fpm/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/routing/fpm/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index a227f6f..77a4dac 100644
--- a/apps/routing/fpm/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/routing/fpm/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -22,5 +22,11 @@
     <command>
       <action class="org.onosproject.routing.fpm.cli.FpmPushRoutesCommand"/>
     </command>
+    <command>
+      <action class="org.onosproject.routing.fpm.cli.FpmSetAcceptRoutesCommand"/>
+    </command>
+    <command>
+      <action class="org.onosproject.routing.fpm.cli.FpmAcceptRoutesInfoCommand"/>
+    </command>
   </command-bundle>
 </blueprint>
diff --git a/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmAcceptRoutesCodec.java b/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmAcceptRoutesCodec.java
new file mode 100644
index 0000000..9161ee6
--- /dev/null
+++ b/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmAcceptRoutesCodec.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2015-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.fpm.web;
+
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.routing.fpm.FpmPeer;
+
+import org.onlab.packet.IpAddress;
+import org.onosproject.routing.fpm.FpmPeerAcceptRoutes;
+
+/**
+ * Codec of FpmPeerInfo class.
+ */
+public final class FpmAcceptRoutesCodec extends JsonCodec<FpmPeerAcceptRoutes> {
+
+    // JSON field names
+    private static final String PEER_ADDRESS = "peerAddress";
+    private static final String PEER_PORT = "peerPort";
+    private static final String ACCEPT_ROUTES = "acceptRoutes";
+
+    @Override
+    public FpmPeerAcceptRoutes decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        IpAddress address = IpAddress.valueOf(json.path(PEER_ADDRESS).asText());
+        int port = Integer.parseInt(json.path(PEER_PORT).asText());
+        boolean isAcceptRoutes = Boolean.valueOf(json.path(ACCEPT_ROUTES).asText());
+        FpmPeer peer = new FpmPeer(address, port);
+        FpmPeerAcceptRoutes updatedPeer = new FpmPeerAcceptRoutes(peer, isAcceptRoutes);
+        return updatedPeer;
+    }
+}
diff --git a/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmCodec.java b/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmCodec.java
index fda14db..fa127e4 100755
--- a/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmCodec.java
+++ b/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmCodec.java
@@ -22,6 +22,7 @@
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.routing.fpm.FpmPeerInfo;
 
+
 /**
  * Codec of FpmPeerInfo class.
  */
@@ -33,6 +34,7 @@
     private static final String CONNECTED_TO = "connectedTo";
     private static final String CONNECTION_TIME = "connectionTime";
     private static final String LOCAL_ROUTES = "localRoutes";
+    private static final String ACCEPT_ROUTES = "acceptRoutes";
 
 
     @Override
@@ -47,6 +49,7 @@
             fpmNode.put(CONNECTED_TO, connection.connectedTo().toString());
             fpmNode.put(CONNECTION_TIME, Tools.timeAgo(connection.connectTime()));
             fpmNode.put(LOCAL_ROUTES, fpmPeerInfo.routes());
+            fpmNode.put(ACCEPT_ROUTES, connection.isAcceptRoutes());
             connectionArray.add(fpmNode);
         });
 
diff --git a/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmWebResource.java b/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmWebResource.java
index 6b6ea92..51bb0fe 100644
--- a/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmWebResource.java
+++ b/apps/routing/fpm/web/src/main/java/org/onosproject/fpm/web/FpmWebResource.java
@@ -25,15 +25,25 @@
 import org.onosproject.routing.fpm.FpmPeerInfo;
 import org.onosproject.routing.fpm.FpmInfoService;
 import org.onosproject.routing.fpm.FpmPeer;
+import org.onosproject.routing.fpm.FpmPeerAcceptRoutes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import static org.onlab.util.Tools.nullIsIllegal;
+import static org.onlab.util.Tools.readTreeFromStream;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import java.io.InputStream;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-
 import java.util.Comparator;
 import java.util.Map;
+import java.util.List;
 
 /**
  * FPM REST API.
@@ -41,9 +51,17 @@
 @Path("")
 public class FpmWebResource extends AbstractWebResource {
 
+    private static final String ACCEPT_ROUTES = "acceptRoutes";
+    private static final String PEER_ADDRESS = "peerAddress";
+    private static final String PEER_PORT = "peerPort";
+    protected static final String PEERS = "peers";
+    protected static final String PEERS_KEY_ERROR = "Peers key must be present";
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
     /**
      * To get all fpm connections.
      * @return 200 OK with component properties of given component and variable.
+     * @onos.rsModel FpmConnectionsGet
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
@@ -53,6 +71,60 @@
         return Response.status(200).entity(node).build();
     }
 
+    /**
+     * Performs disabling of FPM Peer.
+     *
+     * @param stream array of peer address and accept route flag
+     * @return 200 OK disable peer.
+     * @onos.rsModel FpmPeerSetAcceptRouteFlag
+     */
+    @POST
+    @Path("acceptRoutes")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response updateAcceptRouteFlagForConnection(InputStream stream) {
+        FpmInfoService fpmService = get(FpmInfoService.class);
+        try {
+            ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
+            ArrayNode peersArray = nullIsIllegal((ArrayNode) jsonTree.get(PEERS),
+                    PEERS_KEY_ERROR);
+            List<FpmPeerAcceptRoutes> fpmPeerRouteInfo = (new FpmAcceptRoutesCodec()).decode(peersArray, this);
+            fpmService.updateAcceptRouteFlag(fpmPeerRouteInfo);
+        } catch (IOException ex) {
+            throw new IllegalArgumentException(ex);
+        }
+
+        return Response.ok().build();
+
+    }
+
+    /**
+     * Gets peers acceptRoute Flag details.
+     * @param peerAddress peer identifier
+     * @return 200 OK with a collection of peerInfo
+     * @onos.rsModel FpmPeerGetAcceptRoutes
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("acceptRoutes/{peerAddress}")
+    public Response getPeerAcceptRouteInfo(@PathParam("peerAddress") String peerAddress) {
+        ObjectNode node = getFpmPeerAcceptFlagInfoJsonOutput(peerAddress);
+        return Response.status(200).entity(node).build();
+    }
+
+    /**
+     * Gets all peers acceptRoute Flag details.
+     * @return 200 OK with a collection of peerInfo
+     * @onos.rsModel FpmGetAcceptRoutes
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("acceptRoutes/")
+    public Response getAllPeerAcceptRouteInfo() {
+        ObjectNode node = getFpmPeerRouteInfoJsonOutput();
+        return Response.status(200).entity(node).build();
+    }
+
 
     private ObjectNode getFpmConnectionsJsonOutput() {
 
@@ -72,6 +144,54 @@
         return node;
 
     }
+
+    private ObjectNode getFpmPeerRouteInfoJsonOutput() {
+
+        FpmInfoService fpmService = get(FpmInfoService.class);
+        ObjectNode node = mapper().createObjectNode();
+        ArrayNode connectionArray = mapper().createArrayNode();
+        Map<FpmPeer, FpmPeerInfo> fpmPeers = fpmService.peers();
+        fpmPeers.entrySet().stream()
+                .sorted(Comparator.<Map.Entry<FpmPeer, FpmPeerInfo>, IpAddress>comparing(e -> e.getKey().address())
+                        .thenComparing(e -> e.getKey().port()))
+                .map(Map.Entry::getValue)
+                .forEach(fpmPeerInfo -> {
+                    fpmPeerInfo.connections().forEach(connection -> {
+                        ObjectNode fpmNode = mapper().createObjectNode();
+                        fpmNode.put(PEER_ADDRESS, connection.peer().address().toString());
+                        fpmNode.put(PEER_PORT, connection.peer().port());
+                        fpmNode.put(ACCEPT_ROUTES, connection.isAcceptRoutes());
+                        connectionArray.add(fpmNode);
+                    });
+
+                });
+
+        node.put("fpm-peer-info", connectionArray);
+        return node;
+
+
+    }
+
+    private ObjectNode getFpmPeerAcceptFlagInfoJsonOutput(String address) {
+
+        FpmInfoService fpmService = get(FpmInfoService.class);
+        ObjectNode fpmNode = mapper().createObjectNode();
+        Map<FpmPeer, FpmPeerInfo> fpmPeers = fpmService.peers();
+        IpAddress peerAddress = IpAddress.valueOf(address);
+        fpmPeers.entrySet().stream()
+                .filter(peer -> peer.getKey().address().equals(peerAddress))
+                .map(Map.Entry::getValue)
+                .forEach(fpmPeerInfo -> {
+                    fpmPeerInfo.connections().forEach(connection -> {
+                        fpmNode.put(ACCEPT_ROUTES, connection.isAcceptRoutes());
+                    });
+                });
+
+
+        return fpmNode;
+
+
+    }
 }
 
 
diff --git a/apps/routing/fpm/web/src/main/resources/definitions/FpmConnectionsGet.json b/apps/routing/fpm/web/src/main/resources/definitions/FpmConnectionsGet.json
new file mode 100644
index 0000000..207453c
--- /dev/null
+++ b/apps/routing/fpm/web/src/main/resources/definitions/FpmConnectionsGet.json
@@ -0,0 +1,37 @@
+{
+  "type": "object",
+  "required": [
+    "peerAddress",
+    "peerPort",
+    "connectedTo",
+    "connectionTime",
+    "localRoutes",
+    "acceptRoutes"
+  ],
+  "properties": {
+    "peerAddress": {
+      "type": "string",
+      "example": "10.255.0.0"
+    },
+    "peerPort": {
+      "type": "int",
+      "example": "34455"
+    },
+    "connectedTo": {
+      "type": "string",
+      "example": "10.2.2.5"
+    },
+    "connectionTime": {
+      "type": "string",
+      "example": "3m ago"
+    },
+    "localRoutes": {
+      "type": "int",
+      "example": "2"
+    },
+    "acceptRoutes": {
+      "type": "boolean",
+      "example": "true"
+    }
+  }
+}
\ No newline at end of file
diff --git a/apps/routing/fpm/web/src/main/resources/definitions/FpmGetAcceptRoutes.json b/apps/routing/fpm/web/src/main/resources/definitions/FpmGetAcceptRoutes.json
new file mode 100644
index 0000000..ce23582
--- /dev/null
+++ b/apps/routing/fpm/web/src/main/resources/definitions/FpmGetAcceptRoutes.json
@@ -0,0 +1,22 @@
+{
+  "type": "object",
+  "required": [
+    "peerAddress",
+    "peerPort",
+    "acceptRoutes"
+  ],
+  "properties": {
+    "peerAddress": {
+      "type": "String",
+      "example": "10.0.0.1"
+    },
+    "peerPort": {
+      "type": "Integer",
+      "example": "56789"
+    },
+    "acceptRoutes": {
+      "type": "boolean",
+      "example": "true"
+    }
+  }
+}
diff --git a/apps/routing/fpm/web/src/main/resources/definitions/FpmPeerGetAcceptRoutes.json b/apps/routing/fpm/web/src/main/resources/definitions/FpmPeerGetAcceptRoutes.json
new file mode 100644
index 0000000..87e0c6e
--- /dev/null
+++ b/apps/routing/fpm/web/src/main/resources/definitions/FpmPeerGetAcceptRoutes.json
@@ -0,0 +1,12 @@
+{
+  "type": "object",
+  "required": [
+    "acceptRoutes"
+  ],
+  "properties": {
+    "acceptRoutes": {
+      "type": "boolean",
+      "example": "true"
+    }
+  }
+}
diff --git a/apps/routing/fpm/web/src/main/resources/definitions/FpmPeerSetAcceptRouteFlag.json b/apps/routing/fpm/web/src/main/resources/definitions/FpmPeerSetAcceptRouteFlag.json
new file mode 100644
index 0000000..652f552
--- /dev/null
+++ b/apps/routing/fpm/web/src/main/resources/definitions/FpmPeerSetAcceptRouteFlag.json
@@ -0,0 +1,40 @@
+{
+  "type": "object",
+  "title": "peers",
+  "required": [
+    "peers"
+  ],
+  "properties": {
+    "peers": {
+      "type": "array",
+      "xml": {
+        "name": "peers",
+        "wrapped": true
+      },
+      "items": {
+        "type": "object",
+        "title": "peer",
+        "required": [
+          "peerAddress",
+          "port",
+          "acceptRoutes"
+        ],
+        "properties": {
+          "peerAddress": {
+            "type": "string",
+            "example": "10.255.0.0"
+          },
+          "peerPort": {
+            "type": "int",
+            "example": "23456"
+          },
+          "acceptRoutes": {
+            "type": "boolean",
+            "example": "true"
+          }
+        }
+      }
+    }
+  }
+}
+
diff --git a/tools/package/etc/org.apache.karaf.command.acl.onos.cfg b/tools/package/etc/org.apache.karaf.command.acl.onos.cfg
index a35b13a..837f333 100644
--- a/tools/package/etc/org.apache.karaf.command.acl.onos.cfg
+++ b/tools/package/etc/org.apache.karaf.command.acl.onos.cfg
@@ -106,6 +106,7 @@
 flows = viewer
 fpm-connections = admin
 fpm-push-routes = admin
+fpm-set-accept-routes = admin
 gateway-add = admin
 gateway-delete = admin
 gateways = viewer
