diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeActionGroupProgrammable.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeActionGroupProgrammable.java
index c20c899..4a48897 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeActionGroupProgrammable.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeActionGroupProgrammable.java
@@ -23,8 +23,8 @@
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Striped;
 import org.onlab.util.SharedExecutors;
+import org.onosproject.drivers.p4runtime.mirror.P4RuntimeActionProfileGroupMirror;
 import org.onosproject.drivers.p4runtime.mirror.P4RuntimeActionProfileMemberMirror;
-import org.onosproject.drivers.p4runtime.mirror.P4RuntimeGroupMirror;
 import org.onosproject.drivers.p4runtime.mirror.TimedEntry;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DeviceId;
@@ -40,11 +40,11 @@
 import org.onosproject.net.pi.model.PiActionProfileId;
 import org.onosproject.net.pi.model.PiActionProfileModel;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupHandle;
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberHandle;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.service.PiGroupTranslator;
 import org.onosproject.net.pi.service.PiTranslatedEntity;
 import org.onosproject.net.pi.service.PiTranslationException;
@@ -80,7 +80,7 @@
     private static final String MAX_MEM_SIZE = "maxMemSize";
 
     protected GroupStore groupStore;
-    private P4RuntimeGroupMirror groupMirror;
+    private P4RuntimeActionProfileGroupMirror groupMirror;
     private P4RuntimeActionProfileMemberMirror memberMirror;
     private PiGroupTranslator groupTranslator;
 
@@ -93,7 +93,7 @@
         if (!super.setupBehaviour()) {
             return false;
         }
-        groupMirror = this.handler().get(P4RuntimeGroupMirror.class);
+        groupMirror = this.handler().get(P4RuntimeActionProfileGroupMirror.class);
         memberMirror = this.handler().get(P4RuntimeActionProfileMemberMirror.class);
         groupStore = handler().get(GroupStore.class);
         groupTranslator = translationService.groupTranslator();
@@ -140,14 +140,14 @@
                 .stream()
                 .map(PiActionProfileModel::id)
                 .collect(Collectors.toList());
-        final List<PiActionGroup> groupsOnDevice = actionProfileIds.stream()
+        final List<PiActionProfileGroup> groupsOnDevice = actionProfileIds.stream()
                 .flatMap(this::streamGroupsFromDevice)
                 .collect(Collectors.toList());
