diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
index e133775..b407171 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
@@ -210,21 +210,20 @@
      *
      * @param layout the layout to transform
      * @param crumbs list of layouts in bread-crumb order
-     * @param rid    current region id
      * @return a JSON representation of the data
      */
-    ObjectNode layout(UiTopoLayout layout, List<UiTopoLayout> crumbs, String rid) {
+    ObjectNode layout(UiTopoLayout layout, List<UiTopoLayout> crumbs) {
         ObjectNode result = objectNode()
                 .put("id", layout.id().toString())
                 .put("parent", nullIsEmpty(layout.parent()))
                 .put("region", nullIsEmpty(layout.regionId()))
                 .put("regionName", UiRegion.safeName(layout.region()));
         addCrumbs(result, crumbs);
-        addBgRef(result, layout, rid);
+        addBgRef(result, layout);
         return result;
     }
 
-    private void addBgRef(ObjectNode result, UiTopoLayout layout, String rid) {
+    private void addBgRef(ObjectNode result, UiTopoLayout layout) {
         String mapId = layout.geomap();
         String sprId = layout.sprites();
 
@@ -235,10 +234,10 @@
             result.put("bgType", GRID).put("bgId", sprId);
         }
 
-        attachZoomData(result, layout, rid);
+        attachZoomData(result, layout);
     }
 
-    private void attachZoomData(ObjectNode result, UiTopoLayout layout, String rid) {
+    private void attachZoomData(ObjectNode result, UiTopoLayout layout) {
 
         ObjectNode zoomData = objectNode();
 
@@ -246,6 +245,7 @@
         addCfgZoomData(zoomData, layout);
 
         // next, retrieve user-set zoom data, if we have it
+        String rid = layout.regionId().toString();
         ObjectNode userZoom = metaUi.get(contextKey(rid, ZOOM_KEY));
         if (userZoom != null) {
             zoomData.set("usr", userZoom);
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java
index e5946f9..3c93110 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java
@@ -19,7 +19,6 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
 import org.onlab.osgi.ServiceDirectory;
-import org.onosproject.net.region.Region;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiConnection;
 import org.onosproject.ui.UiMessageHandler;
@@ -95,14 +94,9 @@
 
     // ==================================================================
 
-    private String currentRegionId() {
-        Region current = topoSession.currentLayout().region();
-        return current == null ? "(root)" : current.id().toString();
-    }
-
     private ObjectNode mkLayoutMessage(UiTopoLayout currentLayout) {
         List<UiTopoLayout> crumbs = topoSession.breadCrumbs();
-        return t2json.layout(currentLayout, crumbs, currentRegionId());
+        return t2json.layout(currentLayout, crumbs);
     }
 
     private ObjectNode mkRegionMessage(UiTopoLayout currentLayout) {
@@ -115,7 +109,8 @@
     private ObjectNode mkPeersMessage(UiTopoLayout currentLayout) {
         Set<UiNode> peers = topoSession.getPeerNodes(currentLayout);
         ObjectNode peersPayload = objectNode();
-        peersPayload.set("peers", t2json.closedNodes(currentRegionId(), peers));
+        String rid = currentLayout.regionId().toString();
+        peersPayload.set("peers", t2json.closedNodes(rid, peers));
         return peersPayload;
     }
 
@@ -211,7 +206,8 @@
         public void process(ObjectNode payload) {
             // NOTE: metadata for a node is stored within the context of the
             //       current region.
-            t2json.updateMeta(currentRegionId(), payload);
+            String rid = topoSession.currentLayout().regionId().toString();
+            t2json.updateMeta(rid, payload);
         }
     }
 
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2Background.js b/web/gui/src/main/webapp/app/view/topo2/topo2Background.js
index 29c6a93..525cd07 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2Background.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Background.js
@@ -70,7 +70,8 @@
                         this.zoomData = data.bgZoom;
 
                         var _this = this,
-                            pan = zoomPan(this.zoomData);
+                            pan = zoomPan(this.zoomData),
+                            scale = zoomScale(this.zoomData);
 
                         if (this.bgType === 'geo') {
 
@@ -78,12 +79,12 @@
                             t2sls.hide();
                             t2ms.show();
 
-                            t2ms.setUpMap(data.bgId, data.bgFilePath, zoomScale(data.bgZoom))
+                            t2ms.setUpMap(data.bgId, data.bgFilePath, scale)
                             .then(function (proj) {
                                 t2mcs.projection(proj);
                                 $log.debug('** We installed the projection:', proj);
                                 _this.region.loaded('bgRendered', true);
-                                t2zs.panAndZoom(pan, zoomScale(_this.zoomData), 1000);
+                                t2zs.panAndZoom(pan, scale, 1000);
                             });
                         } else if (this.bgType === 'grid') {
 
@@ -94,7 +95,7 @@
                             t2sls.loadLayout(data.bgId).then(function (spriteLayout) {
                                 _this.background.layout = spriteLayout;
                                 _this.region.loaded('bgRendered', true);
-                                t2zs.panAndZoom(pan, zoomScale(_this.zoomData), 1000);
+                                t2zs.panAndZoom(pan, scale, 1000);
                             });
                         } else {
                             // No background type - Tell the region the background is ready for placing nodes
@@ -112,7 +113,6 @@
                     }
                 });
 
-
                 return instance || new BackgroundView();
             }
         ]);
