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));
     }
 }
