diff --git a/apps/pi-demo/common/src/main/java/org/onosproject/pi/demo/app/common/AbstractUpgradableFabricApp.java b/apps/pi-demo/common/src/main/java/org/onosproject/pi/demo/app/common/AbstractUpgradableFabricApp.java
index 485fc12..59af9dd 100644
--- a/apps/pi-demo/common/src/main/java/org/onosproject/pi/demo/app/common/AbstractUpgradableFabricApp.java
+++ b/apps/pi-demo/common/src/main/java/org/onosproject/pi/demo/app/common/AbstractUpgradableFabricApp.java
@@ -85,8 +85,9 @@
 
     private static final Map<String, AbstractUpgradableFabricApp> APP_HANDLES = Maps.newConcurrentMap();
 
-
-    private static final boolean TEST_MODE = true;
+    // Set to true to install test flow rules and groups to
+    // devices, without waiting for the full topology to come up.
+    private static final boolean TEST_MODE = false;
 
     // TOPO_SIZE should be the same of the --size argument when running bmv2-demo.py
     private static final int TOPO_SIZE = 2;
@@ -137,7 +138,7 @@
     private AbstractUpgradableFabricApp otherApp;
 
     private boolean flowRuleGenerated = false;
-    private ApplicationId appId;
+    protected ApplicationId appId;
 
     private Collection<PiPipeconf> appPipeconfs;
 
@@ -231,6 +232,10 @@
          */
         scheduledExecutorService.scheduleAtFixedRate(this::checkTopologyAndGenerateFlowRules,
                                                      0, CHECK_TOPOLOGY_INTERVAL_SECONDS, TimeUnit.SECONDS);
