ONOS-7887 Rename action profile-related entities

Members can exist outside of a group. Previous naming was ambiguous
about this.

Action group -> action profile group
Action group member -> action profile member

Change-Id: I5097e92253353d355b864e689f9653df2d318230
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/PiInstruction.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/PiInstruction.java
index 180a521..87542bd 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/PiInstruction.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/PiInstruction.java
@@ -19,8 +19,8 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Objects;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.runtime.PiTableAction;
 
 /**
@@ -74,10 +74,10 @@
     @Override
     public String toString() {
         switch (tableAction.type()) {
-            case ACTION_GROUP_ID:
-                return "GROUP:0x" + Integer.toHexString(((PiActionGroupId) tableAction).id());
-            case GROUP_MEMBER_ID:
-                return "GROUP_MEMBER:0x" + Integer.toHexString(((PiActionGroupMemberId) tableAction).id());
+            case ACTION_PROFILE_GROUP_ID:
+                return "GROUP:0x" + Integer.toHexString(((PiActionProfileGroupId) tableAction).id());
+            case ACTION_PROFILE_MEMBER_ID:
+                return "GROUP_MEMBER:0x" + Integer.toHexString(((PiActionProfileMemberId) tableAction).id());
             default:
                 return tableAction.toString();
         }
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroup.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroup.java
deleted file mode 100644
index a22e039..0000000
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroup.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2017-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.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import org.onosproject.net.pi.model.PiActionProfileId;
-
-import java.util.Collection;
-import java.util.Map;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Instance of an action group of a protocol-independent pipeline.
- */
-@Beta
-public final class PiActionGroup implements PiEntity {
-
-    private final PiActionGroupId id;
-    private final ImmutableSet<PiActionGroupMember> members;
-    private final PiActionProfileId piActionProfileId;
-
-    private PiActionGroup(PiActionGroupId id, ImmutableSet<PiActionGroupMember> members,
-                          PiActionProfileId piActionProfileId) {
-        this.id = id;
-        this.members = members;
-        this.piActionProfileId = piActionProfileId;
-    }
-
-    /**
-     * Returns the identifier of this action group.
-     *
-     * @return action group identifier
-     */
-    public PiActionGroupId id() {
-        return id;
-    }
-
-    /**
-     * Returns the members of this action group.
-     *
-     * @return collection of action members.
-     */
-    public Collection<PiActionGroupMember> members() {
-        return members;
-    }
-
-    /**
-     * Gets identifier of the action profile.
-     *
-     * @return action profile id
-     */
-    public PiActionProfileId actionProfileId() {
-        return piActionProfileId;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || !(o instanceof PiActionGroup)) {
-            return false;
-        }
-        PiActionGroup that = (PiActionGroup) o;
-        return Objects.equal(id, that.id) &&
-                Objects.equal(members, that.members) &&
-                Objects.equal(piActionProfileId, that.piActionProfileId);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(id, members);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("groupId", id)
-                .add("members", members)
-                .add("piActionProfileId", piActionProfileId)
-                .toString();
-    }
-
-    /**
-     * Returns a new builder of action groups.
-     *
-     * @return action group builder
-     */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    @Override
-    public PiEntityType piEntityType() {
-        return PiEntityType.GROUP;
-    }
-
-    /**
-     * Builder of action groups.
-     */
-    public static final class Builder {
-
-        private PiActionGroupId id;
-        private Map<PiActionGroupMemberId, PiActionGroupMember> members = Maps.newHashMap();
-        private PiActionProfileId piActionProfileId;
-
-        private Builder() {
-            // hides constructor.
-        }
-
-        /**
-         * Sets the identifier of this action group.
-         *
-         * @param id action group identifier
-         * @return this
-         */
-        public Builder withId(PiActionGroupId id) {
-            this.id = id;
-            return this;
-        }
-
-        /**
-         * Adds one member to this action group.
-         *
-         * @param member action group member
-         * @return this
-         */
-        public Builder addMember(PiActionGroupMember member) {
-            members.put(member.id(), member);
-            return this;
-        }
-
-        /**
-         * Adds many members to this action group.
-         *
-         * @param members action group members
-         * @return this
-         */
-        public Builder addMembers(Collection<PiActionGroupMember> members) {
-            members.forEach(this::addMember);
-            return this;
-        }
-
-        /**
-         * Sets the identifier of the action profile.
-         *
-         * @param piActionProfileId the identifier of the action profile
-         * @return this
-         */
-        public Builder withActionProfileId(PiActionProfileId piActionProfileId) {
-            this.piActionProfileId = piActionProfileId;
-            return this;
-        }
-
-        /**
-         * Creates a new action group.
-         *
-         * @return action group
-         */
-        public PiActionGroup build() {
-            checkNotNull(id);
-            checkNotNull(piActionProfileId);
-            return new PiActionGroup(id, ImmutableSet.copyOf(members.values()),
-                                     piActionProfileId);
-        }
-    }
-}
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupId.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupId.java
deleted file mode 100644
index b604237..0000000
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupId.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2017-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.runtime;
-
-import com.google.common.annotations.Beta;
-import org.onlab.util.Identifier;
-
-/**
- * Identifier of an action group in a protocol-independent pipeline, unique within the scope of an action profile.
- */
-@Beta
-public final class PiActionGroupId extends Identifier<Integer> implements PiTableAction {
-
-    private PiActionGroupId(int id) {
-        super(id);
-    }
-
-    /**
-     * Returns an action group identifier for the given integer value.
-     *
-     * @param id identifier
-     * @return action group
-     */
-    public static PiActionGroupId of(int id) {
-        return new PiActionGroupId(id);
-    }
-
-    /*
-    In P4Runtime, groups can be referenced directly as table actions (i.e. without invoking the selector).
-    In future we should consider having a more appropriate wrapper class for group IDs, instead of implementing
-    the PiTableAction interface.
-     */
-    @Override
-    public Type type() {
-        return Type.ACTION_GROUP_ID;
-    }
-}
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberId.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberId.java
deleted file mode 100644
index 3b233a0..0000000
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberId.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2017-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.runtime;
-
-import com.google.common.annotations.Beta;
-import org.onlab.util.Identifier;
-
-/**
- * Identifier of a member of an action group in a protocol-independent pipeline, unique withing the scope on an action
- * profile.
- */
-@Beta
-public final class PiActionGroupMemberId extends Identifier<Integer> implements PiTableAction {
-
-    private PiActionGroupMemberId(int id) {
-        super(id);
-    }
-
-    /**
-     * Returns an action group identifier for the given integer value.
-     *
-     * @param id identifier
-     * @return action group
-     */
-    public static PiActionGroupMemberId of(int id) {
-        return new PiActionGroupMemberId(id);
-    }
-
-    /*
-    In P4Runtime, group members can be referenced directly as table actions.
-    In future we should consider having a more appropriate wrapper class for group member IDs, instead of implementing
-    the PiTableAction interface.
-     */
-    @Override
-    public Type type() {
-        return Type.GROUP_MEMBER_ID;
-    }
-}
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroup.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroup.java
new file mode 100644
index 0000000..96168b9
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroup.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2017-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.runtime;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import org.onosproject.net.pi.model.PiActionProfileId;
+
+import java.util.Collection;
+import java.util.Map;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Instance of an action profile group of a protocol-independent pipeline.
+ */
+@Beta
+public final class PiActionProfileGroup implements PiEntity {
+
+    private final PiActionProfileGroupId id;
+    private final ImmutableSet<PiActionProfileMember> members;
+    private final PiActionProfileId actionProfileId;
+
+    private PiActionProfileGroup(PiActionProfileGroupId id,
+                                 ImmutableSet<PiActionProfileMember> members,
+                                 PiActionProfileId actionProfileId) {
+        this.id = id;
+        this.members = members;
+        this.actionProfileId = actionProfileId;
+    }
+
+    /**
+     * Returns the identifier of this action profile group.
+     *
+     * @return action profile group identifier
+     */
+    public PiActionProfileGroupId id() {
+        return id;
+    }
+
+    /**
+     * Returns the members of this action profile group.
+     *
+     * @return collection of action profile members.
+     */
+    public Collection<PiActionProfileMember> members() {
+        return members;
+    }
+
+    /**
+     * Gets identifier of the action profile.
+     *
+     * @return action profile id
+     */
+    public PiActionProfileId actionProfileId() {
+        return actionProfileId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || !(o instanceof PiActionProfileGroup)) {
+            return false;
+        }
+        PiActionProfileGroup that = (PiActionProfileGroup) o;
+        return Objects.equal(id, that.id) &&
+                Objects.equal(members, that.members) &&
+                Objects.equal(actionProfileId, that.actionProfileId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(id, members);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("groupId", id)
+                .add("members", members)
+                .add("piActionProfileId", actionProfileId)
+                .toString();
+    }
+
+    /**
+     * Returns a new builder of action profile groups.
+     *
+     * @return action profile group builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    @Override
+    public PiEntityType piEntityType() {
+        return PiEntityType.ACTION_PROFILE_GROUP;
+    }
+
+    /**
+     * Builder of action profile groups.
+     */
+    public static final class Builder {
+
+        private PiActionProfileGroupId id;
+        private Map<PiActionProfileMemberId, PiActionProfileMember> members = Maps.newHashMap();
+        private PiActionProfileId piActionProfileId;
+
+        private Builder() {
+            // hides constructor.
+        }
+
+        /**
+         * Sets the identifier of this action profile group.
+         *
+         * @param id action profile group identifier
+         * @return this
+         */
+        public Builder withId(PiActionProfileGroupId id) {
+            this.id = id;
+            return this;
+        }
+
+        /**
+         * Adds one member to this action profile group.
+         *
+         * @param member action profile member
+         * @return this
+         */
+        public Builder addMember(PiActionProfileMember member) {
+            members.put(member.id(), member);
+            return this;
+        }
+
+        /**
+         * Adds many members to this action profile group.
+         *
+         * @param members action profile members
+         * @return this
+         */
+        public Builder addMembers(Collection<PiActionProfileMember> members) {
+            members.forEach(this::addMember);
+            return this;
+        }
+
+        /**
+         * Sets the identifier of the action profile.
+         *
+         * @param piActionProfileId the identifier of the action profile
+         * @return this
+         */
+        public Builder withActionProfileId(PiActionProfileId piActionProfileId) {
+            this.piActionProfileId = piActionProfileId;
+            return this;
+        }
+
+        /**
+         * Creates a new action profile group.
+         *
+         * @return action profile group
+         */
+        public PiActionProfileGroup build() {
+            checkNotNull(id);
+            checkNotNull(piActionProfileId);
+            return new PiActionProfileGroup(
+                    id, ImmutableSet.copyOf(members.values()), piActionProfileId);
+        }
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupHandle.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupHandle.java
similarity index 72%
rename from core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupHandle.java
rename to core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupHandle.java
index 6969714..42ed272 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupHandle.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupHandle.java
@@ -23,36 +23,36 @@
 import org.onosproject.net.pi.model.PiActionProfileId;
 
 /**
- * Global identifier of a PI action group applied to a device, uniquely defined
- * by a device ID, action profile ID and group ID.
+ * Global identifier of a PI action profile group applied to a device, uniquely
+ * defined by a device ID, action profile ID and group ID.
  */
 @Beta
-public final class PiActionGroupHandle extends PiHandle<PiActionGroup> {
+public final class PiActionProfileGroupHandle extends PiHandle<PiActionProfileGroup> {
 
     private final PiActionProfileId actionProfileId;
-    private final PiActionGroupId groupId;
+    private final PiActionProfileGroupId groupId;
 
-    private PiActionGroupHandle(DeviceId deviceId, PiActionGroup group) {
+    private PiActionProfileGroupHandle(DeviceId deviceId, PiActionProfileGroup group) {
         super(deviceId);
         actionProfileId = group.actionProfileId();
         groupId = group.id();
     }
 
     /**
-     * Creates a new handle for the given device ID and PI action group.
+     * Creates a new handle for the given device ID and PI action profile group.
      *
      * @param deviceId device ID
-     * @param group PI action group
-     * @return PI action group handle
+     * @param group PI action profile group
+     * @return PI action profile group handle
      */
-    public static PiActionGroupHandle of(DeviceId deviceId,
-                                         PiActionGroup group) {
-        return new PiActionGroupHandle(deviceId, group);
+    public static PiActionProfileGroupHandle of(DeviceId deviceId,
+                                                PiActionProfileGroup group) {
+        return new PiActionProfileGroupHandle(deviceId, group);
     }
 
     @Override
     public PiEntityType entityType() {
-        return PiEntityType.GROUP;
+        return PiEntityType.ACTION_PROFILE_GROUP;
     }
 
     @Override
@@ -70,7 +70,7 @@
         if (o == null || getClass() != o.getClass()) {
             return false;
         }
-        PiActionGroupHandle that = (PiActionGroupHandle) o;
+        PiActionProfileGroupHandle that = (PiActionProfileGroupHandle) o;
         return Objects.equal(deviceId(), that.deviceId()) &&
                 Objects.equal(actionProfileId,
                               that.actionProfileId) &&
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupId.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupId.java
new file mode 100644
index 0000000..206525a
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupId.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2017-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.runtime;
+
+import com.google.common.annotations.Beta;
+import org.onlab.util.Identifier;
+
+/**
+ * Identifier of an action profile group in a protocol-independent pipeline,
+ * unique within the scope of an action profile.
+ */
+@Beta
+public final class PiActionProfileGroupId extends Identifier<Integer> implements PiTableAction {
+
+    private PiActionProfileGroupId(int id) {
+        super(id);
+    }
+
+    /**
+     * Returns an action profile group identifier for the given integer value.
+     *
+     * @param id identifier
+     * @return action profile group
+     */
+    public static PiActionProfileGroupId of(int id) {
+        return new PiActionProfileGroupId(id);
+    }
+
+    /*
+    In P4Runtime, groups can be referenced directly as table actions (i.e.
+    without invoking the selector). In future we should consider having a more
+    appropriate wrapper class for group IDs, instead of implementing the
+    PiTableAction interface.
+     */
+    @Override
+    public Type type() {
+        return Type.ACTION_PROFILE_GROUP_ID;
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMember.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMember.java
similarity index 76%
rename from core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMember.java
rename to core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMember.java
index 690d118..92c3562 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMember.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMember.java
@@ -24,24 +24,25 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
- * Instance of a member of an action group in a protocol-independent pipeline.
+ * Instance of a member of an action profile in a protocol-independent pipeline.
  */
 @Beta
-public final class PiActionGroupMember implements PiEntity {
+public final class PiActionProfileMember implements PiEntity {
 
     private final PiActionProfileId actionProfileId;
-    private final PiActionGroupMemberId id;
+    private final PiActionProfileMemberId memberId;
     private final PiAction action;
     // FIXME: in P4Runtime weight is an attribute of the member reference in a
     // group. Either remove it from this class or define the containing group
     // ID.
     private final int weight;
 
-    private PiActionGroupMember(
-            PiActionProfileId actionProfileId, PiActionGroupMemberId id,
-            PiAction action, int weight) {
+    private PiActionProfileMember(PiActionProfileId actionProfileId,
+                                  PiActionProfileMemberId memberId,
+                                  PiAction action,
+                                  int weight) {
         this.actionProfileId = actionProfileId;
-        this.id = id;
+        this.memberId = memberId;
         this.action = action;
         this.weight = weight;
     }
@@ -51,8 +52,8 @@
      *
      * @return member identifier
      */
-    public PiActionGroupMemberId id() {
-        return id;
+    public PiActionProfileMemberId id() {
+        return memberId;
     }
 
     /**
@@ -84,7 +85,7 @@
 
     @Override
     public PiEntityType piEntityType() {
-        return PiEntityType.GROUP_MEMBER;
+        return PiEntityType.ACTION_PROFILE_MEMBER;
     }
 
     @Override
@@ -92,33 +93,33 @@
         if (this == o) {
             return true;
         }
-        if (!(o instanceof PiActionGroupMember)) {
+        if (!(o instanceof PiActionProfileMember)) {
             return false;
         }
-        PiActionGroupMember that = (PiActionGroupMember) o;
+        PiActionProfileMember that = (PiActionProfileMember) o;
         return weight == that.weight &&
                 Objects.equal(actionProfileId, that.actionProfileId) &&
-                Objects.equal(id, that.id) &&
+                Objects.equal(memberId, that.memberId) &&
                 Objects.equal(action, that.action);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(actionProfileId, id, action, weight);
+        return Objects.hashCode(actionProfileId, memberId, action, weight);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("actionProfile", actionProfileId)
-                .add("id", id)
+                .add("id", memberId)
                 .add("action", action)
                 .add("weight", weight)
                 .toString();
     }
 
     /**
-     * Returns a new builder of action group members.
+     * Returns a new builder of action profile members.
      *
      * @return member builder
      */
@@ -127,12 +128,12 @@
     }
 
     /**
-     * Builder of action group members.
+     * Builder of action profile members.
      */
     public static final class Builder {
 
         private PiActionProfileId actionProfileId;
-        private PiActionGroupMemberId id;
+        private PiActionProfileMemberId id;
         private PiAction action;
         private int weight;
 
@@ -157,7 +158,7 @@
          * @param id member identifier
          * @return this
          */
-        public Builder withId(PiActionGroupMemberId id) {
+        public Builder withId(PiActionProfileMemberId id) {
             this.id = id;
             return this;
         }
@@ -187,15 +188,15 @@
         }
 
         /**
-         * Creates a new action group member.
+         * Creates a new action profile member.
          *
-         * @return action group member
+         * @return action profile member
          */
-        public PiActionGroupMember build() {
+        public PiActionProfileMember build() {
             checkNotNull(actionProfileId);
             checkNotNull(id);
             checkNotNull(action);
-            return new PiActionGroupMember(actionProfileId, id, action, weight);
+            return new PiActionProfileMember(actionProfileId, id, action, weight);
         }
     }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberHandle.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMemberHandle.java
similarity index 81%
rename from core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberHandle.java
rename to core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMemberHandle.java
index 9ef8a31..8771650 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionGroupMemberHandle.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMemberHandle.java
@@ -27,14 +27,14 @@
  * Global identifier of a PI action profile group member, uniquely defined by a
  * device ID, action profile ID, and member ID.
  */
-public final class PiActionGroupMemberHandle extends PiHandle<PiActionGroupMember> {
+public final class PiActionProfileMemberHandle extends PiHandle<PiActionProfileMember> {
 
-    private final PiActionGroupMemberId memberId;
+    private final PiActionProfileMemberId memberId;
     private final PiActionProfileId actionProfileId;
 
-    private PiActionGroupMemberHandle(DeviceId deviceId,
+    private PiActionProfileMemberHandle(DeviceId deviceId,
                                       PiActionProfileId actionProfileId,
-                                      PiActionGroupMemberId memberId) {
+                                      PiActionProfileMemberId memberId) {
         super(deviceId);
         this.actionProfileId = actionProfileId;
         this.memberId = memberId;
@@ -49,11 +49,11 @@
      * @param memberId        member ID
      * @return action profile group member handle
      */
-    public static PiActionGroupMemberHandle of(
+    public static PiActionProfileMemberHandle of(
             DeviceId deviceId,
             PiActionProfileId actionProfileId,
-            PiActionGroupMemberId memberId) {
-        return new PiActionGroupMemberHandle(
+            PiActionProfileMemberId memberId) {
+        return new PiActionProfileMemberHandle(
                 deviceId, actionProfileId, memberId);
     }
 
@@ -65,11 +65,11 @@
      * @param member   member instance
      * @return action profile group member handle
      */
-    public static PiActionGroupMemberHandle of(
+    public static PiActionProfileMemberHandle of(
             DeviceId deviceId,
-            PiActionGroupMember member) {
+            PiActionProfileMember member) {
         checkNotNull(member);
-        return new PiActionGroupMemberHandle(
+        return new PiActionProfileMemberHandle(
                 deviceId, member.actionProfile(), member.id());
     }
 
@@ -78,7 +78,7 @@
      *
      * @return member ID
      */
-    public PiActionGroupMemberId memberId() {
+    public PiActionProfileMemberId memberId() {
         return memberId;
     }
 
@@ -93,7 +93,7 @@
 
     @Override
     public PiEntityType entityType() {
-        return PiEntityType.GROUP_MEMBER;
+        return PiEntityType.ACTION_PROFILE_MEMBER;
     }
 
     @Override
@@ -109,7 +109,7 @@
         if (obj == null || getClass() != obj.getClass()) {
             return false;
         }
-        final PiActionGroupMemberHandle other = (PiActionGroupMemberHandle) obj;
+        final PiActionProfileMemberHandle other = (PiActionProfileMemberHandle) obj;
         return Objects.equal(this.deviceId(), other.deviceId())
                 && Objects.equal(this.actionProfileId, other.actionProfileId)
                 && Objects.equal(this.memberId, other.memberId);
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMemberId.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMemberId.java
new file mode 100644
index 0000000..a813f6e
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileMemberId.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2017-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.runtime;
+
+import com.google.common.annotations.Beta;
+import org.onlab.util.Identifier;
+
+/**
+ * Identifier of a member of an action profile in a protocol-independent
+ * pipeline, unique within the scope on an action profile.
+ */
+@Beta
+public final class PiActionProfileMemberId extends Identifier<Integer>
+        implements PiTableAction {
+
+    private PiActionProfileMemberId(int id) {
+        super(id);
+    }
+
+    /**
+     * Returns a member identifier for the given integer value.
+     *
+     * @param id identifier
+     * @return action profile group
+     */
+    public static PiActionProfileMemberId of(int id) {
+        return new PiActionProfileMemberId(id);
+    }
+
+    /*
+    In P4Runtime, action profile members can be referenced directly as table
+    actions. In future we should consider having a more appropriate wrapper
+    class for group member IDs, instead of implementing the PiTableAction
+    interface.
+     */
+    @Override
+    public Type type() {
+        return Type.ACTION_PROFILE_MEMBER_ID;
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiEntityType.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiEntityType.java
index 0569f99..4c31830 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiEntityType.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiEntityType.java
@@ -31,12 +31,12 @@
     /**
      * Action profile group.
      */
-    GROUP,
+    ACTION_PROFILE_GROUP,
 
     /**
-     * Action profile group member.
+     * Action profile member.
      */
-    GROUP_MEMBER,
+    ACTION_PROFILE_MEMBER,
 
     /**
      * Meter config.
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableAction.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableAction.java
index 7d25e1a..284dde6 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableAction.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableAction.java
@@ -19,8 +19,8 @@
 import com.google.common.annotations.Beta;
 
 /**
- * Instance of an action that can be executed as a consequence of a match in a match+action table of a
- * protocol-independent pipeline.
+ * Instance of an action that can be executed as a consequence of a match in a
+ * match+action table of a protocol-independent pipeline.
  */
 @Beta
 public interface PiTableAction {
@@ -35,14 +35,15 @@
         ACTION,
 
         /**
-         * Executes the action group specified by the given identifier.
+         * Executes the action profile group specified by the given identifier.
          */
-        ACTION_GROUP_ID,
+        ACTION_PROFILE_GROUP_ID,
 
         /**
-         * Executes the action member group specified by the given identifier.
+         * Executes the action profile member specified by the given
+         * identifier.
          */
-        GROUP_MEMBER_ID
+        ACTION_PROFILE_MEMBER_ID
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableEntry.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableEntry.java
index ac73bbe..b25ada5 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableEntry.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiTableEntry.java
@@ -179,10 +179,10 @@
             return "null";
         }
         switch (tableAction.type()) {
-            case ACTION_GROUP_ID:
-                return "GROUP:" + ((PiActionGroupId) tableAction).id();
-            case GROUP_MEMBER_ID:
-                return "GROUP_MEMBER:" + ((PiActionGroupMemberId) tableAction).id();
+            case ACTION_PROFILE_GROUP_ID:
+                return "ACT_PROF_GROUP:" + ((PiActionProfileGroupId) tableAction).id();
+            case ACTION_PROFILE_MEMBER_ID:
+                return "ACT_PROF_MEMBER:" + ((PiActionProfileMemberId) tableAction).id();
             case ACTION:
             default:
                 return tableAction.toString();
diff --git a/core/api/src/main/java/org/onosproject/net/pi/service/PiGroupTranslationStore.java b/core/api/src/main/java/org/onosproject/net/pi/service/PiGroupTranslationStore.java
index 4fe526a..ed76c9e 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/service/PiGroupTranslationStore.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/service/PiGroupTranslationStore.java
@@ -18,13 +18,13 @@
 
 import com.google.common.annotations.Beta;
 import org.onosproject.net.group.Group;
-import org.onosproject.net.pi.runtime.PiActionGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
 
 /**
  * A PI translation store that keeps track of which groups have been
- * translated to which PI action groups.
+ * translated to which PI action profile groups.
  */
 @Beta
 public interface PiGroupTranslationStore
-        extends PiTranslationStore<Group, PiActionGroup> {
+        extends PiTranslationStore<Group, PiActionProfileGroup> {
 }
diff --git a/core/api/src/main/java/org/onosproject/net/pi/service/PiGroupTranslator.java b/core/api/src/main/java/org/onosproject/net/pi/service/PiGroupTranslator.java
index d5eb5af..5d7b6b3 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/service/PiGroupTranslator.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/service/PiGroupTranslator.java
@@ -18,12 +18,12 @@
 
 import com.google.common.annotations.Beta;
 import org.onosproject.net.group.Group;
-import org.onosproject.net.pi.runtime.PiActionGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
 
 /**
- * A translator of groups to PI action groups.
+ * A translator of groups to PI action profile groups.
  */
 @Beta
 public interface PiGroupTranslator
-        extends PiTranslator<Group, PiActionGroup> {
+        extends PiTranslator<Group, PiActionProfileGroup> {
 }
diff --git a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupMemberIdTest.java b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupMemberIdTest.java
deleted file mode 100644
index 008a74e..0000000
--- a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupMemberIdTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2017-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.runtime;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
-
-/**
- * Unit tests for PiActionGroupMemberId class.
- */
-public class PiActionGroupMemberIdTest {
-
-    final PiActionGroupMemberId piActionGroupMemberId1 = PiActionGroupMemberId.of(10);
-    final PiActionGroupMemberId sameAsPiActionGroupMemberId1 = PiActionGroupMemberId.of(10);
-    final PiActionGroupMemberId piActionGroupMemberId2 = PiActionGroupMemberId.of(20);
-
-    /**
-     * Checks that the PiActionGroupMemberId class is immutable.
-     */
-    @Test
-    public void testImmutability() {
-
-        assertThatClassIsImmutable(PiActionGroupMemberId.class);
-    }
-
-    /**
-     * Checks the operation of equals(), hashCode() and toString() methods.
-     */
-    @Test
-    public void testEquals() {
-
-        new EqualsTester()
-                .addEqualityGroup(piActionGroupMemberId1, sameAsPiActionGroupMemberId1)
-                .addEqualityGroup(piActionGroupMemberId2)
-                .testEquals();
-    }
-
-    /**
-     * Checks the methods of PiActionGroupMemberId.
-     */
-    @Test
-    public void testMethods() {
-
-        assertThat(piActionGroupMemberId1, is(notNullValue()));
-        assertThat(piActionGroupMemberId1.type(), is(PiTableAction.Type.GROUP_MEMBER_ID));
-        assertThat(piActionGroupMemberId1.id(), is(10));
-    }
-}
diff --git a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupIdTest.java b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileGroupIdTest.java
similarity index 73%
rename from core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupIdTest.java
rename to core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileGroupIdTest.java
index 4c18f18..cffb9e9 100644
--- a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupIdTest.java
+++ b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileGroupIdTest.java
@@ -19,28 +19,27 @@
 import com.google.common.testing.EqualsTester;
 import org.junit.Test;
 
-
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
- * Unit tests for PiActionGroupId class.
+ * Unit tests for PiActionProfileGroupId class.
  */
-public class PiActionGroupIdTest {
+public class PiActionProfileGroupIdTest {
 
-    final PiActionGroupId piActionGroupId1 = PiActionGroupId.of(10);
-    final PiActionGroupId sameAsPiActionGroupId1 = PiActionGroupId.of(10);
-    final PiActionGroupId piActionGroupId2 = PiActionGroupId.of(20);
+    final PiActionProfileGroupId piActionGroupId1 = PiActionProfileGroupId.of(10);
+    final PiActionProfileGroupId sameAsPiActionProfileGroupId1 = PiActionProfileGroupId.of(10);
+    final PiActionProfileGroupId piActionGroupId2 = PiActionProfileGroupId.of(20);
 
     /**
-     * Checks that the PiActionGroupId class is immutable.
+     * Checks that the PiActionProfileGroupId class is immutable.
      */
     @Test
     public void testImmutability() {
 
-        assertThatClassIsImmutable(PiActionGroupId.class);
+        assertThatClassIsImmutable(PiActionProfileGroupId.class);
     }
 
     /**
@@ -50,19 +49,19 @@
     public void testEquals() {
 
         new EqualsTester()
-                .addEqualityGroup(piActionGroupId1, sameAsPiActionGroupId1)
+                .addEqualityGroup(piActionGroupId1, sameAsPiActionProfileGroupId1)
                 .addEqualityGroup(piActionGroupId2)
                 .testEquals();
     }
 
     /**
-     * Checks the methods of PiActionGroupId.
+     * Checks the methods of PiActionProfileGroupId.
      */
     @Test
     public void testMethods() {
 
         assertThat(piActionGroupId1, is(notNullValue()));
-        assertThat(piActionGroupId1.type(), is(PiTableAction.Type.ACTION_GROUP_ID));
+        assertThat(piActionGroupId1.type(), is(PiTableAction.Type.ACTION_PROFILE_GROUP_ID));
         assertThat(piActionGroupId1.id(), is(10));
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupTest.java b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileGroupTest.java
similarity index 68%
rename from core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupTest.java
rename to core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileGroupTest.java
index c3aca5a..0fecc72 100644
--- a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupTest.java
+++ b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileGroupTest.java
@@ -35,48 +35,48 @@
 import static org.onosproject.net.pi.runtime.PiConstantsTest.MOD_NW_DST;
 
 /**
- * Unit tests for PiActionGroup class.
+ * Unit tests for PiActionProfileGroup class.
  */
-public class PiActionGroupTest {
+public class PiActionProfileGroupTest {
 
-    private final PiActionGroupMemberId piActionGroupMemberId = PiActionGroupMemberId.of(10);
+    private final PiActionProfileMemberId piActionProfileMemberId = PiActionProfileMemberId.of(10);
     private final PiAction piAction = PiAction.builder().withId(PiActionId.of(MOD_NW_DST))
             .withParameter(new PiActionParam(PiActionParamId.of(DST_ADDR), copyFrom(0x0a010101)))
             .build();
 
-    private final PiActionGroupMember piActionGroupMember = PiActionGroupMember.builder()
+    private final PiActionProfileMember piActionProfileMember = PiActionProfileMember.builder()
             .forActionProfile(ACTION_PROF_ID)
-            .withId(piActionGroupMemberId)
+            .withId(piActionProfileMemberId)
             .withAction(piAction)
             .withWeight(10)
             .build();
-    private PiActionGroupId piActionGroupId = PiActionGroupId.of(10);
-    private PiActionGroup piActionGroup1 = PiActionGroup.builder()
-            .addMember(piActionGroupMember)
+    private PiActionProfileGroupId piActionGroupId = PiActionProfileGroupId.of(10);
+    private PiActionProfileGroup piActionGroup1 = PiActionProfileGroup.builder()
+            .addMember(piActionProfileMember)
             .withId(piActionGroupId)
             .withActionProfileId(ACTION_PROF_ID)
             .build();
 
-    private PiActionGroup sameAsPiActionGroup1 = PiActionGroup.builder()
-            .addMember(piActionGroupMember)
+    private PiActionProfileGroup sameAsPiActionProfileGroup1 = PiActionProfileGroup.builder()
+            .addMember(piActionProfileMember)
             .withId(piActionGroupId)
             .withActionProfileId(ACTION_PROF_ID)
             .build();
 
-    private PiActionGroupId piActionGroupId2 = PiActionGroupId.of(20);
-    private PiActionGroup piActionGroup2 = PiActionGroup.builder()
-            .addMember(piActionGroupMember)
+    private PiActionProfileGroupId piActionGroupId2 = PiActionProfileGroupId.of(20);
+    private PiActionProfileGroup piActionGroup2 = PiActionProfileGroup.builder()
+            .addMember(piActionProfileMember)
             .withId(piActionGroupId2)
             .withActionProfileId(ACTION_PROF_ID)
             .build();
 
     /**
-     * Checks that the PiActionGroup class is immutable.
+     * Checks that the PiActionProfileGroup class is immutable.
      */
     @Test
     public void testImmutability() {
 
-        assertThatClassIsImmutable(PiActionGroup.class);
+        assertThatClassIsImmutable(PiActionProfileGroup.class);
     }
 
     /**
@@ -86,23 +86,23 @@
     public void testEquals() {
 
         new EqualsTester()
-                .addEqualityGroup(piActionGroup1, sameAsPiActionGroup1)
+                .addEqualityGroup(piActionGroup1, sameAsPiActionProfileGroup1)
                 .addEqualityGroup(piActionGroup2)
                 .testEquals();
     }
 
     /**
-     * Checks the methods of PiActionGroup.
+     * Checks the methods of PiActionProfileGroup.
      */
     @Test
     public void testMethods() {
 
-        Collection<PiActionGroupMember> piActionGroupMembers = Lists.newArrayList();
+        Collection<PiActionProfileMember> piActionProfileMembers = Lists.newArrayList();
 
-        piActionGroupMembers.add(piActionGroupMember);
+        piActionProfileMembers.add(piActionProfileMember);
         assertThat(piActionGroup1, is(notNullValue()));
         assertThat(piActionGroup1.id(), is(piActionGroupId));
         assertThat("Incorrect members value",
-                   CollectionUtils.isEqualCollection(piActionGroup1.members(), piActionGroupMembers));
+                   CollectionUtils.isEqualCollection(piActionGroup1.members(), piActionProfileMembers));
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileMemberIdTest.java b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileMemberIdTest.java
new file mode 100644
index 0000000..430ce9e
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileMemberIdTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2017-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.runtime;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Unit tests for PiActionProfileMemberId class.
+ */
+public class PiActionProfileMemberIdTest {
+
+    final PiActionProfileMemberId piActionProfileMemberId1 = PiActionProfileMemberId.of(10);
+    final PiActionProfileMemberId sameAsPiActionProfileMemberId1 = PiActionProfileMemberId.of(10);
+    final PiActionProfileMemberId piActionProfileMemberId2 = PiActionProfileMemberId.of(20);
+
+    /**
+     * Checks that the PiActionProfileMemberId class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+
+        assertThatClassIsImmutable(PiActionProfileMemberId.class);
+    }
+
+    /**
+     * Checks the operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+
+        new EqualsTester()
+                .addEqualityGroup(piActionProfileMemberId1, sameAsPiActionProfileMemberId1)
+                .addEqualityGroup(piActionProfileMemberId2)
+                .testEquals();
+    }
+
+    /**
+     * Checks the methods of PiActionProfileMemberId.
+     */
+    @Test
+    public void testMethods() {
+
+        assertThat(piActionProfileMemberId1, is(notNullValue()));
+        assertThat(piActionProfileMemberId1.type(), is(PiTableAction.Type.ACTION_PROFILE_MEMBER_ID));
+        assertThat(piActionProfileMemberId1.id(), is(10));
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupMemberTest.java b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileMemberTest.java
similarity index 65%
rename from core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupMemberTest.java
rename to core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileMemberTest.java
index e84d48f..317f322 100644
--- a/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionGroupMemberTest.java
+++ b/core/api/src/test/java/org/onosproject/net/pi/runtime/PiActionProfileMemberTest.java
@@ -31,49 +31,49 @@
 import static org.onosproject.net.pi.runtime.PiConstantsTest.MOD_NW_DST;
 
 /**
- * Unit tests for PiActionGroupMember class.
+ * Unit tests for PiActionProfileMember class.
  */
-public class PiActionGroupMemberTest {
+public class PiActionProfileMemberTest {
 
     private final PiActionProfileId actionProfileId1 = PiActionProfileId.of("foo");
     private final PiActionProfileId actionProfileId2 = PiActionProfileId.of("bar");
-    private final PiActionGroupMemberId piActionGroupMemberId = PiActionGroupMemberId.of(10);
+    private final PiActionProfileMemberId piActionProfileMemberId = PiActionProfileMemberId.of(10);
     private final PiAction piAction = PiAction.builder().withId(PiActionId.of(MOD_NW_DST))
             .withParameter(new PiActionParam(PiActionParamId.of(DST_ADDR), copyFrom(0x0a010101)))
             .build();
 
-    private final PiActionGroupMember piActionGroupMember1 = PiActionGroupMember.builder()
+    private final PiActionProfileMember piActionProfileMember1 = PiActionProfileMember.builder()
             .forActionProfile(actionProfileId1)
-            .withId(piActionGroupMemberId)
+            .withId(piActionProfileMemberId)
             .withAction(piAction)
             .withWeight(10)
             .build();
-    private final PiActionGroupMember sameAsPiActionGroupMember1 = PiActionGroupMember.builder()
+    private final PiActionProfileMember sameAsPiActionProfileMember1 = PiActionProfileMember.builder()
             .forActionProfile(actionProfileId1)
-            .withId(piActionGroupMemberId)
+            .withId(piActionProfileMemberId)
             .withAction(piAction)
             .withWeight(10)
             .build();
-    private final PiActionGroupMember piActionGroupMember2 = PiActionGroupMember.builder()
+    private final PiActionProfileMember piActionProfileMember2 = PiActionProfileMember.builder()
             .forActionProfile(actionProfileId1)
-            .withId(piActionGroupMemberId)
+            .withId(piActionProfileMemberId)
             .withAction(piAction)
             .withWeight(20)
             .build();
-    private final PiActionGroupMember piActionGroupMember1ForOtherProfile = PiActionGroupMember.builder()
+    private final PiActionProfileMember piActionGroupMember1ForOtherProfile = PiActionProfileMember.builder()
             .forActionProfile(actionProfileId2)
-            .withId(piActionGroupMemberId)
+            .withId(piActionProfileMemberId)
             .withAction(piAction)
             .withWeight(10)
             .build();
 
     /**
-     * Checks that the PiActionGroupMember class is immutable.
+     * Checks that the PiActionProfileMember class is immutable.
      */
     @Test
     public void testImmutability() {
 
-        assertThatClassIsImmutable(PiActionGroupMember.class);
+        assertThatClassIsImmutable(PiActionProfileMember.class);
     }
 
     /**
@@ -83,21 +83,21 @@
     public void testEquals() {
 
         new EqualsTester()
-                .addEqualityGroup(piActionGroupMember1, sameAsPiActionGroupMember1)
-                .addEqualityGroup(piActionGroupMember2)
+                .addEqualityGroup(piActionProfileMember1, sameAsPiActionProfileMember1)
+                .addEqualityGroup(piActionProfileMember2)
                 .addEqualityGroup(piActionGroupMember1ForOtherProfile)
                 .testEquals();
     }
 
     /**
-     * Checks the methods of PiActionGroupMember.
+     * Checks the methods of PiActionProfileMember.
      */
     @Test
     public void testMethods() {
 
-        assertThat(piActionGroupMember1, is(notNullValue()));
-        assertThat(piActionGroupMember1.weight(), is(10));
-        assertThat(piActionGroupMember1.id(), is(piActionGroupMemberId));
-        assertThat(piActionGroupMember1.action(), is(piAction));
+        assertThat(piActionProfileMember1, is(notNullValue()));
+        assertThat(piActionProfileMember1.weight(), is(10));
+        assertThat(piActionProfileMember1.id(), is(piActionProfileMemberId));
+        assertThat(piActionProfileMember1.action(), is(piAction));
     }
 }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/DecodeInstructionCodecHelper.java b/core/common/src/main/java/org/onosproject/codec/impl/DecodeInstructionCodecHelper.java
index 6753fae..2730c38 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/DecodeInstructionCodecHelper.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/DecodeInstructionCodecHelper.java
@@ -29,7 +29,6 @@
 import org.onlab.util.HexString;
 import org.onlab.util.ImmutableByteSequence;
 import org.onosproject.codec.CodecContext;
-import org.onosproject.net.flow.ExtensionTreatmentCodec;
 import org.onosproject.core.GroupId;
 import org.onosproject.net.ChannelSpacing;
 import org.onosproject.net.Device;
@@ -39,6 +38,7 @@
 import org.onosproject.net.OduSignalId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.ExtensionTreatmentCodec;
 import org.onosproject.net.flow.StatTriggerField;
 import org.onosproject.net.flow.StatTriggerFlag;
 import org.onosproject.net.flow.instructions.ExtensionTreatment;
@@ -53,9 +53,9 @@
 import org.onosproject.net.pi.model.PiActionId;
 import org.onosproject.net.pi.model.PiActionParamId;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.runtime.PiTableAction;
 import org.slf4j.Logger;
 
@@ -306,18 +306,18 @@
             }
 
             return Instructions.piTableAction(builder.withId(piActionId).build());
-        } else if (subType.equals(PiTableAction.Type.ACTION_GROUP_ID.name())) {
-            PiActionGroupId piActionGroupId = PiActionGroupId.of(nullIsIllegal(
-                    json.get(InstructionCodec.PI_ACTION_GROUP_ID),
-                    InstructionCodec.PI_ACTION_GROUP_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
+        } else if (subType.equals(PiTableAction.Type.ACTION_PROFILE_GROUP_ID.name())) {
+            PiActionProfileGroupId piActionGroupId = PiActionProfileGroupId.of(nullIsIllegal(
+                    json.get(InstructionCodec.PI_ACTION_PROFILE_GROUP_ID),
+                    InstructionCodec.PI_ACTION_PROFILE_GROUP_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
 
             return Instructions.piTableAction(piActionGroupId);
-        } else if (subType.equals(PiTableAction.Type.GROUP_MEMBER_ID.name())) {
-            PiActionGroupMemberId piActionGroupMemberId = PiActionGroupMemberId.of(nullIsIllegal(
-                    json.get(InstructionCodec.PI_ACTION_GROUP_MEMBER_ID),
-                    InstructionCodec.PI_ACTION_GROUP_MEMBER_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
+        } else if (subType.equals(PiTableAction.Type.ACTION_PROFILE_MEMBER_ID.name())) {
+            PiActionProfileMemberId piActionProfileMemberId = PiActionProfileMemberId.of(nullIsIllegal(
+                    json.get(InstructionCodec.PI_ACTION_PROFILE_MEMBER_ID),
+                    InstructionCodec.PI_ACTION_PROFILE_MEMBER_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
 
-            return Instructions.piTableAction(piActionGroupMemberId);
+            return Instructions.piTableAction(piActionProfileMemberId);
         }
         throw new IllegalArgumentException("Protocol-independent Instruction subtype "
                                                    + subType + " is not supported");
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/EncodeInstructionCodecHelper.java b/core/common/src/main/java/org/onosproject/codec/impl/EncodeInstructionCodecHelper.java
index 7e2f2df..0f3c125 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/EncodeInstructionCodecHelper.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/EncodeInstructionCodecHelper.java
@@ -20,12 +20,12 @@
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.util.HexString;
 import org.onosproject.codec.CodecContext;
-import org.onosproject.net.flow.ExtensionTreatmentCodec;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.OchSignal;
 import org.onosproject.net.OduSignalId;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.ExtensionTreatmentCodec;
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
 import org.onosproject.net.flow.instructions.L0ModificationInstruction;
@@ -35,9 +35,9 @@
 import org.onosproject.net.flow.instructions.L4ModificationInstruction;
 import org.onosproject.net.flow.instructions.PiInstruction;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.slf4j.Logger;
 
 import static org.onlab.util.Tools.toHexWithPrefix;
@@ -264,13 +264,13 @@
                 }
                 result.set(InstructionCodec.PI_ACTION_PARAMS, jsonActionParams);
                 break;
-            case ACTION_GROUP_ID:
-                final PiActionGroupId piActionGroupId = (PiActionGroupId) piInstruction.action();
-                result.put(InstructionCodec.PI_ACTION_GROUP_ID, piActionGroupId.id());
+            case ACTION_PROFILE_GROUP_ID:
+                final PiActionProfileGroupId groupId = (PiActionProfileGroupId) piInstruction.action();
+                result.put(InstructionCodec.PI_ACTION_PROFILE_GROUP_ID, groupId.id());
                 break;
-            case GROUP_MEMBER_ID:
-                final PiActionGroupMemberId piActionGroupMemberId = (PiActionGroupMemberId) piInstruction.action();
-                result.put(InstructionCodec.PI_ACTION_GROUP_MEMBER_ID, piActionGroupMemberId.id());
+            case ACTION_PROFILE_MEMBER_ID:
+                final PiActionProfileMemberId memberId = (PiActionProfileMemberId) piInstruction.action();
+                result.put(InstructionCodec.PI_ACTION_PROFILE_MEMBER_ID, memberId.id());
                 break;
             default:
                 throw new IllegalArgumentException("Cannot convert protocol-independent subtype of" +
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/InstructionCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
index 75192a0..df7ff1c 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
@@ -66,8 +66,8 @@
     static final String STAT_DURATION = "duration";
 
     static final String PI_ACTION_ID = "actionId";
-    static final String PI_ACTION_GROUP_ID = "groupId";
-    static final String PI_ACTION_GROUP_MEMBER_ID = "memberId";
+    static final String PI_ACTION_PROFILE_GROUP_ID = "groupId";
+    static final String PI_ACTION_PROFILE_MEMBER_ID = "memberId";
     static final String PI_ACTION_PARAMS = "actionParams";
 
     static final String MISSING_MEMBER_MESSAGE =
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/InstructionCodecTest.java b/core/common/src/test/java/org/onosproject/codec/impl/InstructionCodecTest.java
index 832a420..1647c8e 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/InstructionCodecTest.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/InstructionCodecTest.java
@@ -44,9 +44,9 @@
 import org.onosproject.net.pi.model.PiActionId;
 import org.onosproject.net.pi.model.PiActionParamId;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.runtime.PiTableAction;
 
 import java.io.IOException;
@@ -264,17 +264,17 @@
                 instructionCodec.encode(actionInstruction, context);
         assertThat(actionInstructionJson, matchesInstruction(actionInstruction));
 
-        PiTableAction actionGroupId = PiActionGroupId.of(10);
+        PiTableAction actionGroupId = PiActionProfileGroupId.of(10);
         final PiInstruction actionGroupIdInstruction = Instructions.piTableAction(actionGroupId);
         final ObjectNode actionGroupIdInstructionJson =
                 instructionCodec.encode(actionGroupIdInstruction, context);
         assertThat(actionGroupIdInstructionJson, matchesInstruction(actionGroupIdInstruction));
 
-        PiTableAction actionGroupMemberId = PiActionGroupMemberId.of(10);
-        final PiInstruction actionGroupMemberIdInstruction = Instructions.piTableAction(actionGroupMemberId);
-        final ObjectNode actionGroupMemberIdInstructionJson =
-                instructionCodec.encode(actionGroupMemberIdInstruction, context);
-        assertThat(actionGroupMemberIdInstructionJson, matchesInstruction(actionGroupMemberIdInstruction));
+        PiTableAction actionProfileMemberId = PiActionProfileMemberId.of(10);
+        final PiInstruction actionProfileMemberIdInstruction = Instructions.piTableAction(actionProfileMemberId);
+        final ObjectNode actionProfileMemberIdInstructionJson =
+                instructionCodec.encode(actionProfileMemberIdInstruction, context);
+        assertThat(actionProfileMemberIdInstructionJson, matchesInstruction(actionProfileMemberIdInstruction));
     }
 
     /**
@@ -294,17 +294,17 @@
         Assert.assertThat(actionParam.id().id(), is("port"));
         Assert.assertThat(actionParam.value(), is(copyFrom((byte) 0x1)));
 
-        Instruction actionGroupIdInstruction = getInstruction("PiActionGroupIdInstruction.json");
+        Instruction actionGroupIdInstruction = getInstruction("PiActionProfileGroupIdInstruction.json");
         Assert.assertThat(actionInstruction.type(), is(Instruction.Type.PROTOCOL_INDEPENDENT));
         PiTableAction actionGroupId = ((PiInstruction) actionGroupIdInstruction).action();
-        Assert.assertThat(actionGroupId.type(), is(PiTableAction.Type.ACTION_GROUP_ID));
-        Assert.assertThat(((PiActionGroupId) actionGroupId).id(), is(100));
+        Assert.assertThat(actionGroupId.type(), is(PiTableAction.Type.ACTION_PROFILE_GROUP_ID));
+        Assert.assertThat(((PiActionProfileGroupId) actionGroupId).id(), is(100));
 
-        Instruction actionMemberIdInstruction = getInstruction("PiActionMemberIdInstruction.json");
+        Instruction actionMemberIdInstruction = getInstruction("PiActionProfileMemberIdInstruction.json");
         Assert.assertThat(actionInstruction.type(), is(Instruction.Type.PROTOCOL_INDEPENDENT));
         PiTableAction actionMemberId = ((PiInstruction) actionMemberIdInstruction).action();
-        Assert.assertThat(actionMemberId.type(), is(PiTableAction.Type.GROUP_MEMBER_ID));
-        Assert.assertThat(((PiActionGroupMemberId) actionMemberId).id(), is(100));
+        Assert.assertThat(actionMemberId.type(), is(PiTableAction.Type.ACTION_PROFILE_MEMBER_ID));
+        Assert.assertThat(((PiActionProfileMemberId) actionMemberId).id(), is(100));
     }
 
     /**
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/InstructionJsonMatcher.java b/core/common/src/test/java/org/onosproject/codec/impl/InstructionJsonMatcher.java
index 9911a4f..66f8473 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/InstructionJsonMatcher.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/InstructionJsonMatcher.java
@@ -37,9 +37,9 @@
 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
 import org.onosproject.net.flow.instructions.PiInstruction;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 
 import java.util.Collection;
 import java.util.Objects;
@@ -554,19 +554,19 @@
                     }
                 }
                 break;
-            case ACTION_GROUP_ID:
+            case ACTION_PROFILE_GROUP_ID:
                 if (!Objects.equals(instructionJson.get("groupId").asInt(),
-                                    ((PiActionGroupId) instructionToMatch.action()).id())) {
-                    description.appendText("action group id was " +
-                                                   ((PiActionGroupId) instructionToMatch.action()).id());
+                                    ((PiActionProfileGroupId) instructionToMatch.action()).id())) {
+                    description.appendText("action profile group id was " +
+                                                   ((PiActionProfileGroupId) instructionToMatch.action()).id());
                     return false;
                 }
                 break;
-            case GROUP_MEMBER_ID:
+            case ACTION_PROFILE_MEMBER_ID:
                 if (!Objects.equals(instructionJson.get("memberId").asInt(),
-                                    ((PiActionGroupMemberId) instructionToMatch.action()).id())) {
-                    description.appendText("action member id was " +
-                                                   ((PiActionGroupMemberId) instructionToMatch.action()).id());
+                                    ((PiActionProfileMemberId) instructionToMatch.action()).id())) {
+                    description.appendText("action profile member id was " +
+                                                   ((PiActionProfileMemberId) instructionToMatch.action()).id());
                     return false;
                 }
                 break;
diff --git a/core/common/src/test/resources/org/onosproject/codec/impl/PiActionGroupIdInstruction.json b/core/common/src/test/resources/org/onosproject/codec/impl/PiActionGroupIdInstruction.json
deleted file mode 100644
index 50a7d30..0000000
--- a/core/common/src/test/resources/org/onosproject/codec/impl/PiActionGroupIdInstruction.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "type":"PROTOCOL_INDEPENDENT",
-  "subtype":"ACTION_GROUP_ID",
-  "groupId": 100
-}
diff --git a/core/common/src/test/resources/org/onosproject/codec/impl/PiActionMemberIdInstruction.json b/core/common/src/test/resources/org/onosproject/codec/impl/PiActionMemberIdInstruction.json
deleted file mode 100644
index c3fce67..0000000
--- a/core/common/src/test/resources/org/onosproject/codec/impl/PiActionMemberIdInstruction.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "type":"PROTOCOL_INDEPENDENT",
-  "subtype":"GROUP_MEMBER_ID",
-  "memberId": 100
-}
\ No newline at end of file
diff --git a/core/common/src/test/resources/org/onosproject/codec/impl/PiActionProfileGroupIdInstruction.json b/core/common/src/test/resources/org/onosproject/codec/impl/PiActionProfileGroupIdInstruction.json
new file mode 100644
index 0000000..c7b4446
--- /dev/null
+++ b/core/common/src/test/resources/org/onosproject/codec/impl/PiActionProfileGroupIdInstruction.json
@@ -0,0 +1,5 @@
+{
+  "type":"PROTOCOL_INDEPENDENT",
+  "subtype": "ACTION_PROFILE_GROUP_ID",
+  "groupId": 100
+}
diff --git a/core/common/src/test/resources/org/onosproject/codec/impl/PiActionProfileMemberIdInstruction.json b/core/common/src/test/resources/org/onosproject/codec/impl/PiActionProfileMemberIdInstruction.json
new file mode 100644
index 0000000..c7383a2
--- /dev/null
+++ b/core/common/src/test/resources/org/onosproject/codec/impl/PiActionProfileMemberIdInstruction.json
@@ -0,0 +1,5 @@
+{
+  "type":"PROTOCOL_INDEPENDENT",
+  "subtype": "ACTION_PROFILE_MEMBER_ID",
+  "memberId": 100
+}
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiGroupTranslatorImpl.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiGroupTranslatorImpl.java
index 4a4dff7..de32b60 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiGroupTranslatorImpl.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiGroupTranslatorImpl.java
@@ -24,10 +24,10 @@
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.model.PiPipelineInterpreter;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.runtime.PiGroupKey;
 import org.onosproject.net.pi.runtime.PiTableAction;
 import org.onosproject.net.pi.service.PiTranslationException;
@@ -55,15 +55,16 @@
     }
 
     /**
-     * Returns a PI action group equivalent to the given group, for the given pipeconf and device.
+     * Returns a PI action profile group equivalent to the given group, for the given pipeconf and device.
      *
      * @param group    group
      * @param pipeconf pipeconf
      * @param device   device
-     * @return PI action group
+     * @return PI action profile group
      * @throws PiTranslationException if the group cannot be translated
      */
-    static PiActionGroup translate(Group group, PiPipeconf pipeconf, Device device) throws PiTranslationException {
+    static PiActionProfileGroup translate(Group group, PiPipeconf pipeconf, Device device)
+            throws PiTranslationException {
 
         if (!SUPPORTED_GROUP_TYPES.contains(group.type())) {
             throw new PiTranslationException(format(
@@ -72,8 +73,8 @@
 
         final PiPipelineInterpreter interpreter = getInterpreterOrNull(device, pipeconf);
 
-        final PiActionGroup.Builder piActionGroupBuilder = PiActionGroup.builder()
-                .withId(PiActionGroupId.of(group.id().id()));
+        final PiActionProfileGroup.Builder piActionGroupBuilder = PiActionProfileGroup.builder()
+                .withId(PiActionProfileGroupId.of(group.id().id()));
 
         if (!(group.appCookie() instanceof PiGroupKey)) {
             throw new PiTranslationException("group app cookie is not PI (class should be PiGroupKey)");
@@ -88,7 +89,7 @@
             /*
             FIXME: the way member IDs are computed can cause collisions!
             Problem:
-            In P4Runtime action group members, i.e. action buckets, are associated to a numeric ID chosen
+            In P4Runtime action profile members, i.e. action buckets, are associated to a numeric ID chosen
             at member insertion time. This ID must be unique for the whole action profile (i.e. the group table in
             OpenFlow). In ONOS, GroupBucket doesn't specify any ID.
 
@@ -118,9 +119,9 @@
                         "PI table action of type %s is not supported in groups", tableAction.type()));
             }
 
-            piActionGroupBuilder.addMember(PiActionGroupMember.builder()
+            piActionGroupBuilder.addMember(PiActionProfileMember.builder()
                                                    .forActionProfile(groupKey.actionProfileId())
-                                                   .withId(PiActionGroupMemberId.of(memberId))
+                                                   .withId(PiActionProfileMemberId.of(memberId))
                                                    .withAction((PiAction) tableAction)
                                                    .withWeight(bucket.weight())
                                                    .build());
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 f024f6c..acfb535 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
@@ -23,7 +23,7 @@
 import org.onosproject.net.group.Group;
 import org.onosproject.net.meter.Meter;
 import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiActionGroup;
+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.PiTableEntry;
@@ -137,7 +137,7 @@
     }
 
     private final class InternalGroupTranslator
-            extends AbstractPiTranslatorImpl<Group, PiActionGroup>
+            extends AbstractPiTranslatorImpl<Group, PiActionProfileGroup>
             implements PiGroupTranslator {
 
         private InternalGroupTranslator(PiGroupTranslationStore store) {
@@ -145,7 +145,7 @@
         }
 
         @Override
-        public PiActionGroup translate(Group original, PiPipeconf pipeconf)
+        public PiActionProfileGroup translate(Group original, PiPipeconf pipeconf)
                 throws PiTranslationException {
             return PiGroupTranslatorImpl
                     .translate(original, pipeconf, getDevice(original.deviceId()));
diff --git a/core/net/src/test/java/org/onosproject/net/pi/impl/PiGroupTranslatorImplTest.java b/core/net/src/test/java/org/onosproject/net/pi/impl/PiGroupTranslatorImplTest.java
index 5a60420..adc96a0 100644
--- a/core/net/src/test/java/org/onosproject/net/pi/impl/PiGroupTranslatorImplTest.java
+++ b/core/net/src/test/java/org/onosproject/net/pi/impl/PiGroupTranslatorImplTest.java
@@ -38,10 +38,10 @@
 import org.onosproject.net.group.GroupDescription;
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.runtime.PiGroupKey;
 import org.onosproject.net.pi.runtime.PiTableAction;
 import org.onosproject.pipelines.basic.PipeconfLoader;
@@ -80,7 +80,7 @@
     private static final int DEFAULT_MEMBER_WEIGHT = 1;
     private static final int BASE_MEM_ID = 65535;
     private static final int PORT_BITWIDTH = 9;
-    private Collection<PiActionGroupMember> expectedMembers;
+    private Collection<PiActionProfileMember> expectedMembers;
 
     private PiPipeconf pipeconf;
 
@@ -104,16 +104,16 @@
         return DefaultGroupBucket.createSelectGroupBucket(treatment);
     }
 
-    private static PiActionGroupMember outputMember(int portNum)
+    private static PiActionProfileMember outputMember(int portNum)
             throws ImmutableByteSequence.ByteSequenceTrimException {
         PiActionParam param = new PiActionParam(PORT, copyFrom(portNum).fit(PORT_BITWIDTH));
         PiAction piAction = PiAction.builder()
                 .withId(INGRESS_WCMP_CONTROL_SET_EGRESS_PORT)
                 .withParameter(param).build();
-        return PiActionGroupMember.builder()
+        return PiActionProfileMember.builder()
                 .forActionProfile(INGRESS_WCMP_CONTROL_WCMP_SELECTOR)
                 .withAction(piAction)
-                .withId(PiActionGroupMemberId.of(BASE_MEM_ID + portNum))
+                .withId(PiActionProfileMemberId.of(BASE_MEM_ID + portNum))
                 .withWeight(DEFAULT_MEMBER_WEIGHT)
                 .build();
     }
@@ -124,8 +124,8 @@
     @Test
     public void testTranslateGroups() throws Exception {
 
-        PiActionGroup piGroup1 = PiGroupTranslatorImpl.translate(SELECT_GROUP, pipeconf, null);
-        PiActionGroup piGroup2 = PiGroupTranslatorImpl.translate(SELECT_GROUP, pipeconf, null);
+        PiActionProfileGroup piGroup1 = PiGroupTranslatorImpl.translate(SELECT_GROUP, pipeconf, null);
+        PiActionProfileGroup piGroup2 = PiGroupTranslatorImpl.translate(SELECT_GROUP, pipeconf, null);
 
         new EqualsTester()
                 .addEqualityGroup(piGroup1, piGroup2)
@@ -137,7 +137,7 @@
                    piGroup1.actionProfileId(), is(equalTo(INGRESS_WCMP_CONTROL_WCMP_SELECTOR)));
 
         // members installed
-        Collection<PiActionGroupMember> members = piGroup1.members();
+        Collection<PiActionProfileMember> members = piGroup1.members();
         assertThat("The number of group members must be equal",
                    piGroup1.members().size(), is(expectedMembers.size()));
         assertThat("Group members must be equal",
diff --git a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiGroupTranslationStore.java b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiGroupTranslationStore.java
index d2cedd8..0115310 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiGroupTranslationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiGroupTranslationStore.java
@@ -17,7 +17,7 @@
 package org.onosproject.store.pi.impl;
 
 import org.onosproject.net.group.Group;
-import org.onosproject.net.pi.runtime.PiActionGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
 import org.onosproject.net.pi.service.PiGroupTranslationStore;
 import org.osgi.service.component.annotations.Component;
 
@@ -26,7 +26,7 @@
  */
 @Component(immediate = true, service = PiGroupTranslationStore.class)
 public class DistributedPiGroupTranslationStore
-        extends AbstractDistributedPiTranslationStore<Group, PiActionGroup>
+        extends AbstractDistributedPiTranslationStore<Group, PiActionProfileGroup>
         implements PiGroupTranslationStore {
 
     private static final String MAP_SIMPLE_NAME = "group";
diff --git a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
index 0a2f66f..03bf350 100644
--- a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
+++ b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
@@ -225,13 +225,13 @@
 import org.onosproject.net.pi.model.PiTableId;
 import org.onosproject.net.pi.model.PiTableType;
 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.PiActionGroupId;
-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.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+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.runtime.PiControlMetadata;
 import org.onosproject.net.pi.runtime.PiCounterCell;
 import org.onosproject.net.pi.runtime.PiCounterCellData;
@@ -690,12 +690,12 @@
                     PiTableType.class,
                     // PI Runtime
                     PiAction.class,
-                    PiActionGroup.class,
-                    PiActionGroupHandle.class,
-                    PiActionGroupId.class,
-                    PiActionGroupMember.class,
-                    PiActionGroupMemberHandle.class,
-                    PiActionGroupMemberId.class,
+                    PiActionProfileGroup.class,
+                    PiActionProfileGroupHandle.class,
+                    PiActionProfileGroupId.class,
+                    PiActionProfileMember.class,
+                    PiActionProfileMemberHandle.class,
+                    PiActionProfileMemberId.class,
                     PiActionParam.class,
                     PiControlMetadata.class,
                     PiCounterCell.class,
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> {
 }
diff --git a/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/pipeliner/NextObjectiveTranslator.java b/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/pipeliner/NextObjectiveTranslator.java
index 037a95f..3af3c3e 100644
--- a/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/pipeliner/NextObjectiveTranslator.java
+++ b/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/pipeliner/NextObjectiveTranslator.java
@@ -43,8 +43,8 @@
 import org.onosproject.net.group.GroupKey;
 import org.onosproject.net.pi.model.PiTableId;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
 import org.onosproject.net.pi.runtime.PiGroupKey;
 import org.onosproject.pipelines.fabric.FabricCapabilities;
 import org.onosproject.pipelines.fabric.FabricConstants;
@@ -216,7 +216,7 @@
 
         final TrafficSelector selector = nextIdSelector(obj.id());
         final TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                .piTableAction(PiActionGroupId.of(groupId))
+                .piTableAction(PiActionProfileGroupId.of(groupId))
                 .build();
 
         resultBuilder.addFlowRule(flowRule(
diff --git a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricNextPipelinerTest.java b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricNextPipelinerTest.java
index a56d26b..b28074d 100644
--- a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricNextPipelinerTest.java
+++ b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricNextPipelinerTest.java
@@ -36,8 +36,8 @@
 import org.onosproject.net.group.GroupDescription;
 import org.onosproject.net.group.GroupKey;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
 import org.onosproject.net.pi.runtime.PiGroupKey;
 import org.onosproject.pipelines.fabric.FabricConstants;
 
@@ -256,7 +256,7 @@
         TrafficSelector nextIdSelector = DefaultTrafficSelector.builder()
                 .matchPi(nextIdCriterion)
                 .build();
-        PiActionGroupId actionGroupId = PiActionGroupId.of(NEXT_ID_1);
+        PiActionProfileGroupId actionGroupId = PiActionProfileGroupId.of(NEXT_ID_1);
         TrafficTreatment treatment = DefaultTrafficTreatment.builder()
                 .piTableAction(actionGroupId)
                 .build();
diff --git a/protocols/p4runtime/api/src/main/java/org/onosproject/p4runtime/api/P4RuntimeClient.java b/protocols/p4runtime/api/src/main/java/org/onosproject/p4runtime/api/P4RuntimeClient.java
index 7a08668..5d7e93e 100644
--- a/protocols/p4runtime/api/src/main/java/org/onosproject/p4runtime/api/P4RuntimeClient.java
+++ b/protocols/p4runtime/api/src/main/java/org/onosproject/p4runtime/api/P4RuntimeClient.java
@@ -23,9 +23,9 @@
 import org.onosproject.net.pi.model.PiMeterId;
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.model.PiTableId;
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.runtime.PiCounterCell;
 import org.onosproject.net.pi.runtime.PiCounterCellId;
 import org.onosproject.net.pi.runtime.PiMeterCellConfig;
@@ -185,41 +185,44 @@
             Set<PiCounterCellId> cellIds, PiPipeconf pipeconf);
 
     /**
-     * Performs the given write operation for the given action group members and
-     * pipeconf.
+     * Performs the given write operation for the given action profile members
+     * and pipeconf.
      *
-     * @param members  action group members
-     * @param opType   write operation type
-     * @param pipeconf the pipeconf currently deployed on the device
+     * @param members   action profile members
+     * @param opType    write operation type
+     * @param pipeconf  the pipeconf currently deployed on the device
      * @return true if the operation was successful, false otherwise
      */
-    CompletableFuture<Boolean> writeActionGroupMembers(
-            List<PiActionGroupMember> members,
+    CompletableFuture<Boolean> writeActionProfileMembers(
+            List<PiActionProfileMember> members,
             WriteOperationType opType, PiPipeconf pipeconf);
 
     /**
-     * Performs the given write operation for the given action group and
+     * Performs the given write operation for the given action profile group and
      * pipeconf.
      *
-     * @param group    the action group
-     * @param opType   write operation type
-     * @param pipeconf the pipeconf currently deployed on the device
-     * @param maxMemberSize the maximum number of members that can be added to the group.
-     *                      This is meaningful only if it's an INSERT operation, otherwise
-     *                      its value should be 0
+     * @param group         the action profile group
+     * @param opType        write operation type
+     * @param pipeconf      the pipeconf currently deployed on the device
+     * @param maxMemberSize the maximum number of members that can be added to
+     *                      the group. This is meaningful only if it's an INSERT
+     *                      operation, otherwise its value should be 0
      * @return true if the operation was successful, false otherwise
      */
-    CompletableFuture<Boolean> writeActionGroup(
-            PiActionGroup group, WriteOperationType opType, PiPipeconf pipeconf, int maxMemberSize);
+    CompletableFuture<Boolean> writeActionProfileGroup(
+            PiActionProfileGroup group,
+            WriteOperationType opType,
+            PiPipeconf pipeconf,
+            int maxMemberSize);
 
     /**
-     * Dumps all groups currently installed for the given action profile.
+     * Dumps all groups currently installed in the given action profile.
      *
      * @param actionProfileId the action profile id
      * @param pipeconf        the pipeconf currently deployed on the device
      * @return completable future of a list of groups
      */
-    CompletableFuture<List<PiActionGroup>> dumpGroups(
+    CompletableFuture<List<PiActionProfileGroup>> dumpActionProfileGroups(
             PiActionProfileId actionProfileId, PiPipeconf pipeconf);
 
     /**
@@ -229,7 +232,7 @@
      * @param pipeconf        pipeconf
      * @return future of list of action profile member ID
      */
-    CompletableFuture<List<PiActionGroupMemberId>> dumpActionProfileMemberIds(
+    CompletableFuture<List<PiActionProfileMemberId>> dumpActionProfileMemberIds(
             PiActionProfileId actionProfileId, PiPipeconf pipeconf);
 
     /**
@@ -241,9 +244,9 @@
      * @param pipeconf        pipeconf
      * @return list of member IDs that were successfully removed from the device
      */
-    CompletableFuture<List<PiActionGroupMemberId>> removeActionProfileMembers(
+    CompletableFuture<List<PiActionProfileMemberId>> removeActionProfileMembers(
             PiActionProfileId actionProfileId,
-            List<PiActionGroupMemberId> memberIds,
+            List<PiActionProfileMemberId> memberIds,
             PiPipeconf pipeconf);
 
     /**
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileGroupEncoder.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileGroupEncoder.java
index cb0735d..414a0e6 100644
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileGroupEncoder.java
+++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileGroupEncoder.java
@@ -19,8 +19,8 @@
 import com.google.common.collect.Maps;
 import org.onosproject.net.pi.model.PiActionProfileId;
 import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
 import p4.config.v1.P4InfoOuterClass;
 import p4.v1.P4RuntimeOuterClass.ActionProfileGroup;
 import p4.v1.P4RuntimeOuterClass.ActionProfileGroup.Member;
@@ -41,18 +41,18 @@
     }
 
     /**
-     * Encode a PI action group to a action profile group.
+     * Encode a PI action profile group to a action profile group.
      *
      * @param piActionGroup the action profile group
      * @param pipeconf      the pipeconf
      * @param maxMemberSize the max member size of action group
-     * @return a action profile group encoded from PI action group
+     * @return a action profile group encoded from PI action profile group
      * @throws P4InfoBrowser.NotFoundException if can't find action profile from
      *                                         P4Info browser
      * @throws EncodeException                 if can't find P4Info from
      *                                         pipeconf
      */
-    static ActionProfileGroup encode(PiActionGroup piActionGroup, PiPipeconf pipeconf, int maxMemberSize)
+    static ActionProfileGroup encode(PiActionProfileGroup piActionGroup, PiPipeconf pipeconf, int maxMemberSize)
             throws P4InfoBrowser.NotFoundException, EncodeException {
         P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
 
@@ -86,26 +86,26 @@
 
     /**
      * Decode an action profile group with members information to a PI action
-     * group.
+     * profile group.
      *
      * @param actionProfileGroup the action profile group
      * @param members            members of the action profile group
      * @param pipeconf           the pipeconf
-     * @return decoded PI action group
+     * @return decoded PI action profile group
      * @throws P4InfoBrowser.NotFoundException if can't find action profile from
      *                                         P4Info browser
      * @throws EncodeException                 if can't find P4Info from
      *                                         pipeconf
      */
-    static PiActionGroup decode(ActionProfileGroup actionProfileGroup,
-                                Collection<ActionProfileMember> members,
-                                PiPipeconf pipeconf)
+    static PiActionProfileGroup decode(ActionProfileGroup actionProfileGroup,
+                                       Collection<ActionProfileMember> members,
+                                       PiPipeconf pipeconf)
             throws P4InfoBrowser.NotFoundException, EncodeException {
         P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
         if (browser == null) {
             throw new EncodeException(format("Can't get P4 info browser from pipeconf %s", pipeconf));
         }
-        PiActionGroup.Builder piActionGroupBuilder = PiActionGroup.builder();
+        PiActionProfileGroup.Builder piActionGroupBuilder = PiActionProfileGroup.builder();
 
         P4InfoOuterClass.ActionProfile actionProfile = browser.actionProfiles()
                 .getById(actionProfileGroup.getActionProfileId());
@@ -113,14 +113,14 @@
 
         piActionGroupBuilder
                 .withActionProfileId(piActionProfileId)
-                .withId(PiActionGroupId.of(actionProfileGroup.getGroupId()));
+                .withId(PiActionProfileGroupId.of(actionProfileGroup.getGroupId()));
 
         Map<Integer, Integer> memberWeights = Maps.newHashMap();
         actionProfileGroup.getMembersList().forEach(member -> {
             int weight = member.getWeight();
             if (weight < 1) {
                 // FIXME: currently PI has a bug which will always return weight 0
-                // ONOS won't accept group member with weight 0
+                // ONOS won't accept group buckets with weight 0
                 weight = 1;
             }
             memberWeights.put(member.getMemberId(), weight);
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileMemberEncoder.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileMemberEncoder.java
index e78aa97..30dd43c 100644
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileMemberEncoder.java
+++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/ActionProfileMemberEncoder.java
@@ -18,8 +18,8 @@
 
 import org.onosproject.net.pi.model.PiActionProfileId;
 import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import p4.config.v1.P4InfoOuterClass;
 import p4.v1.P4RuntimeOuterClass;
 import p4.v1.P4RuntimeOuterClass.ActionProfileMember;
@@ -37,16 +37,16 @@
     }
 
     /**
-     * Encode a PiActionGroupMember to a ActionProfileMember.
+     * Encode a PiActionProfileMember to a ActionProfileMember.
      *
-     * @param member   the member to encode
-     * @param pipeconf the pipeconf, as encode spec
+     * @param member    the member to encode
+     * @param pipeconf  the pipeconf, as encode spec
      * @return encoded member
      * @throws P4InfoBrowser.NotFoundException can't find action profile from
      *                                         P4Info browser
      * @throws EncodeException                 can't find P4Info from pipeconf
      */
-    static ActionProfileMember encode(PiActionGroupMember member,
+    static ActionProfileMember encode(PiActionProfileMember member,
                                       PiPipeconf pipeconf)
             throws P4InfoBrowser.NotFoundException, EncodeException {
 
@@ -77,20 +77,20 @@
     }
 
     /**
-     * Decode an action profile member to PI action group member.
+     * Decode an action profile member to PI action profile member.
      *
      * @param member   the action profile member
      * @param weight   the weight of the member
      * @param pipeconf the pipeconf, as decode spec
-     * @return decoded PI action group member
+     * @return decoded PI action profile member
      * @throws P4InfoBrowser.NotFoundException can't find definition of action
      *                                         from P4 info
      * @throws EncodeException                 can't get P4 info browser from
      *                                         pipeconf
      */
-    static PiActionGroupMember decode(ActionProfileMember member,
-                                      int weight,
-                                      PiPipeconf pipeconf)
+    static PiActionProfileMember decode(ActionProfileMember member,
+                                        int weight,
+                                        PiPipeconf pipeconf)
             throws P4InfoBrowser.NotFoundException, EncodeException {
         P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
         if (browser == null) {
@@ -103,9 +103,9 @@
                         .getPreamble()
                         .getName());
 
-        return PiActionGroupMember.builder()
+        return PiActionProfileMember.builder()
                 .forActionProfile(actionProfileId)
-                .withId(PiActionGroupMemberId.of(member.getMemberId()))
+                .withId(PiActionProfileMemberId.of(member.getMemberId()))
                 .withWeight(weight)
                 .withAction(decodeActionMsg(member.getAction(), browser))
                 .build();
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java
index d5080ae..78ea9d9 100644
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java
+++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeClientImpl.java
@@ -38,9 +38,9 @@
 import org.onosproject.net.pi.model.PiMeterId;
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.model.PiTableId;
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.runtime.PiCounterCell;
 import org.onosproject.net.pi.runtime.PiCounterCellId;
 import org.onosproject.net.pi.runtime.PiMeterCellConfig;
@@ -218,41 +218,41 @@
     }
 
     @Override
-    public CompletableFuture<Boolean> writeActionGroupMembers(List<PiActionGroupMember> members,
+    public CompletableFuture<Boolean> writeActionProfileMembers(List<PiActionProfileMember> members,
+                                                                WriteOperationType opType,
+                                                                PiPipeconf pipeconf) {
+        return supplyInContext(() -> doWriteActionProfileMembers(members, opType, pipeconf),
+                               "writeActionProfileMembers-" + opType.name());
+    }
+
+
+    @Override
+    public CompletableFuture<Boolean> writeActionProfileGroup(PiActionProfileGroup group,
                                                               WriteOperationType opType,
-                                                              PiPipeconf pipeconf) {
-        return supplyInContext(() -> doWriteActionGroupMembers(members, opType, pipeconf),
-                               "writeActionGroupMembers-" + opType.name());
-    }
-
-
-    @Override
-    public CompletableFuture<Boolean> writeActionGroup(PiActionGroup group,
-                                                       WriteOperationType opType,
-                                                       PiPipeconf pipeconf,
+                                                              PiPipeconf pipeconf,
                                                        int maxMemberSize) {
-        return supplyInContext(() -> doWriteActionGroup(group, opType, pipeconf, maxMemberSize),
-                               "writeActionGroup-" + opType.name());
+        return supplyInContext(() -> doWriteActionProfileGroup(group, opType, pipeconf, maxMemberSize),
+                               "writeActionProfileGroup-" + opType.name());
     }
 
     @Override
-    public CompletableFuture<List<PiActionGroup>> dumpGroups(PiActionProfileId actionProfileId,
-                                                             PiPipeconf pipeconf) {
+    public CompletableFuture<List<PiActionProfileGroup>> dumpActionProfileGroups(
+            PiActionProfileId actionProfileId, PiPipeconf pipeconf) {
         return supplyInContext(() -> doDumpGroups(actionProfileId, pipeconf),
-                               "dumpGroups-" + actionProfileId.id());
+                               "dumpActionProfileGroups-" + actionProfileId.id());
     }
 
     @Override
-    public CompletableFuture<List<PiActionGroupMemberId>> dumpActionProfileMemberIds(
+    public CompletableFuture<List<PiActionProfileMemberId>> dumpActionProfileMemberIds(
             PiActionProfileId actionProfileId, PiPipeconf pipeconf) {
         return supplyInContext(() -> doDumpActionProfileMemberIds(actionProfileId, pipeconf),
                                "dumpActionProfileMemberIds-" + actionProfileId.id());
     }
 
     @Override
-    public CompletableFuture<List<PiActionGroupMemberId>> removeActionProfileMembers(
+    public CompletableFuture<List<PiActionProfileMemberId>> removeActionProfileMembers(
             PiActionProfileId actionProfileId,
-            List<PiActionGroupMemberId> memberIds,
+            List<PiActionProfileMemberId> memberIds,
             PiPipeconf pipeconf) {
         return supplyInContext(
                 () -> doRemoveActionProfileMembers(actionProfileId, memberIds, pipeconf),
@@ -667,15 +667,15 @@
         return CounterEntryCodec.decodeCounterEntities(entities, pipeconf);
     }
 
-    private boolean doWriteActionGroupMembers(List<PiActionGroupMember> members,
-                                              WriteOperationType opType, PiPipeconf pipeconf) {
+    private boolean doWriteActionProfileMembers(List<PiActionProfileMember> members,
+                                                WriteOperationType opType, PiPipeconf pipeconf) {
         final List<ActionProfileMember> actionProfileMembers = Lists.newArrayList();
 
-        for (PiActionGroupMember member : members) {
+        for (PiActionProfileMember member : members) {
             try {
                 actionProfileMembers.add(ActionProfileMemberEncoder.encode(member, pipeconf));
             } catch (EncodeException | P4InfoBrowser.NotFoundException e) {
-                log.warn("Unable to encode group member, aborting {} operation: {} [{}]",
+                log.warn("Unable to encode action profile member, aborting {} operation: {} [{}]",
                          opType.name(), e.getMessage(), member.toString());
                 return false;
             }
@@ -696,10 +696,10 @@
             return true;
         }
 
-        return write(updateMsgs, members, opType, "group member");
+        return write(updateMsgs, members, opType, "action profile member");
     }
 
-    private List<PiActionGroup> doDumpGroups(PiActionProfileId piActionProfileId, PiPipeconf pipeconf) {
+    private List<PiActionProfileGroup> doDumpGroups(PiActionProfileId piActionProfileId, PiPipeconf pipeconf) {
         log.debug("Dumping groups from action profile {} from {} (pipeconf {})...",
                   piActionProfileId.id(), deviceId, pipeconf.id());
 
@@ -806,7 +806,7 @@
                         .map(Map.Entry::getKey)
                         .forEach(gid -> groupIdToMembersMap.put(gid, member)));
 
-        log.debug("Retrieved {} group members from action profile {} on {}...",
+        log.debug("Retrieved {} members from action profile {} on {}...",
                   groupIdToMembersMap.size(), piActionProfileId.id(), deviceId);
 
         return groupMsgs.stream()
@@ -824,7 +824,7 @@
                 .collect(Collectors.toList());
     }
 
-    private List<PiActionGroupMemberId> doDumpActionProfileMemberIds(
+    private List<PiActionProfileMemberId> doDumpActionProfileMemberIds(
             PiActionProfileId actionProfileId, PiPipeconf pipeconf) {
 
         final P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
@@ -875,13 +875,13 @@
                 // removing members of other groups.
                 .filter(m -> m.getActionProfileId() == p4ActProfId)
                 .map(ActionProfileMember::getMemberId)
-                .map(PiActionGroupMemberId::of)
+                .map(PiActionProfileMemberId::of)
                 .collect(Collectors.toList());
     }
 
-    private List<PiActionGroupMemberId> doRemoveActionProfileMembers(
+    private List<PiActionProfileMemberId> doRemoveActionProfileMembers(
             PiActionProfileId actionProfileId,
-            List<PiActionGroupMemberId> memberIds,
+            List<PiActionProfileMemberId> memberIds,
             PiPipeconf pipeconf) {
 
         if (memberIds.isEmpty()) {
@@ -922,7 +922,8 @@
                 "action profile members");
     }
 
-    private boolean doWriteActionGroup(PiActionGroup group, WriteOperationType opType, PiPipeconf pipeconf,
+    private boolean doWriteActionProfileGroup(
+            PiActionProfileGroup group, WriteOperationType opType, PiPipeconf pipeconf,
                                        int maxMemberSize) {
         final ActionProfileGroup actionProfileGroup;
         if (opType == P4RuntimeClient.WriteOperationType.INSERT && maxMemberSize < group.members().size()) {
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/TableEntryEncoder.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/TableEntryEncoder.java
index 7e2df98..3294a6d 100644
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/TableEntryEncoder.java
+++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/TableEntryEncoder.java
@@ -26,9 +26,9 @@
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.model.PiTableId;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.net.pi.runtime.PiCounterCellData;
 import org.onosproject.net.pi.runtime.PiExactFieldMatch;
 import org.onosproject.net.pi.runtime.PiFieldMatch;
@@ -46,7 +46,6 @@
 import p4.v1.P4RuntimeOuterClass.TableAction;
 import p4.v1.P4RuntimeOuterClass.TableEntry;
 
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
@@ -109,7 +108,7 @@
     }
 
     /**
-     * Same as {@link #encode(Collection, PiPipeconf)} but encodes only one entry.
+     * Same as {@link #encode(List, PiPipeconf)} but encodes only one entry.
      *
      * @param piTableEntry table entry
      * @param pipeconf     pipeconf
@@ -162,7 +161,7 @@
     }
 
     /**
-     * Same as {@link #decode(Collection, PiPipeconf)} but decodes only one entry.
+     * Same as {@link #decode(List, PiPipeconf)} but decodes only one entry.
      *
      * @param tableEntryMsg table entry message
      * @param pipeconf      pipeconf
@@ -443,13 +442,13 @@
                 Action theAction = encodePiAction(piAction, browser);
                 tableActionMsgBuilder.setAction(theAction);
                 break;
-            case ACTION_GROUP_ID:
-                PiActionGroupId actionGroupId = (PiActionGroupId) piTableAction;
+            case ACTION_PROFILE_GROUP_ID:
+                PiActionProfileGroupId actionGroupId = (PiActionProfileGroupId) piTableAction;
                 tableActionMsgBuilder.setActionProfileGroupId(actionGroupId.id());
                 break;
-            case GROUP_MEMBER_ID:
-                PiActionGroupMemberId actionGroupMemberId = (PiActionGroupMemberId) piTableAction;
-                tableActionMsgBuilder.setActionProfileMemberId(actionGroupMemberId.id());
+            case ACTION_PROFILE_MEMBER_ID:
+                PiActionProfileMemberId actionProfileMemberId = (PiActionProfileMemberId) piTableAction;
+                tableActionMsgBuilder.setActionProfileMemberId(actionProfileMemberId.id());
                 break;
             default:
                 throw new EncodeException(
@@ -467,9 +466,9 @@
                 Action actionMsg = tableActionMsg.getAction();
                 return decodeActionMsg(actionMsg, browser);
             case ACTION_PROFILE_GROUP_ID:
-                return PiActionGroupId.of(tableActionMsg.getActionProfileGroupId());
+                return PiActionProfileGroupId.of(tableActionMsg.getActionProfileGroupId());
             case ACTION_PROFILE_MEMBER_ID:
-                return PiActionGroupMemberId.of(tableActionMsg.getActionProfileMemberId());
+                return PiActionProfileMemberId.of(tableActionMsg.getActionProfileMemberId());
             default:
                 throw new EncodeException(
                         format("Decoding of table action type %s not implemented", typeCase.name()));
@@ -524,4 +523,4 @@
     static PiCounterCellData decodeCounter(CounterData counterData) {
         return new PiCounterCellData(counterData.getPacketCount(), counterData.getByteCount());
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java b/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
index 301d5e1..b51a2c3 100644
--- a/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
+++ b/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
@@ -39,11 +39,11 @@
 import org.onosproject.net.pi.model.PiPipeconfId;
 import org.onosproject.net.pi.model.PiPipelineModel;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroup;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
-import org.onosproject.net.pi.runtime.PiActionGroupMember;
-import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroup;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
+import org.onosproject.net.pi.runtime.PiActionProfileMember;
+import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
 import org.onosproject.p4runtime.api.P4RuntimeClientKey;
 import p4.v1.P4RuntimeOuterClass.ActionProfileGroup;
 import p4.v1.P4RuntimeOuterClass.ActionProfileMember;
@@ -78,19 +78,19 @@
     private static final PiPipeconf PIPECONF = buildPipeconf();
     private static final int P4_INFO_ACT_PROF_ID = 285227860;
     private static final PiActionProfileId ACT_PROF_ID = PiActionProfileId.of("ecmp_selector");
-    private static final PiActionGroupId GROUP_ID = PiActionGroupId.of(1);
+    private static final PiActionProfileGroupId GROUP_ID = PiActionProfileGroupId.of(1);
     private static final int DEFAULT_MEMBER_WEIGHT = 1;
     private static final PiActionId EGRESS_PORT_ACTION_ID = PiActionId.of("set_egress_port");
     private static final PiActionParamId PORT_PARAM_ID = PiActionParamId.of("port");
     private static final int BASE_MEM_ID = 65535;
     private static final List<Integer> MEMBER_IDS = ImmutableList.of(65536, 65537, 65538);
-    private static final List<PiActionGroupMember> GROUP_MEMBERS =
+    private static final List<PiActionProfileMember> GROUP_MEMBERS =
             Lists.newArrayList(
                     outputMember((short) 1),
                     outputMember((short) 2),
                     outputMember((short) 3)
             );
-    private static final PiActionGroup GROUP = PiActionGroup.builder()
+    private static final PiActionProfileGroup GROUP = PiActionProfileGroup.builder()
             .withId(GROUP_ID)
             .addMembers(GROUP_MEMBERS)
             .withActionProfileId(ACT_PROF_ID)
@@ -110,17 +110,17 @@
     private static Server grpcServer;
     private static ManagedChannel grpcChannel;
 
-    private static PiActionGroupMember outputMember(short portNum) {
+    private static PiActionProfileMember outputMember(short portNum) {
         PiActionParam param = new PiActionParam(PORT_PARAM_ID,
                                                 ImmutableByteSequence.copyFrom(portNum));
         PiAction piAction = PiAction.builder()
                 .withId(EGRESS_PORT_ACTION_ID)
                 .withParameter(param).build();
 
-        return PiActionGroupMember.builder()
+        return PiActionProfileMember.builder()
                 .forActionProfile(ACT_PROF_ID)
                 .withAction(piAction)
-                .withId(PiActionGroupMemberId.of(BASE_MEM_ID + portNum))
+                .withId(PiActionProfileMemberId.of(BASE_MEM_ID + portNum))
                 .withWeight(DEFAULT_MEMBER_WEIGHT)
                 .build();
     }
@@ -161,9 +161,9 @@
     }
 
     @Test
-    public void testInsertPiActionGroup() throws Exception {
+    public void testInsertPiActionProfileGroup() throws Exception {
         CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
-        client.writeActionGroup(GROUP, INSERT, PIPECONF, 3);
+        client.writeActionProfileGroup(GROUP, INSERT, PIPECONF, 3);
         complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
         WriteRequest result = p4RuntimeServerImpl.getWriteReqs().get(0);
         assertEquals(1, result.getDeviceId());
@@ -192,7 +192,7 @@
     @Test
     public void testInsertPiActionMembers() throws Exception {
         CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
-        client.writeActionGroupMembers(GROUP_MEMBERS, INSERT, PIPECONF);
+        client.writeActionProfileMembers(GROUP_MEMBERS, INSERT, PIPECONF);
         complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
         WriteRequest result = p4RuntimeServerImpl.getWriteReqs().get(0);
         assertEquals(1, result.getDeviceId());
@@ -269,12 +269,13 @@
 
         p4RuntimeServerImpl.willReturnReadResult(responses);
         CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(2);
-        CompletableFuture<List<PiActionGroup>> groupsComplete = client.dumpGroups(ACT_PROF_ID, PIPECONF);
+        CompletableFuture<List<PiActionProfileGroup>> groupsComplete = client.dumpActionProfileGroups(
+                ACT_PROF_ID, PIPECONF);
         complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
 
-        Collection<PiActionGroup> groups = groupsComplete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
+        Collection<PiActionProfileGroup> groups = groupsComplete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
         assertEquals(1, groups.size());
-        PiActionGroup piActionGroup = groups.iterator().next();
+        PiActionProfileGroup piActionGroup = groups.iterator().next();
         assertEquals(ACT_PROF_ID, piActionGroup.actionProfileId());
         assertEquals(GROUP_ID, piActionGroup.id());
         assertEquals(3, piActionGroup.members().size());
diff --git a/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/TableEntryEncoderTest.java b/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/TableEntryEncoderTest.java
index d9e5f9a..278e050 100644
--- a/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/TableEntryEncoderTest.java
+++ b/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/TableEntryEncoderTest.java
@@ -30,8 +30,8 @@
 import org.onosproject.net.pi.model.PiPipelineModel;
 import org.onosproject.net.pi.model.PiTableId;
 import org.onosproject.net.pi.runtime.PiAction;
-import org.onosproject.net.pi.runtime.PiActionGroupId;
 import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
 import org.onosproject.net.pi.runtime.PiCounterCellData;
 import org.onosproject.net.pi.runtime.PiExactFieldMatch;
 import org.onosproject.net.pi.runtime.PiMatchKey;
@@ -140,7 +140,7 @@
             .withMatchKey(PiMatchKey.builder()
                                   .addFieldMatch(new PiExactFieldMatch(ecmpGroupFieldId, ofOnes(1)))
                                   .build())
-            .withAction(PiActionGroupId.of(1))
+            .withAction(PiActionProfileGroupId.of(1))
             .withPriority(1)
             .withCookie(2)
             .withCounterCellData(counterCellData)