diff --git a/core/api/src/main/java/org/onosproject/net/pi/model/DefaultPiPipeconf.java b/core/api/src/main/java/org/onosproject/net/pi/model/DefaultPiPipeconf.java
index 464bdd7..2041cdb 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/model/DefaultPiPipeconf.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/model/DefaultPiPipeconf.java
@@ -192,21 +192,25 @@
             Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours =
                     behaviourMapBuilder.build();
             return new DefaultPiPipeconf(
-                    id, pipelineModel, generateFingerprint(extensions.values()),
+                    id, pipelineModel, generateFingerprint(extensions),
                     behaviours, extensions);
         }
 
-        private long generateFingerprint(Collection<URL> extensions) {
+        private long generateFingerprint(Map<ExtensionType, URL> extensions) {
             Collection<Integer> hashes = new ArrayList<>();
-            for (URL extUrl : extensions) {
+            for (ExtensionType extensionType : ExtensionType.values()) {
                 try {
-                    HashingInputStream hin = new HashingInputStream(
-                            Hashing.crc32(), extUrl.openStream());
-                    //noinspection StatementWithEmptyBody
-                    while (hin.read() != -1) {
-                        // Do nothing. Reading all input stream to update hash.
+                    // Get the extension if present and then hash the content
+                    URL extUrl = extensions.get(extensionType);
+                    if (extUrl != null) {
+                        HashingInputStream hin = new HashingInputStream(
+                                Hashing.crc32(), extUrl.openStream());
+                        //noinspection StatementWithEmptyBody
+                        while (hin.read() != -1) {
+                            // Do nothing. Reading all input stream to update hash.
+                        }
+                        hashes.add(hin.hash().asInt());
                     }
-                    hashes.add(hin.hash().asInt());
                 } catch (IOException e) {
                     throw new IllegalArgumentException(e);
                 }