+
+        if (TEST_MODE) {
+            deviceService.getAvailableDevices().forEach(d -> testDevice(d.id()));
+        }
     }
 
     private void setAppFreezed(boolean appFreezed) {
@@ -364,6 +369,10 @@
      */
     private synchronized void checkTopologyAndGenerateFlowRules() {
 
+        if (TEST_MODE) {
+            return;
+        }
+
         Topology topo = topologyService.currentTopology();
         Set<Host> hosts = Sets.newHashSet(hostService.getHosts());
 
@@ -491,6 +500,14 @@
         return topologyService.isInfrastructure(topology, new ConnectPoint(port.element().id(), port.number()));
     }
 
+    private void testDevice(DeviceId deviceId) {
+        try {
+            generateTestFlowRules(deviceId).forEach(flowRuleService::applyFlowRules);
+        } catch (FlowRuleGeneratorException e) {
+            log.error("Exception while generating test flow rules for {}: {}", deviceId, e);
+        }
+    }
+
     /**
      * A listener of device events that executes a device deploy task each time a device is added, updated or
      * re-connects.
@@ -498,15 +515,12 @@
     private class InternalDeviceListener implements DeviceListener {
         @Override
         public void event(DeviceEvent event) {
-            spawnTask(() -> deployDevice(event.subject()));
-            if (event.type() == DEVICE_ADDED && TEST_MODE) {
-                DeviceId deviceId = event.subject().id();
-                try {
-                    generateTestFlowRules(deviceId).forEach(flowRuleService::applyFlowRules);
-                } catch (FlowRuleGeneratorException e) {
-                    log.error("Exception while generating test flow rules for {}: {}", deviceId, e);
+            spawnTask(() -> {
+                deployDevice(event.subject());
+                if (event.type() == DEVICE_ADDED && TEST_MODE) {
+                    testDevice(event.subject().id());
                 }
-            }
+            });
         }
 
         @Override
diff --git a/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorApp.java b/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorApp.java
index f5d43c6..f01d407 100644
--- a/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorApp.java
+++ b/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorApp.java
@@ -17,7 +17,16 @@
 package org.onosproject.pi.demo.app.tor;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.ImmutableTriple;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.commons.lang3.tuple.Triple;
 import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
@@ -30,22 +39,32 @@
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.group.DefaultGroupBucket;
+import org.onosproject.net.group.DefaultGroupDescription;
+import org.onosproject.net.group.GroupBucket;
+import org.onosproject.net.group.GroupBuckets;
+import org.onosproject.net.group.GroupDescription;
+import org.onosproject.net.group.GroupKey;
+import org.onosproject.net.group.GroupService;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionId;
+import org.onosproject.net.pi.runtime.PiActionGroupId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiGroupKey;
+import org.onosproject.net.pi.runtime.PiTableAction;
 import org.onosproject.net.topology.DefaultTopologyVertex;
 import org.onosproject.net.topology.Topology;
 import org.onosproject.net.topology.TopologyGraph;
 import org.onosproject.pi.demo.app.common.AbstractUpgradableFabricApp;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
-import java.util.Random;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
 import static com.google.common.collect.Collections2.permutations;
+import static java.util.Collections.singleton;
+import static java.util.stream.Collectors.toSet;
 import static org.onlab.util.ImmutableByteSequence.copyFrom;
 import static org.onosproject.pi.demo.app.tor.Combination.combinations;
 import static org.onosproject.pi.demo.app.tor.TorInterpreter.*;
@@ -58,11 +77,27 @@
 public class TorApp extends AbstractUpgradableFabricApp {
 
     private static final String APP_NAME = "org.onosproject.pi-tor";
+    // DeviceId -> Group reference (ports, smac, dmac) -> group id
+    private static final Map<DeviceId, Map<Triple<Set<PortNumber>, MacAddress, MacAddress>, Integer>>
+            DEVICE_GROUP_ID_MAP = Maps.newHashMap();
+
+    private static final boolean USE_ACTION_WITH_SINGLE_MEMBER_GROUP = false;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    private GroupService groupService;
+
+    private final Set<Pair<DeviceId, GroupKey>> groupKeys = Sets.newHashSet();
 
     public TorApp() {
         super(APP_NAME, TorPipeconfFactory.getAll());
     }
 
+    @Deactivate
+    public void deactivate() {
+        groupKeys.forEach(pair -> groupService.removeGroup(pair.getLeft(), pair.getRight(), appId));
+        super.deactivate();
+    }
+
     @Override
     public boolean initDevice(DeviceId deviceId) {
         // Nothing to do.
@@ -70,37 +105,54 @@
     }
 
     public List<FlowRule> generateTestFlowRules(DeviceId deviceId) throws FlowRuleGeneratorException {
-        Random rand = new Random();
+
+        /*
+        To test if the flow rules and groups are working, host pinging should work with this mn configuration:
+            $ sudo -E mn --custom $BMV2_MN_PY \
+                --switch onosbmv2,pipeconfId=bmv2-tor \
+                --controller remote,ip=192.168.56.1 --mac
+         */
         List<FlowRule> rules = Lists.newArrayList();
-        MacAddress ethAddr = MacAddress.ONOS;
-        IpAddress ipAddr = Ip4Address.valueOf(rand.nextInt());
-        PortNumber outPort =  PortNumber.portNumber(1, "eth0");
+        MacAddress ethAddr1 = MacAddress.valueOf("00:00:00:00:00:01");
+        MacAddress ethAddr2 = MacAddress.valueOf("00:00:00:00:00:02");
+        IpAddress ipAddr1 = Ip4Address.valueOf("10.0.0.1");
+        IpAddress ipAddr2 = Ip4Address.valueOf("10.0.0.2");
+        PortNumber outPort1 = PortNumber.portNumber(1);
+        PortNumber outPort2 = PortNumber.portNumber(2);
 
         // Filtering (match on eth, NoAction)
-        rules.add(
-                flowRuleBuilder(deviceId, L3_FILTER_TBL_ID)
-                        .withSelector(DefaultTrafficSelector.builder()
-                                              .matchEthDst(ethAddr)
-                                              .build())
-                        .withTreatment(DefaultTrafficTreatment.builder()
-                                               .piTableAction(PiAction.builder()
-                                                                      .withId(PiActionId.of("NoAction"))
-                                                                      .build())
-                                               .build())
-                        .build());
+        rules.addAll(generateFilteringRules(deviceId, Sets.newHashSet(ethAddr1, ethAddr2)));
 
-        // Forwarding
-        rules.add(
-                flowRuleBuilder(deviceId, L3_FWD_TBL_ID)
-                        .withSelector(
-                                DefaultTrafficSelector.builder()
-                                        .matchIPDst(ipAddr.toIpPrefix())
-                                        .build())
-                        .withTreatment(
-                                DefaultTrafficTreatment.builder()
-                                        .piTableAction(nextHopAction(outPort, ethAddr, ethAddr))
-                                        .build())
-                        .build());
+        try {
+            PiTableAction groupAction1 = provisionGroup(deviceId, singleton(outPort1), ethAddr2, ethAddr1);
+            PiTableAction groupAction2 = provisionGroup(deviceId, singleton(outPort2), ethAddr1, ethAddr2);
+            // Forwarding
+            rules.add(
+                    flowRuleBuilder(deviceId, L3_FWD_TBL_ID)
+                            .withSelector(
+                                    DefaultTrafficSelector.builder()
+                                            .matchIPDst(ipAddr1.toIpPrefix())
+                                            .build())
+                            .withTreatment(
+                                    DefaultTrafficTreatment.builder()
+                                            .piTableAction(groupAction1)
+                                            .build())
+                            .build());
+
+            rules.add(
+                    flowRuleBuilder(deviceId, L3_FWD_TBL_ID)
+                            .withSelector(
+                                    DefaultTrafficSelector.builder()
+                                            .matchIPDst(ipAddr2.toIpPrefix())
+                                            .build())
+                            .withTreatment(
+                                    DefaultTrafficTreatment.builder()
+                                            .piTableAction(groupAction2)
+                                            .build())
+                            .build());
+        } catch (Throwable e) {
+            log.error("{}", e);
+        }
 
         return rules;
     }
