diff --git a/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
index 60ab307..0c07bab 100644
--- a/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
@@ -50,6 +50,7 @@
 import org.slf4j.Logger;
 
 import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
@@ -116,71 +117,38 @@
 
     @Override
     public void applyFlowRules(FlowRule... flowRules) {
+        Set<FlowRuleBatchEntry> toAddBatchEntries = Sets.newHashSet();
         for (int i = 0; i < flowRules.length; i++) {
-            FlowRule f = flowRules[i];
-            store.storeFlowRule(f);
+            toAddBatchEntries.add(new FlowRuleBatchEntry(FlowRuleOperation.ADD, flowRules[i]));
         }
-    }
-
-    private void applyFlowRulesToProviders(FlowRule... flowRules) {
-        DeviceId did = null;
-        FlowRuleProvider frp = null;
-        for (FlowRule f : flowRules) {
-            if (!f.deviceId().equals(did)) {
-                did = f.deviceId();
-                final Device device = deviceService.getDevice(did);
-                frp = getProvider(device.providerId());
-            }
-            if (frp != null) {
-                frp.applyFlowRule(f);
-            }
-        }
+        applyBatch(new FlowRuleBatchOperation(toAddBatchEntries));
     }
 
     @Override
     public void removeFlowRules(FlowRule... flowRules) {
-        FlowRule f;
+        Set<FlowRuleBatchEntry> toRemoveBatchEntries = Sets.newHashSet();
         for (int i = 0; i < flowRules.length; i++) {
-            f = flowRules[i];
-            store.deleteFlowRule(f);
+            toRemoveBatchEntries.add(new FlowRuleBatchEntry(FlowRuleOperation.REMOVE, flowRules[i]));
         }
-    }
-
-    private void removeFlowRulesFromProviders(FlowRule... flowRules) {
-        DeviceId did = null;
-        FlowRuleProvider frp = null;
-        for (FlowRule f : flowRules) {
-            if (!f.deviceId().equals(did)) {
-                did = f.deviceId();
-                final Device device = deviceService.getDevice(did);
-                frp = getProvider(device.providerId());
-            }
-            if (frp != null) {
-                frp.removeFlowRule(f);
-            }
-        }
+        applyBatch(new FlowRuleBatchOperation(toRemoveBatchEntries));
     }
 
     @Override
     public void removeFlowRulesById(ApplicationId id) {
-        Iterable<FlowRule> rules = getFlowRulesById(id);
-        FlowRuleProvider frp;
-        Device device;
-
-        for (FlowRule f : rules) {
-            store.deleteFlowRule(f);
-            // FIXME: only accept request and push to provider on internal event
-            device = deviceService.getDevice(f.deviceId());
-            frp = getProvider(device.providerId());
-            // FIXME: flows removed from store and flows removed from might diverge
-            //        get rid of #removeRulesById?
-            frp.removeRulesById(id, f);
-        }
+        removeFlowRules(Iterables.toArray(getFlowRulesById(id), FlowRule.class));
     }
 
     @Override
     public Iterable<FlowRule> getFlowRulesById(ApplicationId id) {
-        return store.getFlowRulesByAppId(id);
+        Set<FlowRule> flowEntries = Sets.newHashSet();
+        for (Device d : deviceService.getDevices()) {
+            for (FlowEntry flowEntry : store.getFlowEntries(d.id())) {
+                if (flowEntry.appId() == id.id()) {
+                    flowEntries.add(flowEntry);
+                }
+            }
+        }
+        return flowEntries;
     }
 
     @Override
diff --git a/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
index 659a2c4..85ceb3f 100644
--- a/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
@@ -12,6 +12,7 @@
 import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_UPDATED;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -461,12 +462,12 @@
 
         @Override
         public int getDeviceCount() {
-            return 0;
+            return 1;
         }
 
         @Override
         public Iterable<Device> getDevices() {
-            return null;
+            return Arrays.asList(DEV);
         }
 
         @Override
