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