diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
index 93c4472..7638f64 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
@@ -21,11 +21,8 @@
 import org.onosproject.net.PortNumber;
 
 import java.util.Arrays;
-import java.util.Objects;
 
 import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
 
 /**
  * Represents identifier of resource.
@@ -33,18 +30,16 @@
  */
 @Beta
 public abstract class ResourceId {
-    static final ResourceId ROOT = new DiscreteResourceId();
+    static final DiscreteResourceId ROOT = new DiscreteResourceId();
 
-    final ImmutableList<Object> components;
-
-    static ResourceId discrete(DeviceId device, Object... components) {
+    static DiscreteResourceId discrete(DeviceId device, Object... components) {
         return new DiscreteResourceId(ImmutableList.builder()
                 .add(device)
                 .add(components)
                 .build());
     }
 
-    static ResourceId discrete(DeviceId device, PortNumber port, Object... components) {
+    static DiscreteResourceId discrete(DeviceId device, PortNumber port, Object... components) {
         return new DiscreteResourceId(ImmutableList.builder()
                 .add(device)
                 .add(port)
@@ -52,92 +47,41 @@
                 .build());
     }
 
-    static ResourceId continuous(DeviceId device, Object... components) {
+    static ContinuousResourceId continuous(DeviceId device, Object... components) {
         Object last = components[components.length - 1];
         checkArgument(last instanceof Class<?>);
 
-        return continuous(ImmutableList.builder()
+        return new ContinuousResourceId(ImmutableList.builder()
                 .add(device)
                 .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last);
     }
 
-    static ResourceId continuous(DeviceId device, PortNumber port, Object... components) {
+    static ContinuousResourceId continuous(DeviceId device, PortNumber port, Object... components) {
         Object last = components[components.length - 1];
         checkArgument(last instanceof Class<?>);
 
-        return continuous(ImmutableList.builder()
+        return new ContinuousResourceId(ImmutableList.builder()
                 .add(device)
                 .add(port)
                 .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last);
     }
 
-    private static ResourceId continuous(ImmutableList.Builder<Object> parentComponents, Class<?> last) {
-        return new ContinuousResourceId(parentComponents
-                .add(last.getCanonicalName())
-                .build(), last.getSimpleName());
-    }
-
-    protected ResourceId(ImmutableList<Object> components) {
-        this.components = checkNotNull(components);
-    }
-
-    // for serializer
-    protected ResourceId() {
-        this.components = ImmutableList.of();
-    }
-
-    // IndexOutOfBoundsException is raised when the instance is equal to ROOT
-    ResourceId parent() {
-        if (components.size() == 1) {
-            return ROOT;
-        } else {
-            return new DiscreteResourceId(components.subList(0, components.size() - 1));
-        }
-    }
+    abstract DiscreteResourceId parent();
 
     /**
      * Returns a resource ID of a child of this resource based on the specified object.
-     * If the argument is an instance of {@link Class}, this method returns an instance of
-     * {@link ContinuousResourceId}. Otherwise, it returns an instance of {@link DiscreteResourceId}
-     * This method only work when the receiver is {@link DiscreteResourceId}. Otherwise,
-     * this method throws an exception.
+     * If the given object is a {@link Class} instance, {@link IllegalArgumentException} is thrown.
      *
      * @param child the last component of the child
      * @return a child resource ID
      */
-    public ResourceId child(Object child) {
-        checkState(this instanceof DiscreteResourceId);
+    public abstract DiscreteResourceId child(Object child);
 
-        if (child instanceof Class<?>) {
-            return continuous(ImmutableList.builder().addAll(components), (Class<?>) child);
-        } else {
-            return new DiscreteResourceId(ImmutableList.builder()
-                    .addAll(components)
-                    .add(child)
-                    .build());
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return components.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final ResourceId other = (ResourceId) obj;
-        return Objects.equals(this.components, other.components);
-    }
-
-    @Override
-    public String toString() {
-        return components.toString();
-    }
-
+    /**
+     * Returns a resource ID of a child of this resource based on the specified object.
+     *
+     * @param child the last component of the child
+     * @return a child resource ID
+     */
+    public abstract ContinuousResourceId child(Class<?> child);
 }