-        final Set<PiActionGroupMemberHandle> membersOnDevice = actionProfileIds
+        final Set<PiActionProfileMemberHandle> membersOnDevice = actionProfileIds
                 .stream()
                 .flatMap(actProfId -> getMembersFromDevice(actProfId)
                         .stream()
-                        .map(memberId -> PiActionGroupMemberHandle.of(
+                        .map(memberId -> PiActionProfileMemberHandle.of(
                                 deviceId, actProfId, memberId)))
                 .collect(Collectors.toSet());
 
@@ -160,10 +160,10 @@
         syncMemberMirror(membersOnDevice);
 
         final List<Group> result = Lists.newArrayList();
-        final List<PiActionGroup> inconsistentGroups = Lists.newArrayList();
-        final List<PiActionGroup> validGroups = Lists.newArrayList();
+        final List<PiActionProfileGroup> inconsistentGroups = Lists.newArrayList();
+        final List<PiActionProfileGroup> validGroups = Lists.newArrayList();
 
-        for (PiActionGroup piGroup : groupsOnDevice) {
+        for (PiActionProfileGroup piGroup : groupsOnDevice) {
             final Group pdGroup = forgeGroupEntry(piGroup);
             if (pdGroup == null) {
                 // Entry is on device but unknown to translation service or
@@ -178,11 +178,11 @@
         // Trigger clean up of inconsistent groups and members. This will also
         // remove all members that are not used by any group, and update the
         // mirror accordingly.
-        final Set<PiActionGroupMemberHandle> membersToKeep = validGroups.stream()
+        final Set<PiActionProfileMemberHandle> membersToKeep = validGroups.stream()
                 .flatMap(g -> g.members().stream())
-                .map(m -> PiActionGroupMemberHandle.of(deviceId, m))
+                .map(m -> PiActionProfileMemberHandle.of(deviceId, m))
                 .collect(Collectors.toSet());
-        final Set<PiActionGroupMemberHandle> inconsistentMembers = Sets.difference(
+        final Set<PiActionProfileMemberHandle> inconsistentMembers = Sets.difference(
                 membersOnDevice, membersToKeep);
         SharedExecutors.getSingleThreadExecutor().execute(
                 () -> cleanUpInconsistentGroupsAndMembers(
@@ -191,15 +191,15 @@
         return result;
     }
 
-    private void syncGroupMirror(Collection<PiActionGroup> groups) {
-        Map<PiActionGroupHandle, PiActionGroup> handleMap = Maps.newHashMap();
-        groups.forEach(g -> handleMap.put(PiActionGroupHandle.of(deviceId, g), g));
+    private void syncGroupMirror(Collection<PiActionProfileGroup> groups) {
+        Map<PiActionProfileGroupHandle, PiActionProfileGroup> handleMap = Maps.newHashMap();
+        groups.forEach(g -> handleMap.put(PiActionProfileGroupHandle.of(deviceId, g), g));
         groupMirror.sync(deviceId, handleMap);
     }
 
-    private void syncMemberMirror(Collection<PiActionGroupMemberHandle> memberHandles) {
-        Map<PiActionGroupMemberHandle, PiActionGroupMember> handleMap = Maps.newHashMap();
-       memberHandles.forEach(handle -> handleMap.put(
+    private void syncMemberMirror(Collection<PiActionProfileMemberHandle> memberHandles) {
+        Map<PiActionProfileMemberHandle, PiActionProfileMember> handleMap = Maps.newHashMap();
+        memberHandles.forEach(handle -> handleMap.put(
                 handle, dummyMember(handle.actionProfileId(), handle.memberId())));
         memberMirror.sync(deviceId, handleMap);
     }
@@ -212,8 +212,8 @@
                 .collect(Collectors.toList());
     }
 
-    private void cleanUpInconsistentGroupsAndMembers(Collection<PiActionGroup> groupsToRemove,
-                                                     Collection<PiActionGroupMemberHandle> membersToRemove) {
+    private void cleanUpInconsistentGroupsAndMembers(Collection<PiActionProfileGroup> groupsToRemove,
+                                                     Collection<PiActionProfileMemberHandle> membersToRemove) {
         if (!groupsToRemove.isEmpty()) {
             log.warn("Found {} inconsistent action profile groups on {}, removing them...",
                      groupsToRemove.size(), deviceId);
@@ -227,33 +227,33 @@
                      membersToRemove.size(), deviceId);
             // FIXME: implement client call to remove members from multiple
             // action profiles in one shot.
-            final ListMultimap<PiActionProfileId, PiActionGroupMemberId>
+            final ListMultimap<PiActionProfileId, PiActionProfileMemberId>
                     membersByActProfId = ArrayListMultimap.create();
             membersToRemove.forEach(m -> membersByActProfId.put(
                     m.actionProfileId(), m.memberId()));
             membersByActProfId.keySet().forEach(actProfId -> {
-                List<PiActionGroupMemberId> removedMembers = getFutureWithDeadline(
+                List<PiActionProfileMemberId> removedMembers = getFutureWithDeadline(
                         client.removeActionProfileMembers(
                                 actProfId, membersByActProfId.get(actProfId), pipeconf),
                         "cleaning up action profile members", Collections.emptyList());
                 // Update member mirror.
                 removedMembers.stream()
-                        .map(id -> PiActionGroupMemberHandle.of(deviceId, actProfId, id))
+                        .map(id -> PiActionProfileMemberHandle.of(deviceId, actProfId, id))
                         .forEach(memberMirror::remove);
             });
         }
     }
 
-    private Stream<PiActionGroup> streamGroupsFromDevice(PiActionProfileId actProfId) {
+    private Stream<PiActionProfileGroup> streamGroupsFromDevice(PiActionProfileId actProfId) {
         // TODO: implement P4Runtime client call to read all groups with one call
         // Good if pipeline has multiple action profiles.
-        final Collection<PiActionGroup> groups = getFutureWithDeadline(
-                client.dumpGroups(actProfId, pipeconf),
+        final Collection<PiActionProfileGroup> groups = getFutureWithDeadline(
+                client.dumpActionProfileGroups(actProfId, pipeconf),
                 "dumping groups", Collections.emptyList());
         return groups.stream();
     }
 
-    private List<PiActionGroupMemberId> getMembersFromDevice(PiActionProfileId actProfId) {
+    private List<PiActionProfileMemberId> getMembersFromDevice(PiActionProfileId actProfId) {
         // TODO: implement P4Runtime client call to read all members with one call
         // Good if pipeline has multiple action profiles.
         return getFutureWithDeadline(
@@ -261,11 +261,11 @@
                 "dumping action profile ids", Collections.emptyList());
     }
 
-    private Group forgeGroupEntry(PiActionGroup piGroup) {
-        final PiActionGroupHandle handle = PiActionGroupHandle.of(deviceId, piGroup);
-        final Optional<PiTranslatedEntity<Group, PiActionGroup>>
+    private Group forgeGroupEntry(PiActionProfileGroup piGroup) {
+        final PiActionProfileGroupHandle handle = PiActionProfileGroupHandle.of(deviceId, piGroup);
+        final Optional<PiTranslatedEntity<Group, PiActionProfileGroup>>
                 translatedEntity = groupTranslator.lookup(handle);
-        final TimedEntry<PiActionGroup> timedEntry = groupMirror.get(handle);
+        final TimedEntry<PiActionProfileGroup> timedEntry = groupMirror.get(handle);
         // Is entry consistent with our state?
         if (!translatedEntity.isPresent()) {
             log.warn("Group handle not found in translation store: {}", handle);
@@ -292,7 +292,7 @@
     }
 
     private void processGroupOperation(Group pdGroup, GroupOperation.Type opType) {
-        final PiActionGroup piGroup;
+        final PiActionProfileGroup piGroup;
         try {
             piGroup = groupTranslator.translate(pdGroup, pipeconf);
         } catch (PiTranslationException e) {
@@ -305,10 +305,10 @@
         processGroup(piGroup, pdGroup, operation);
     }
 
-    private void processGroup(PiActionGroup groupToApply,
+    private void processGroup(PiActionProfileGroup groupToApply,
                               Group pdGroup,
                               Operation operation) {
-        final PiActionGroupHandle handle = PiActionGroupHandle.of(deviceId, groupToApply);
+        final PiActionProfileGroupHandle handle = PiActionProfileGroupHandle.of(deviceId, groupToApply);
         STRIPED_LOCKS.get(handle).lock();
         try {
             switch (operation) {
@@ -332,7 +332,7 @@
         }
     }
 
-    private boolean applyGroupWithMembersOrNothing(PiActionGroup group, PiActionGroupHandle handle) {
+    private boolean applyGroupWithMembersOrNothing(PiActionProfileGroup group, PiActionProfileGroupHandle handle) {
         // First apply members, then group, if fails, delete members.
         if (!applyAllMembersOrNothing(group.members())) {
             return false;
@@ -344,7 +344,7 @@
         return true;
     }
 
-    private boolean applyGroup(PiActionGroup group, PiActionGroupHandle handle) {
+    private boolean applyGroup(PiActionProfileGroup group, PiActionProfileGroupHandle handle) {
         final int currentMemberSize = group.members().size();
         if (groupMirror.get(handle) != null) {
             String maxMemSize = "";
@@ -352,7 +352,7 @@
                     groupMirror.annotations(handle).value(MAX_MEM_SIZE) != null) {
                 maxMemSize = groupMirror.annotations(handle).value(MAX_MEM_SIZE);
             }
-            if (!maxMemSize.equals("") || currentMemberSize > Integer.parseInt(maxMemSize)) {
+            if (maxMemSize.equals("") || currentMemberSize > Integer.parseInt(maxMemSize)) {
                 deleteGroup(group, handle);
             }
         }
@@ -362,7 +362,7 @@
         int currentMaxMemberSize = opType == INSERT ? (currentMemberSize + GROUP_MEMBERS_BUFFER_SIZE) : 0;
 
         final boolean success = getFutureWithDeadline(
-                client.writeActionGroup(group, opType, pipeconf, currentMaxMemberSize),
+                client.writeActionProfileGroup(group, opType, pipeconf, currentMaxMemberSize),
                 "performing action profile group " + opType, false);
         if (success) {
             groupMirror.put(handle, group);
@@ -376,9 +376,9 @@
         return success;
     }
 
-    private boolean deleteGroup(PiActionGroup group, PiActionGroupHandle handle) {
+    private boolean deleteGroup(PiActionProfileGroup group, PiActionProfileGroupHandle handle) {
         final boolean success = getFutureWithDeadline(
-                client.writeActionGroup(group, DELETE, pipeconf, 0),
+                client.writeActionProfileGroup(group, DELETE, pipeconf, 0),
                 "performing action profile group " + DELETE, false);
         if (success) {
             groupMirror.remove(handle);
@@ -386,8 +386,8 @@
         return success;
     }
 
-    private boolean applyAllMembersOrNothing(Collection<PiActionGroupMember> members) {
-        Collection<PiActionGroupMember> appliedMembers = applyMembers(members);
+    private boolean applyAllMembersOrNothing(Collection<PiActionProfileMember> members) {
+        Collection<PiActionProfileMember> appliedMembers = applyMembers(members);
         if (appliedMembers.size() == members.size()) {
             return true;
         } else {
@@ -396,22 +396,22 @@
         }
     }
 
-    private Collection<PiActionGroupMember> applyMembers(
-            Collection<PiActionGroupMember> members) {
+    private Collection<PiActionProfileMember> applyMembers(
+            Collection<PiActionProfileMember> members) {
         return members.stream()
                 .filter(this::applyMember)
                 .collect(Collectors.toList());
     }
 
-    private boolean applyMember(PiActionGroupMember member) {
+    private boolean applyMember(PiActionProfileMember member) {
         // If exists, modify, otherwise insert
-        final PiActionGroupMemberHandle handle = PiActionGroupMemberHandle.of(
+        final PiActionProfileMemberHandle handle = PiActionProfileMemberHandle.of(
                 deviceId, member);
         final P4RuntimeClient.WriteOperationType opType =
                 memberMirror.get(handle) == null ? INSERT : MODIFY;
         final boolean success = getFutureWithDeadline(
-                client.writeActionGroupMembers(Collections.singletonList(member),
-                                               opType, pipeconf),
+                client.writeActionProfileMembers(Collections.singletonList(member),
+                                                 opType, pipeconf),
                 "performing action profile member " + opType, false);
         if (success) {
             memberMirror.put(handle, dummyMember(member.actionProfile(), member.id()));
@@ -419,16 +419,16 @@
         return success;
     }
 
-    private void deleteMembers(Collection<PiActionGroupMember> members) {
+    private void deleteMembers(Collection<PiActionProfileMember> members) {
         members.forEach(this::deleteMember);
     }
 
-    private void deleteMember(PiActionGroupMember member) {
-        final PiActionGroupMemberHandle handle = PiActionGroupMemberHandle.of(
+    private void deleteMember(PiActionProfileMember member) {
+        final PiActionProfileMemberHandle handle = PiActionProfileMemberHandle.of(
                 deviceId, member);
         final boolean success = getFutureWithDeadline(
-                client.writeActionGroupMembers(Collections.singletonList(member),
-                                               DELETE, pipeconf),
+                client.writeActionProfileMembers(Collections.singletonList(member),
+                                                 DELETE, pipeconf),
                 "performing action profile member " + DELETE, false);
         if (success) {
             memberMirror.remove(handle);
@@ -436,15 +436,13 @@
     }
 
     // FIXME: this is nasty, we have to rely on a dummy member of the mirror
-    // because the PiActionGroupMember abstraction is broken, since it includes
+    // because the PiActionProfileMember abstraction is broken, since it includes
     // attributes that are not part of a P4Runtime member, e.g. weight.
     // We should remove weight from the class, and have client methods that
-    // return the full PiActionGroupMember, not just the IDs. Also the naming
-    // "ActionGroupMember" is wrong since it makes believe that members can
-    // exists only inside a group, which is not true.
-    private PiActionGroupMember dummyMember(
-            PiActionProfileId actionProfileId, PiActionGroupMemberId memberId) {
-        return PiActionGroupMember.builder()
+    // return the full PiActionProfileMember, not just the IDs.
+    private PiActionProfileMember dummyMember(
+            PiActionProfileId actionProfileId, PiActionProfileMemberId memberId) {
+        return PiActionProfileMember.builder()
                 .forActionProfile(actionProfileId)
                 .withId(memberId)
                 .withAction(PiAction.builder()
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeGroupMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileGroupMirror.java
similarity index 71%
rename from drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeGroupMirror.java
rename to drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileGroupMirror.java
index e07f417..ef2d6bd 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeGroupMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileGroupMirror.java
@@ -17,21 +17,21 @@
 package org.onosproject.drivers.p4runtime.mirror;
 
 import org.onlab.util.KryoNamespace;
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupHandle;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.osgi.service.component.annotations.Component;
 
 /**
- * Distributed implementation of a P4Runtime group mirror.
+ * Distributed implementation of a P4Runtime action profile group mirror.
  */
-@Component(immediate = true, service = P4RuntimeGroupMirror.class)
-public final class DistributedP4RuntimeGroupMirror
+@Component(immediate = true, service = P4RuntimeActionProfileGroupMirror.class)
+public final class DistributedP4RuntimeActionProfileGroupMirror
         extends AbstractDistributedP4RuntimeMirror
-                        <PiActionGroupHandle, PiActionGroup>
-        implements P4RuntimeGroupMirror {
+        <PiActionProfileGroupHandle, PiActionProfileGroup>
+        implements P4RuntimeActionProfileGroupMirror {
 
-    private static final String DIST_MAP_NAME = "onos-p4runtime-group-mirror";
+    private static final String DIST_MAP_NAME = "onos-p4runtime-act-prof-group-mirror";
 
     @Override
     String mapName() {
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileMemberMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileMemberMirror.java
index 5974ae2..5b2ff21 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileMemberMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileMemberMirror.java
@@ -17,8 +17,8 @@
 package org.onosproject.drivers.p4runtime.mirror;
 
 import org.onlab.util.KryoNamespace;
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberHandle;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.osgi.service.component.annotations.Component;
 
@@ -28,7 +28,7 @@
 @Component(immediate = true, service = P4RuntimeActionProfileMemberMirror.class)
 public class DistributedP4RuntimeActionProfileMemberMirror
         extends AbstractDistributedP4RuntimeMirror
-        <PiActionGroupMemberHandle, PiActionGroupMember>
+        <PiActionProfileMemberHandle, PiActionProfileMember>
         implements P4RuntimeActionProfileMemberMirror {
 
     private static final String DIST_MAP_NAME = "onos-p4runtime-act-prof-member-mirror";
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeGroupMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeActionProfileGroupMirror.java
similarity index 67%
rename from drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeGroupMirror.java
rename to drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeActionProfileGroupMirror.java
index f363e71..d5ce7ff 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeGroupMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeActionProfileGroupMirror.java
@@ -16,12 +16,12 @@
 
 package org.onosproject.drivers.p4runtime.mirror;
 
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupHandle;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
 
 /**
- * Mirror of action groups installed on a P4Runtime device.
+ * Mirror of action profile groups installed on a P4Runtime device.
  */
-public interface P4RuntimeGroupMirror
-        extends P4RuntimeMirror<PiActionGroupHandle, PiActionGroup> {
+public interface P4RuntimeActionProfileGroupMirror
+        extends P4RuntimeMirror<PiActionProfileGroupHandle, PiActionProfileGroup> {
 }
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeActionProfileMemberMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeActionProfileMemberMirror.java
index 8ab1fa0..045f283 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeActionProfileMemberMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/P4RuntimeActionProfileMemberMirror.java
@@ -16,12 +16,12 @@
 
 package org.onosproject.drivers.p4runtime.mirror;
 
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberHandle;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
 
 /**
  * Mirror of action profile members installed on a P4Runtime device.
  */
 public interface P4RuntimeActionProfileMemberMirror
-        extends P4RuntimeMirror<PiActionGroupMemberHandle, PiActionGroupMember> {
+        extends P4RuntimeMirror<PiActionProfileMemberHandle, PiActionProfileMember> {
 }
