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)