@@ -115,7 +167,7 @@
                 .stream()
                 .filter(port -> !isFabricPort(port, topo))
                 .map(Port::number)
-                .collect(Collectors.toSet());
+                .collect(toSet());
 
         // Get ports which connect this leaf to the given available spines.
         TopologyGraph graph = topologyService.getGraph(topo);
@@ -123,7 +175,7 @@
                 .stream()
                 .filter(e -> availableSpines.contains(e.dst().deviceId()))
                 .map(e -> e.link().src().port())
-                .collect(Collectors.toSet());
+                .collect(toSet());
 
         if (hostPorts.size() != 1 || fabricPorts.size() == 0) {
             log.error("Leaf switch has invalid port configuration: hostPorts={}, fabricPorts={}",
@@ -135,26 +187,13 @@
         List<FlowRule> rules = Lists.newArrayList();
 
         // Filtering rules
-        rules.addAll(generateFilteringRules(leaf, remoteHosts));
-        rules.addAll(generateFilteringRules(leaf, Collections.singleton(localHost)));
-
-        // FIXME: ignore ECMP for the moment
-        // if (fabricPorts.size() > 1) {
-        //     // Do ECMP.
-        //     Pair<PiTableAction, List<FlowRule>> result = provisionEcmpPiTableAction(leaf, fabricPorts);
-        //     rules.addAll(result.getRight());
-        //     treatment = DefaultTrafficTreatment.builder().piTableAction(result.getLeft()).build();
-        // } else {
-        //     // Output on port.
-        //     PortNumber outPort = fabricPorts.iterator().next();
-        //     treatment = DefaultTrafficTreatment.builder().setOutput(outPort).build();
-        // }
-
-
-        PortNumber outPort = fabricPorts.iterator().next();
+        Set<MacAddress> remoteMacAddrs = remoteHosts.stream().map(Host::mac).collect(toSet());
+        rules.addAll(generateFilteringRules(leaf, remoteMacAddrs));
+        rules.addAll(generateFilteringRules(leaf, singleton(localHost.mac())));
 
         // From local host to remote ones.
         for (Host remoteHost : remoteHosts) {
+            PiTableAction piTableAction = provisionGroup(leaf, fabricPorts, localHost.mac(), remoteHost.mac());
             for (IpAddress ipAddr : remoteHost.ipAddresses()) {
                 FlowRule rule = flowRuleBuilder(leaf, L3_FWD_TBL_ID)
                         .withSelector(
@@ -163,7 +202,7 @@
                                         .build())
                         .withTreatment(
                                 DefaultTrafficTreatment.builder()
-                                        .piTableAction(nextHopAction(outPort, localHost.mac(), remoteHost.mac()))
+                                        .piTableAction(piTableAction)
                                         .build())
                         .build();
                 rules.add(rule);
@@ -173,6 +212,8 @@
         // From remote hosts to the local one
         for (IpAddress dstIpAddr : localHost.ipAddresses()) {
             for (Host remoteHost : remoteHosts) {
+                PiTableAction tableAction = provisionGroup(leaf, singleton(hostPort), remoteHost.mac(),
+                                                           localHost.mac());
                 FlowRule rule = flowRuleBuilder(leaf, L3_FWD_TBL_ID)
                         .withSelector(
                                 DefaultTrafficSelector.builder()
@@ -180,7 +221,7 @@
                                         .build())
                         .withTreatment(
                                 DefaultTrafficTreatment.builder()
-                                        .piTableAction(nextHopAction(hostPort, remoteHost.mac(), localHost.mac()))
+                                        .piTableAction(tableAction)
                                         .build())
                         .build();
                 rules.add(rule);
@@ -190,23 +231,14 @@
         return rules;
     }
 
-    private PiAction nextHopAction(PortNumber port, MacAddress smac, MacAddress dmac) {
-        return PiAction.builder()
-                .withId(SET_NEXT_HOP_ACT_ID)
-                .withParameter(new PiActionParam(PORT_ACT_PRM_ID, copyFrom(port.toLong())))
-                // Ignore L3 routing behaviour by keeping the original host mac addresses at each hop.
-                .withParameter(new PiActionParam(SMAC_ACT_PRM_ID, copyFrom(smac.toBytes())))
-                .withParameter(new PiActionParam(DMAC_ACT_PRM_ID, copyFrom(dmac.toBytes())))
-                .build();
-    }
-
     @Override
     public List<FlowRule> generateSpineRules(DeviceId spine, Set<Host> hosts, Topology topo)
             throws FlowRuleGeneratorException {
 
         List<FlowRule> rules = Lists.newArrayList();
 
-        rules.addAll(generateFilteringRules(spine, hosts));
+        Set<MacAddress> macAddrs = hosts.stream().map(Host::mac).collect(toSet());
+        rules.addAll(generateFilteringRules(spine, macAddrs));
 
         // For each host pair (src -> dst)
         for (Set<Host> hostCombs : combinations(hosts, 2)) {
@@ -222,24 +254,11 @@
                     throw new FlowRuleGeneratorException();
                 }
 
-                TrafficTreatment treatment;
+                Set<PortNumber> ports = paths.stream().map(p -> p.src().port()).collect(toSet());
+                PiTableAction piTableAction = provisionGroup(spine, ports, srcHost.mac(), dstHost.mac());
 
-                // FIXME: ingore ECMP for the moment
-                // if (paths.size() == 1) {
-                //     // Only one path, do output on port.
-                //     PortNumber port = paths.iterator().next().src().port();
-                //     treatment = DefaultTrafficTreatment.builder().setOutput(port).build();
-                // } else {
-                //     // Multiple paths, do ECMP.
-                //     Set<PortNumber> portNumbers = paths.stream().map(p -> p.src().port()).collect(toSet());
-                //     Pair<PiTableAction, List<FlowRule>> result = provisionEcmpPiTableAction(deviceId, portNumbers);
-                //     rules.addAll(result.getRight());
-                //     treatment = DefaultTrafficTreatment.builder().piTableAction(result.getLeft()).build();
-                // }
-
-                PortNumber port = paths.iterator().next().src().port();
-                treatment = DefaultTrafficTreatment.builder()
-                        .piTableAction(nextHopAction(port, srcHost.mac(), dstHost.mac()))
+                TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                        .piTableAction(piTableAction)
                         .build();
 
                 for (IpAddress dstIpAddr : dstHost.ipAddresses()) {
@@ -259,19 +278,17 @@
         return rules;
     }
 
-    private List<FlowRule> generateFilteringRules(DeviceId deviceId, Collection<Host> dstHosts)
+    private List<FlowRule> generateFilteringRules(DeviceId deviceId, Collection<MacAddress> macAddrs)
             throws FlowRuleGeneratorException {
-
         List<FlowRule> rules = Lists.newArrayList();
-        for (Host host : dstHosts) {
-            MacAddress ethAddr = host.mac();
+        for (MacAddress macAddr : macAddrs) {
             FlowRule rule = flowRuleBuilder(deviceId, L3_FILTER_TBL_ID)
                     .withSelector(DefaultTrafficSelector.builder()
-                                          .matchEthDst(ethAddr)
+                                          .matchEthDst(macAddr)
                                           .build())
                     .withTreatment(DefaultTrafficTreatment.builder()
                                            .piTableAction(PiAction.builder()
-                                                                  .withId(PiActionId.of("NoAction"))
+                                                                  .withId(NO_ACTION_ID)
                                                                   .build())
                                            .build())
                     .build();
@@ -280,4 +297,59 @@
         return rules;
     }
 
+    private PiTableAction provisionGroup(DeviceId deviceId, Set<PortNumber> ports, MacAddress smac,
+                                         MacAddress dmac) {
+
+        if (USE_ACTION_WITH_SINGLE_MEMBER_GROUP && ports.size() == 1) {
+            return nextHopAction(ports.iterator().next(), smac, dmac);
+        }
+
+        DEVICE_GROUP_ID_MAP.putIfAbsent(deviceId, Maps.newHashMap());
+
+        Triple<Set<PortNumber>, MacAddress, MacAddress> groupRef = ImmutableTriple.of(ports, smac, dmac);
+
+        if (!DEVICE_GROUP_ID_MAP.get(deviceId).containsKey(groupRef)) {
+            // Provision group to device
+
+            // We get a group ID by counting the number of unique <ports, smac, dmac> triples for each deviceId.
+            // Each distinct triple will have a unique group ID unique in the scope of a device.
+            int groupId = DEVICE_GROUP_ID_MAP.get(deviceId).size() + 1;
+
+            // Group buckets
+            List<GroupBucket> bucketList = ports.stream()
+                    .map(port -> nextHopAction(port, smac, dmac))
+                    .map(piAction -> DefaultTrafficTreatment.builder().piTableAction(piAction).build())
+                    .map(DefaultGroupBucket::createSelectGroupBucket)
+                    .collect(Collectors.toList());
+
+            // Group cookie (with action profile ID)
+            PiGroupKey groupKey = new PiGroupKey(L3_FWD_TBL_ID, WCMP_ACT_PROF_ID, groupId);
+            groupKeys.add(ImmutablePair.of(deviceId, groupKey));
+
+            // Group desc
+            GroupDescription groupDesc = new DefaultGroupDescription(deviceId,
+                                                                     GroupDescription.Type.SELECT,
+                                                                     new GroupBuckets(bucketList),
+                                                                     groupKey,
+                                                                     groupId,
+                                                                     appId);
+            log.info("Adding group {} to {}...", groupId, deviceId);
+            groupService.addGroup(groupDesc);
+
+            DEVICE_GROUP_ID_MAP.get(deviceId).put(groupRef, groupId);
+        }
+
+        return PiActionGroupId.of(DEVICE_GROUP_ID_MAP.get(deviceId).get(groupRef));
+    }
+
+    private PiAction nextHopAction(PortNumber port, MacAddress smac, MacAddress dmac) {
+        return PiAction.builder()
+                .withId(SET_NEXT_HOP_ACT_ID)
+                .withParameter(new PiActionParam(PORT_ACT_PRM_ID, copyFrom(port.toLong())))
+                // Ignore L3 routing behaviour by keeping the original host mac addresses at each hop.
+                .withParameter(new PiActionParam(SMAC_ACT_PRM_ID, copyFrom(smac.toBytes())))
+                .withParameter(new PiActionParam(DMAC_ACT_PRM_ID, copyFrom(dmac.toBytes())))
+                .build();
+    }
+
 }
\ No newline at end of file
diff --git a/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorInterpreter.java b/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorInterpreter.java
index c893e4a..6bf4f77 100644
--- a/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorInterpreter.java
+++ b/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorInterpreter.java
@@ -38,6 +38,7 @@
 import org.onosproject.net.pi.runtime.PiActionId;
 import org.onosproject.net.pi.runtime.PiActionParam;
 import org.onosproject.net.pi.runtime.PiActionParamId;
+import org.onosproject.net.pi.runtime.PiActionProfileId;
 import org.onosproject.net.pi.runtime.PiCounterId;
 import org.onosproject.net.pi.runtime.PiHeaderFieldId;
 import org.onosproject.net.pi.runtime.PiPacketMetadata;
@@ -83,6 +84,8 @@
     static final PiActionParamId PORT_ACT_PRM_ID = PiActionParamId.of("port");
     static final PiActionParamId SMAC_ACT_PRM_ID = PiActionParamId.of("smac");
     static final PiActionParamId DMAC_ACT_PRM_ID = PiActionParamId.of("dmac");
+    static final PiActionProfileId WCMP_ACT_PROF_ID = PiActionProfileId.of("l3_fwd.wcmp_action_profile");
+    static final PiActionId NO_ACTION_ID = PiActionId.of("NoAction");
 
     // Set as per value in headers.p4 in packet_out_header
     private static final int PORT_FIELD_BITWIDTH = 9;
diff --git a/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorPipeconfFactory.java b/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorPipeconfFactory.java
index 8b6b94d..e09435f 100644
--- a/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorPipeconfFactory.java
+++ b/apps/pi-demo/tor/src/main/java/org/onosproject/pi/demo/app/tor/TorPipeconfFactory.java
@@ -32,10 +32,7 @@
 import java.util.Collection;
 
 import static java.lang.String.format;
-import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.BMV2_JSON;
-import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.P4_INFO_TEXT;
-import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.TOFINO_BIN;
-import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.TOFINO_CONTEXT_JSON;
+import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.*;
 
 /**
  * Pipeconf factory for all tor.p4 based pipeconf, both BMv2 and Tofino
@@ -76,7 +73,7 @@
                 // .addBehaviour(LinkDiscovery.class, NetcfgLinkDiscovery.class)
                 // FIXME: change underneath to proper TOR implementation
                 .addBehaviour(Pipeliner.class, DefaultSingleTablePipeline.class)
-                .addBehaviour(PortStatisticsDiscovery.class, DefaultP4PortStatisticsDiscovery.class);
+                .addBehaviour(PortStatisticsDiscovery.class, TorPortStatisticsDiscovery.class);
     }
 
     private static PiPipeconf buildTofinoPipeconf(String system) {
@@ -98,4 +95,11 @@
                 .addExtension(BMV2_JSON, BMV2_JSON_URL)
                 .build();
     }
+
+    public static class TorPortStatisticsDiscovery extends DefaultP4PortStatisticsDiscovery {
+        @Override
+        public String scope() {
+            return "packetio_egress";
+        }
+    }
 }
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeFlowRuleProgrammable.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeFlowRuleProgrammable.java
index fe2df80..19530f4 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeFlowRuleProgrammable.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeFlowRuleProgrammable.java
@@ -76,7 +76,8 @@
     /*
     If true, we avoid querying the device and return the content of the ENTRY_STORE.
      */
-    private boolean ignoreDeviceWhenGet = false;
+    // TODO: set to false as soon as the read-table tofino bug is fixed.
+    private boolean ignoreDeviceWhenGet = true;
 
     /*
     If true, we read all direct counters of a table with one request. Otherwise, send as many request as the number of
