diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/ConsistentResourceStore.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/ConsistentResourceStore.java
index 3aa07f4..f343994 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/ConsistentResourceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/ConsistentResourceStore.java
@@ -76,6 +76,7 @@
             .register(new EncodableDiscreteResourcesSerializer(), EncodableDiscreteResources.class)
             .register(GenericDiscreteResources.class)
             .register(EmptyDiscreteResources.class)
+            .register(new EncodedResourcesSerializer(), EncodedDiscreteResources.class)
             .register(ContinuousResourceAllocation.class)
             .build());
 
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
index a20ca52..7eaedc1 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
@@ -19,7 +19,6 @@
 import org.onosproject.net.resource.DiscreteResource;
 import org.onosproject.net.resource.DiscreteResourceCodec;
 import org.onosproject.net.resource.DiscreteResourceId;
-import org.onosproject.net.resource.DiscreteResourceSet;
 import org.onosproject.net.resource.Resources;
 
 import java.util.LinkedHashMap;
@@ -36,7 +35,7 @@
 final class EncodableDiscreteResources implements DiscreteResources {
     private static final Codecs CODECS = Codecs.getInstance();
     private final DiscreteResource parent;
-    private final Map<Class<?>, DiscreteResourceSet> values;
+    private final Map<Class<?>, EncodedDiscreteResources> values;
 
     private static Class<?> getClass(DiscreteResource resource) {
         return resource.valueAs(Object.class).map(Object::getClass).get();
@@ -55,16 +54,16 @@
         Map<Class<?>, Set<DiscreteResource>> grouped = resources.stream()
                 .collect(Collectors.groupingBy(x -> getClass(x), Collectors.toCollection(LinkedHashSet::new)));
 
-        Map<Class<?>, DiscreteResourceSet> values = new LinkedHashMap<>();
+        Map<Class<?>, EncodedDiscreteResources> values = new LinkedHashMap<>();
         for (Map.Entry<Class<?>, Set<DiscreteResource>> entry : grouped.entrySet()) {
             DiscreteResourceCodec<?> codec = CODECS.getCodec(entry.getKey());
-            values.put(entry.getKey(), DiscreteResourceSet.of(entry.getValue(), codec));
+            values.put(entry.getKey(), EncodedDiscreteResources.of(entry.getValue(), codec));
         }
 
         return new EncodableDiscreteResources(parent, values);
     }
 
-    private EncodableDiscreteResources(DiscreteResource parent, Map<Class<?>, DiscreteResourceSet> values) {
+    private EncodableDiscreteResources(DiscreteResource parent, Map<Class<?>, EncodedDiscreteResources> values) {
         this.parent = parent;
         this.values = values;
     }
@@ -93,10 +92,8 @@
 
     @Override
     public boolean isEmpty() {
-        return !values.values().stream()
-                .flatMap(x -> x.values().stream())
-                .findAny()
-                .isPresent();
+        return values.values().stream()
+                .allMatch(x -> x.isEmpty());
     }
 
     @Override
@@ -120,7 +117,7 @@
     @Override
     public Set<DiscreteResource> values() {
         return values.values().stream()
-                .flatMap(x -> x.values().stream())
+                .flatMap(x -> x.resources(parent.id()).stream())
                 .collect(Collectors.toCollection(LinkedHashSet::new));
     }
 
@@ -128,7 +125,7 @@
         return parent;
     }
 
-    Map<Class<?>, DiscreteResourceSet> rawValues() {
+    Map<Class<?>, EncodedDiscreteResources> rawValues() {
         return values;
     }
 }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
index 4681f5a..6f65392 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
@@ -20,7 +20,6 @@
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 import org.onosproject.net.resource.DiscreteResource;
-import org.onosproject.net.resource.DiscreteResourceSet;
 
 import java.util.LinkedHashSet;
 import java.util.Set;
@@ -40,11 +39,11 @@
     public EncodableDiscreteResources read(Kryo kryo, Input input, Class<EncodableDiscreteResources> cls) {
         DiscreteResource parent = kryo.readObject(input, DiscreteResource.class);
         @SuppressWarnings("unchecked")
-        Set<DiscreteResourceSet> resources = kryo.readObject(input, LinkedHashSet.class);
+        Set<EncodedDiscreteResources> resources = kryo.readObject(input, LinkedHashSet.class);
 
         return EncodableDiscreteResources.of(parent,
                 resources.stream()
-                        .flatMap(x -> x.values().stream())
+                        .flatMap(x -> x.resources(parent.id()).stream())
                         .collect(Collectors.toCollection(LinkedHashSet::new)));
     }
 }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
