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> {
 }
