diff --git a/core/api/src/main/java/org/onosproject/cluster/Partition.java b/core/api/src/main/java/org/onosproject/cluster/Partition.java
index 1eca4ae..e3a1352 100644
--- a/core/api/src/main/java/org/onosproject/cluster/Partition.java
+++ b/core/api/src/main/java/org/onosproject/cluster/Partition.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2016 Open Networking Laboratory
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,77 +15,23 @@
  */
 package org.onosproject.cluster;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Set;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-
-import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
- * A data partition.
- * <p>
- * Partition represents a slice of the data space and is made up of a collection
- * of {@link org.onosproject.cluster.ControllerNode nodes}
- * that all maintain copies of this data.
+ * A partition or shard is a group of controller nodes that are work together to maintain state.
+ * A ONOS cluster is typically made of of one or partitions over which the the data is partitioned.
  */
-public class Partition {
-
-    private final String name;
-    private final Set<NodeId> members;
-
-    private Partition() {
-        name = null;
-        members = null;
-    }
-
-    public Partition(String name, Collection<NodeId> members) {
-        this.name = checkNotNull(name);
-        this.members = ImmutableSet.copyOf(checkNotNull(members));
-    }
+public interface Partition {
 
     /**
-     * Returns the partition name.
-     * <p>
-     * Each partition is identified by a unique name.
-     * @return partition name
+     * Returns the partition identifier.
+     * @return partition identifier
      */
-    public String getName() {
-        return this.name;
-    }
+    PartitionId getId();
 
     /**
-     * Returns the collection of controller node identifiers that make up this partition.
+     * Returns the controller nodes that are members of this partition.
      * @return collection of controller node identifiers
      */
-    public Collection<NodeId> getMembers() {
-        return this.members;
-    }
-
-    @Override
-    public int hashCode() {
-        return Arrays.deepHashCode(new Object[] {name, members});
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) {
-            return true;
-        }
-
-        if (other == null || !Partition.class.isInstance(other)) {
-            return false;
-        }
-
-        Partition that = (Partition) other;
-
-        if (!this.name.equals(that.name) || (this.members == null && that.members != null)
-                || (this.members != null && that.members == null) || this.members.size() != that.members.size()) {
-            return false;
-        }
-
-        return Sets.symmetricDifference(this.members, that.members).isEmpty();
-    }
-}
\ No newline at end of file
+    Collection<NodeId> getMembers();
+}