new file mode 100644
index 0000000..c79b23a
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2016-present 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.
+ * 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.store.resource.impl;
+
+import org.onlab.util.Tools;
+import org.onosproject.net.resource.DiscreteResource;
+import org.onosproject.net.resource.DiscreteResourceCodec;
+import org.onosproject.net.resource.DiscreteResourceId;
+import org.onosproject.net.resource.Resources;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Represents discrete resources encoded by a codec.
+ */
+final class EncodedDiscreteResources {
+    private final Set<Integer> rawValues;
+    private final DiscreteResourceCodec codec;
+
+    EncodedDiscreteResources(Set<Integer> rawValues, DiscreteResourceCodec codec) {
+        this.rawValues = rawValues;
+        this.codec = codec;
+    }
+
+    static EncodedDiscreteResources of(Set<DiscreteResource> resources, DiscreteResourceCodec codec) {
+        Set<Integer> rawValues = resources.stream()
+                .map(x -> x.valueAs(Object.class))
+                .flatMap(Tools::stream)
+                .map(x -> codec.encode(x))
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+
+        return new EncodedDiscreteResources(rawValues, codec);
+    }
+
+    Set<Integer> rawValues() {
+        return rawValues;
+    }
+
+    DiscreteResourceCodec codec() {
+        return codec;
+    }
+
+    Set<DiscreteResource> resources(DiscreteResourceId parent) {
+        return rawValues.stream()
+                .map(x -> codec.decode(x))
+                .map(x -> Resources.discrete(parent, x).resource())
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+    }
+
+    @SuppressWarnings("unchecked")
+    boolean contains(DiscreteResource resource) {
+        return rawValues.contains(codec.encode(resource));
+    }
+
+    boolean isEmpty() {
+        return rawValues.isEmpty();
+    }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedResourcesSerializer.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedResourcesSerializer.java
new file mode 100644
index 0000000..587fb4c
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedResourcesSerializer.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2016-present 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.
+ * 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.store.resource.impl;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import com.google.common.collect.DiscreteDomain;
+import com.google.common.collect.Range;
+import com.google.common.collect.TreeRangeSet;
+import org.onlab.util.ClosedOpenRange;
+import org.onosproject.net.resource.DiscreteResourceCodec;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+/**
+ * Kryo Serializer for {@link EncodedDiscreteResources}.
+ */
+final class EncodedResourcesSerializer extends Serializer<EncodedDiscreteResources> {
+    @Override
+    public void write(Kryo kryo, Output output, EncodedDiscreteResources object) {
+        TreeRangeSet<Integer> rangeSet = TreeRangeSet.create();
+        object.rawValues().stream()
+                .map(Range::singleton)
+                .map(x -> x.canonical(DiscreteDomain.integers()))
+                .forEach(rangeSet::add);
+        List<ClosedOpenRange> ranges = rangeSet.asRanges().stream()
+                .map(ClosedOpenRange::of)
+                .collect(Collectors.toList());
+        kryo.writeObject(output, ranges);
+        kryo.writeClassAndObject(output, object.codec());
+    }
+
+    @Override
+    public EncodedDiscreteResources read(Kryo kryo, Input input, Class<EncodedDiscreteResources> cls) {
+        @SuppressWarnings("unchecked")
+        List<ClosedOpenRange> ranges = kryo.readObject(input, ArrayList.class);
+        DiscreteResourceCodec codec = (DiscreteResourceCodec) kryo.readClassAndObject(input);
+
+        HashSet<Integer> rawValues = ranges.stream()
+                .flatMapToInt(x -> IntStream.range(x.lowerBound(), x.upperBound()))
+                .boxed()
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+        return new EncodedDiscreteResources(rawValues, codec);
+    }
+}
