diff --git a/src/main/java/org/opencord/sadis/SubscriberAndDeviceInformationAdapter.java b/src/main/java/org/opencord/sadis/SubscriberAndDeviceInformationAdapter.java
index c131704..56e60c5 100644
--- a/src/main/java/org/opencord/sadis/SubscriberAndDeviceInformationAdapter.java
+++ b/src/main/java/org/opencord/sadis/SubscriberAndDeviceInformationAdapter.java
@@ -17,14 +17,24 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Maps;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 
 public abstract class SubscriberAndDeviceInformationAdapter implements SubscriberAndDeviceInformationService {
+
+    private final Logger log = LoggerFactory.getLogger(this.getClass());
+
     private static final int DEFAULT_MAXIMUM_CACHE_SIZE = 0;
     private static final long DEFAULT_TTL = 0;
 
@@ -33,17 +43,46 @@
     private int maxiumCacheSize = DEFAULT_MAXIMUM_CACHE_SIZE;
     private long cacheEntryTtl = DEFAULT_TTL;
 
+    private Map<String, SubscriberAndDeviceInformation> localCfgData = null;
+
     public SubscriberAndDeviceInformationAdapter() {
         cache = CacheBuilder.newBuilder().maximumSize(maxiumCacheSize)
                 .expireAfterAccess(cacheEntryTtl, TimeUnit.SECONDS).build();
     }
 
-    public void configure(String url, int maximumCacheSeize, long cacheEntryTtl) {
+    /**
+     * Configures the Adapter for data source and cache parameters.
+     *
+     * @param cfg Configuration data.
+     */
+    public void configure(SadisConfig cfg) {
+        String url = null;
+        try {
+            // if the url is not present then assume data is in netcfg
+            if (cfg.getUrl() != null) {
+                url = cfg.getUrl().toString();
+            } else {
+                localCfgData = Maps.newConcurrentMap();
+
+                cfg.getEntries().forEach(entry -> {
+                    localCfgData.put(entry.id(), entry);
+                });
+                log.info("url is null, data source is local netcfg data");
+            }
+        } catch (MalformedURLException mUrlEx) {
+            log.error("Invalid URL specified: {}", mUrlEx);
+        }
+
+        int maximumCacheSeize = cfg.getCacheMaxSize();
+        long cacheEntryTtl = cfg.getCacheTtl().getSeconds();
+
         // Rebuild cache if needed
-        if (url != this.url || maximumCacheSeize != this.maxiumCacheSize || cacheEntryTtl != this.cacheEntryTtl) {
-            this.url = url;
+        if ((url != null && url != this.url) || maximumCacheSeize != this.maxiumCacheSize ||
+                cacheEntryTtl != this.cacheEntryTtl) {
             this.maxiumCacheSize = maximumCacheSeize;
             this.cacheEntryTtl = cacheEntryTtl;
+            this.url = url;
+
             Cache<String, SubscriberAndDeviceInformation> newCache = CacheBuilder.newBuilder()
                     .maximumSize(maxiumCacheSize).expireAfterAccess(cacheEntryTtl, TimeUnit.SECONDS).build();
             Cache<String, SubscriberAndDeviceInformation> oldCache = cache;
@@ -89,29 +128,35 @@
 
         /*
          * Not in cache, if we have a URL configured we can attempt to get it
-         * from there.
+         * from there, else check for it in the locally configured data
          */
         if (this.url == null) {
-            return null;
-        }
+            info = localCfgData.get(id);
 
-        // Augment URL with query parameters
-        StringBuilder buf = new StringBuilder(this.url);
-        if (buf.charAt(buf.length() - 1) != '/') {
-            buf.append('/');
-        }
+            if (info != null) {
+                local.put(id, info);
+                return info;
+            }
+        } else {
+            // Augment URL with query parameters
+            StringBuilder buf = new StringBuilder(this.url);
+            if (buf.charAt(buf.length() - 1) != '/') {
+                buf.append('/');
+            }
 
-        buf.append(id);
+            buf.append(id);
 
-        try (InputStream io = new URL(buf.toString()).openStream()) {
-            ObjectMapper mapper = new ObjectMapper();
-            info = mapper.readValue(io, SubscriberAndDeviceInformation.class);
-            local.put(id, info);
-            return info;
-        } catch (IOException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
+            try (InputStream io = new URL(buf.toString()).openStream()) {
+                ObjectMapper mapper = new ObjectMapper();
+                info = mapper.readValue(io, SubscriberAndDeviceInformation.class);
+                local.put(id, info);
+                return info;
+            } catch (IOException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
         }
+        log.error("Data not found for id {}", id);
         return null;
     }
 }
