diff --git a/core/net/src/test/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorAdapter.java b/core/net/src/test/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorAdapter.java
new file mode 100644
index 0000000..07f47b1
--- /dev/null
+++ b/core/net/src/test/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorAdapter.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2020-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.net.pi.impl;
+
+import com.google.common.collect.Maps;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.pi.model.PiPipeconf;
+import org.onosproject.net.pi.runtime.PiHandle;
+import org.onosproject.net.pi.runtime.PiTableEntry;
+import org.onosproject.net.pi.service.PiFlowRuleTranslator;
+import org.onosproject.net.pi.service.PiTranslatedEntity;
+import org.onosproject.net.pi.service.PiTranslationException;
+
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Adapter implementation of PiFlowRuleTranslator.
+ */
+public class PiFlowRuleTranslatorAdapter implements PiFlowRuleTranslator {
+
+    private final Map<PiHandle, PiTranslatedEntity<FlowRule, PiTableEntry>> store = Maps.newHashMap();
+
+    @Override
+    public PiTableEntry translate(FlowRule original, PiPipeconf pipeconf) throws PiTranslationException {
+        // NOTE Passing device equals to null is meant only for testing purposes
+        return PiFlowRuleTranslatorImpl.translate(original, pipeconf, null);
+    }
+
+    @Override
+    public void learn(PiHandle handle, PiTranslatedEntity<FlowRule, PiTableEntry> entity) {
+        store.put(handle, entity);
+    }
+
+    @Override
+    public Optional<PiTranslatedEntity<FlowRule, PiTableEntry>> lookup(PiHandle handle) {
+        return Optional.ofNullable(store.get(handle));
+    }
+
+    @Override
+    public void forget(PiHandle handle) {
+        store.remove(handle);
+    }
+}
diff --git a/core/net/src/test/java/org/onosproject/net/pi/impl/PiGroupTranslatorAdapter.java b/core/net/src/test/java/org/onosproject/net/pi/impl/PiGroupTranslatorAdapter.java
new file mode 100644
index 0000000..66383b3
--- /dev/null
+++ b/core/net/src/test/java/org/onosproject/net/pi/impl/PiGroupTranslatorAdapter.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2020-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.net.pi.impl;
+
+import com.google.common.collect.Maps;
+import org.onosproject.net.group.Group;
+import org.onosproject.net.pi.model.PiPipeconf;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiHandle;
+import org.onosproject.net.pi.service.PiGroupTranslator;
+import org.onosproject.net.pi.service.PiTranslatedEntity;
+import org.onosproject.net.pi.service.PiTranslationException;
+
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Adapter implementation of PiGroupTranslator.
+ */
+public class PiGroupTranslatorAdapter implements PiGroupTranslator {
+
+    private final Map<PiHandle, PiTranslatedEntity<Group, PiActionProfileGroup>> store = Maps.newHashMap();
+
+    @Override
+    public PiActionProfileGroup translate(Group original, PiPipeconf pipeconf) throws PiTranslationException {
+        // NOTE Passing device equals to null is meant only for testing purposes
+        return PiGroupTranslatorImpl.translate(original, pipeconf, null);
+    }
+
+    @Override
+    public void learn(PiHandle handle, PiTranslatedEntity<Group, PiActionProfileGroup> entity) {
+        store.put(handle, entity);
+    }
+
+    @Override
+    public Optional<PiTranslatedEntity<Group, PiActionProfileGroup>> lookup(PiHandle handle) {
+        return Optional.ofNullable(store.get(handle));
+    }
+
+    @Override
+    public void forget(PiHandle handle) {
+        store.remove(handle);
+    }
+}
diff --git a/core/net/src/test/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorAdapter.java b/core/net/src/test/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorAdapter.java
new file mode 100644
index 0000000..8f6f486
--- /dev/null
+++ b/core/net/src/test/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorAdapter.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2020-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.net.pi.impl;
+
+import com.google.common.collect.Maps;
+import org.onosproject.net.group.Group;
+import org.onosproject.net.pi.model.PiPipeconf;
+import org.onosproject.net.pi.runtime.PiHandle;
+import org.onosproject.net.pi.runtime.PiPreEntry;
+import org.onosproject.net.pi.service.PiReplicationGroupTranslator;
+import org.onosproject.net.pi.service.PiTranslatedEntity;
+import org.onosproject.net.pi.service.PiTranslationException;
+
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Adapter implementation of PiGroupTranslator.
+ */
+public class PiReplicationGroupTranslatorAdapter implements PiReplicationGroupTranslator {
+
+    private final Map<PiHandle, PiTranslatedEntity<Group, PiPreEntry>> store = Maps.newHashMap();
+
+    @Override
+    public PiPreEntry translate(Group original, PiPipeconf pipeconf) throws PiTranslationException {
+        // NOTE Passing device equals to null is meant only for testing purposes
+        return PiReplicationGroupTranslatorImpl.translate(original, pipeconf, null);
+    }
+
+    @Override
+    public void learn(PiHandle handle, PiTranslatedEntity<Group, PiPreEntry> entity) {
+        store.put(handle, entity);
+    }
+
+    @Override
+    public Optional<PiTranslatedEntity<Group, PiPreEntry>> lookup(PiHandle handle) {
+        return Optional.ofNullable(store.get(handle));
+    }
+
+    @Override
+    public void forget(PiHandle handle) {
+        store.remove(handle);
+    }
+}
