diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiMulticastGroupTranslatorImpl.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorImpl.java
similarity index 79%
rename from core/net/src/main/java/org/onosproject/net/pi/impl/PiMulticastGroupTranslatorImpl.java
rename to core/net/src/main/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorImpl.java
index 7d48209..1f562a4 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiMulticastGroupTranslatorImpl.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorImpl.java
@@ -26,7 +26,9 @@
 import org.onosproject.net.group.GroupDescription;
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.model.PiPipelineInterpreter;
+import org.onosproject.net.pi.runtime.PiCloneSessionEntry;
 import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
+import org.onosproject.net.pi.runtime.PiPreEntry;
 import org.onosproject.net.pi.runtime.PiPreReplica;
 import org.onosproject.net.pi.service.PiTranslationException;
 
@@ -41,19 +43,20 @@
 import static java.lang.String.format;
 
 /**
- * Implementation of multicast group translation logic.
+ * Implementation of replication group translation logic.
  */
-final class PiMulticastGroupTranslatorImpl {
+final class PiReplicationGroupTranslatorImpl {
 
-    private PiMulticastGroupTranslatorImpl() {
+    private PiReplicationGroupTranslatorImpl() {
         // Hides constructor.
     }
 
     /**
-     * Returns a PI PRE multicast group entry equivalent to the given group, for
-     * the given pipeconf and device.
+     * Returns a PI PRE entry equivalent to the given group, for the given
+     * pipeconf and device.
      * <p>
-     * The passed group is expected to have type {@link GroupDescription.Type#ALL}.
+     * The passed group is expected to have type {@link GroupDescription.Type#ALL}
+     * or {@link GroupDescription.Type#CLONE}.
      *
      * @param group    group
      * @param pipeconf pipeconf
@@ -61,16 +64,11 @@
      * @return PI PRE entry
      * @throws PiTranslationException if the group cannot be translated
      */
-    static PiMulticastGroupEntry translate(Group group, PiPipeconf pipeconf, Device device)
+    static PiPreEntry translate(Group group, PiPipeconf pipeconf, Device device)
             throws PiTranslationException {
 
         checkNotNull(group);
 
-        if (!group.type().equals(GroupDescription.Type.ALL)) {
-            throw new PiTranslationException(format(
-                    "group type %s not supported", group.type()));
-        }
-
         final List<Instruction> instructions = group.buckets().buckets().stream()
                 .flatMap(b -> b.treatment().allInstructions().stream())
                 .collect(Collectors.toList());
@@ -88,10 +86,21 @@
                 .map(i -> (OutputInstruction) i)
                 .collect(Collectors.toList());
 
-        return PiMulticastGroupEntry.builder()
-                .withGroupId(group.id().id())
-                .addReplicas(getReplicas(outInstructions, device))
-                .build();
+        switch (group.type()) {
+            case ALL:
+                return PiMulticastGroupEntry.builder()
+                        .withGroupId(group.id().id())
+                        .addReplicas(getReplicas(outInstructions, device))
+                        .build();
+            case CLONE:
+                return PiCloneSessionEntry.builder()
+                        .withSessionId(group.id().id())
+                        .addReplicas(getReplicas(outInstructions, device))
+                        .build();
+            default:
+                throw new PiTranslationException(format(
+                        "group type %s not supported", group.type()));
+        }
     }
 
     private static Set<PiPreReplica> getReplicas(
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
index 510ad01..18746d3 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
@@ -25,7 +25,7 @@
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.runtime.PiActionProfileGroup;
 import org.onosproject.net.pi.runtime.PiMeterCellConfig;
-import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
+import org.onosproject.net.pi.runtime.PiPreEntry;
 import org.onosproject.net.pi.runtime.PiTableEntry;
 import org.onosproject.net.pi.service.PiFlowRuleTranslationStore;
 import org.onosproject.net.pi.service.PiFlowRuleTranslator;
@@ -33,8 +33,8 @@
 import org.onosproject.net.pi.service.PiGroupTranslator;
 import org.onosproject.net.pi.service.PiMeterTranslationStore;
 import org.onosproject.net.pi.service.PiMeterTranslator;
-import org.onosproject.net.pi.service.PiMulticastGroupTranslationStore;
-import org.onosproject.net.pi.service.PiMulticastGroupTranslator;
+import org.onosproject.net.pi.service.PiReplicationGroupTranslationStore;
+import org.onosproject.net.pi.service.PiReplicationGroupTranslator;
 import org.onosproject.net.pi.service.PiTranslationException;
 import org.onosproject.net.pi.service.PiTranslationService;
 import org.osgi.service.component.annotations.Activate;
@@ -67,21 +67,21 @@
     private PiGroupTranslationStore groupTranslationStore;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    private PiMulticastGroupTranslationStore mcGroupTranslationStore;
+    private PiReplicationGroupTranslationStore repGroupTranslationStore;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiMeterTranslationStore meterTranslationStore;
 
     private PiFlowRuleTranslator flowRuleTranslator;
     private PiGroupTranslator groupTranslator;
-    private PiMulticastGroupTranslator mcGroupTranslator;
+    private PiReplicationGroupTranslator repGroupTranslator;
     private PiMeterTranslator meterTranslator;
 
     @Activate
     public void activate() {
         flowRuleTranslator = new InternalFlowRuleTranslator(flowRuleTranslationStore);
         groupTranslator = new InternalGroupTranslator(groupTranslationStore);
-        mcGroupTranslator = new InternalMulticastGroupTranslator(mcGroupTranslationStore);
+        repGroupTranslator = new InternalReplicationGroupTranslator(repGroupTranslationStore);
         meterTranslator = new InternalMeterTranslator(meterTranslationStore);
         log.info("Started");
     }
@@ -110,8 +110,8 @@
     }
 
     @Override
-    public PiMulticastGroupTranslator multicastGroupTranslator() {
-        return mcGroupTranslator;
+    public PiReplicationGroupTranslator replicationGroupTranslator() {
+        return repGroupTranslator;
     }
 
     private Device getDevice(DeviceId deviceId) throws PiTranslationException {
@@ -158,20 +158,20 @@
         }
     }
 
-    private final class InternalMulticastGroupTranslator
-            extends AbstractPiTranslatorImpl<Group, PiMulticastGroupEntry>
-            implements PiMulticastGroupTranslator {
+    private final class InternalReplicationGroupTranslator
+            extends AbstractPiTranslatorImpl<Group, PiPreEntry>
+            implements PiReplicationGroupTranslator {
 
-        private InternalMulticastGroupTranslator(PiMulticastGroupTranslationStore store) {
+        private InternalReplicationGroupTranslator(PiReplicationGroupTranslationStore store) {
             super(store);
         }
 
         @Override
-        public PiMulticastGroupEntry translate(Group original, PiPipeconf pipeconf)
+        public PiPreEntry translate(Group original, PiPipeconf pipeconf)
                 throws PiTranslationException {
             checkNotNull(original);
             checkNotNull(pipeconf);
-            return PiMulticastGroupTranslatorImpl.translate(
+            return PiReplicationGroupTranslatorImpl.translate(
                     original, pipeconf, getDevice(original.deviceId()));
         }
     }
diff --git a/core/net/src/test/java/org/onosproject/net/pi/impl/PiMulticastGroupTranslatorImplTest.java b/core/net/src/test/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorImplTest.java
similarity index 70%
rename from core/net/src/test/java/org/onosproject/net/pi/impl/PiMulticastGroupTranslatorImplTest.java
rename to core/net/src/test/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorImplTest.java
index 9fb7076..7b5e213 100644
--- a/core/net/src/test/java/org/onosproject/net/pi/impl/PiMulticastGroupTranslatorImplTest.java
+++ b/core/net/src/test/java/org/onosproject/net/pi/impl/PiReplicationGroupTranslatorImplTest.java
@@ -30,35 +30,42 @@
 import org.onosproject.net.group.DefaultGroup;
 import org.onosproject.net.group.DefaultGroupBucket;
 import org.onosproject.net.group.DefaultGroupDescription;
+import org.onosproject.net.group.DefaultGroupKey;
 import org.onosproject.net.group.Group;
 import org.onosproject.net.group.GroupBucket;
 import org.onosproject.net.group.GroupBuckets;
 import org.onosproject.net.group.GroupDescription;
-import org.onosproject.net.pi.runtime.PiGroupKey;
+import org.onosproject.net.group.GroupKey;
+import org.onosproject.net.pi.runtime.PiCloneSessionEntry;
 import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
+import org.onosproject.net.pi.runtime.PiPreEntry;
 import org.onosproject.net.pi.runtime.PiPreReplica;
 
 import java.util.List;
 import java.util.Set;
 
 import static org.onosproject.net.group.GroupDescription.Type.ALL;
-import static org.onosproject.pipelines.basic.BasicConstants.INGRESS_WCMP_CONTROL_WCMP_SELECTOR;
-import static org.onosproject.pipelines.basic.BasicConstants.INGRESS_WCMP_CONTROL_WCMP_TABLE;
+import static org.onosproject.net.group.GroupDescription.Type.CLONE;
 
 /**
- * Test for {@link PiMulticastGroupTranslatorImpl}.
+ * Test for {@link PiReplicationGroupTranslatorImpl}.
  */
-public class PiMulticastGroupTranslatorImplTest {
+public class PiReplicationGroupTranslatorImplTest {
     private static final DeviceId DEVICE_ID = DeviceId.deviceId("device:dummy:1");
     private static final ApplicationId APP_ID = TestApplicationId.create("dummy");
-    private static final GroupId GROUP_ID = GroupId.valueOf(1);
-    private static final PiGroupKey GROUP_KEY = new PiGroupKey(
-            INGRESS_WCMP_CONTROL_WCMP_TABLE, INGRESS_WCMP_CONTROL_WCMP_SELECTOR, GROUP_ID.id());
+    private static final int ENTRY_ID = 99;
+    private static final GroupId GROUP_ID = GroupId.valueOf(ENTRY_ID);
+    private static final GroupKey GROUP_KEY = new DefaultGroupKey(
+            String.valueOf(GROUP_ID.id()).getBytes());
 
     private static final List<GroupBucket> BUCKET_LIST = ImmutableList.of(
             allOutputBucket(1),
             allOutputBucket(2),
             allOutputBucket(3));
+    private static final List<GroupBucket> CLONE_BUCKET_LIST = ImmutableList.of(
+            cloneOutputBucket(1),
+            cloneOutputBucket(2),
+            cloneOutputBucket(3));
     private static final List<GroupBucket> BUCKET_LIST_2 = ImmutableList.of(
             allOutputBucket(1),
             allOutputBucket(2),
@@ -82,6 +89,11 @@
                     .withGroupId(GROUP_ID.id())
                     .addReplicas(REPLICAS)
                     .build();
+    private static final PiCloneSessionEntry PI_CLONE_SESSION_ENTRY =
+            PiCloneSessionEntry.builder()
+                    .withSessionId(ENTRY_ID)
+                    .addReplicas(REPLICAS)
+                    .build();
     private static final PiMulticastGroupEntry PI_MULTICAST_GROUP_2 =
             PiMulticastGroupEntry.builder()
                     .withGroupId(GROUP_ID.id())
@@ -89,12 +101,17 @@
                     .build();
 
     private static final GroupBuckets BUCKETS = new GroupBuckets(BUCKET_LIST);
+    private static final GroupBuckets CLONE_BUCKETS = new GroupBuckets(CLONE_BUCKET_LIST);
     private static final GroupBuckets BUCKETS_2 = new GroupBuckets(BUCKET_LIST_2);
 
     private static final GroupDescription ALL_GROUP_DESC = new DefaultGroupDescription(
             DEVICE_ID, ALL, BUCKETS, GROUP_KEY, GROUP_ID.id(), APP_ID);
     private static final Group ALL_GROUP = new DefaultGroup(GROUP_ID, ALL_GROUP_DESC);
 
+    private static final GroupDescription CLONE_GROUP_DESC = new DefaultGroupDescription(
+            DEVICE_ID, CLONE, CLONE_BUCKETS, GROUP_KEY, GROUP_ID.id(), APP_ID);
+    private static final Group CLONE_GROUP = new DefaultGroup(GROUP_ID, CLONE_GROUP_DESC);
+
     private static final GroupDescription ALL_GROUP_DESC_2 = new DefaultGroupDescription(
             DEVICE_ID, ALL, BUCKETS_2, GROUP_KEY, GROUP_ID.id(), APP_ID);
     private static final Group ALL_GROUP_2 = new DefaultGroup(GROUP_ID, ALL_GROUP_DESC_2);
@@ -107,17 +124,27 @@
         return DefaultGroupBucket.createAllGroupBucket(treatment);
     }
 
+    private static GroupBucket cloneOutputBucket(int portNum) {
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .setOutput(PortNumber.portNumber(portNum))
+                .build();
+        return DefaultGroupBucket.createCloneGroupBucket(treatment);
+    }
+
     @Test
     public void testTranslatePreGroups() throws Exception {
 
-        PiMulticastGroupEntry multicastGroup = PiMulticastGroupTranslatorImpl
+        PiPreEntry multicastGroup = PiReplicationGroupTranslatorImpl
                 .translate(ALL_GROUP, null, null);
-        PiMulticastGroupEntry multicastGroup2 = PiMulticastGroupTranslatorImpl
+        PiPreEntry multicastGroup2 = PiReplicationGroupTranslatorImpl
                 .translate(ALL_GROUP_2, null, null);
+        PiPreEntry cloneSessionEntry = PiReplicationGroupTranslatorImpl
+                .translate(CLONE_GROUP, null, null);
 
         new EqualsTester()
                 .addEqualityGroup(multicastGroup, PI_MULTICAST_GROUP)
                 .addEqualityGroup(multicastGroup2, PI_MULTICAST_GROUP_2)
+                .addEqualityGroup(cloneSessionEntry, PI_CLONE_SESSION_ENTRY)
                 .testEquals();
     }
 }
