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 a50401b..e133775 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
@@ -55,7 +55,6 @@
 import org.onosproject.ui.model.topo.UiRegion;
 import org.onosproject.ui.model.topo.UiSynthLink;
 import org.onosproject.ui.model.topo.UiTopoLayout;
-import org.onosproject.ui.model.topo.UiTopoLayoutId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,6 +86,7 @@
 
     private static final String CONTEXT_KEY_DELIM = "_";
     private static final String NO_CONTEXT = "";
+    private static final String ZOOM_KEY = "layoutZoom";
 
     private static final String REGION = "region";
     private static final String DEVICE = "device";
@@ -98,12 +98,6 @@
 
     private static final String GEO = "geo";
     private static final String GRID = "grid";
-    private static final String PKEY_TOPO_ZOOM = "topo2_zoom";
-    private static final String ZOOM_SCALE = "zoomScale";
-    private static final String ZOOM_PAN_X = "zoomPanX";
-    private static final String ZOOM_PAN_Y = "zoomPanY";
-    private static final String DEFAULT_SCALE = "1.0";
-    private static final String DEFAULT_PAN = "0.0";
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -216,20 +210,21 @@
      *
      * @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) {
+    ObjectNode layout(UiTopoLayout layout, List<UiTopoLayout> crumbs, String rid) {
         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);
+        addBgRef(result, layout, rid);
         return result;
     }
 
-    private void addBgRef(ObjectNode result, UiTopoLayout layout) {
+    private void addBgRef(ObjectNode result, UiTopoLayout layout, String rid) {
         String mapId = layout.geomap();
         String sprId = layout.sprites();
 
@@ -239,51 +234,31 @@
         } else if (sprId != null) {
             result.put("bgType", GRID).put("bgId", sprId);
         }
-        addZoomPan(result, layout.id());
+
+        attachZoomData(result, layout, rid);
     }
 
-    private ObjectNode initialZoomForLayout(ObjectNode zoomPrefs, String id) {
-        ObjectNode zoomForLayout = defaultZoomForLayout();
-        zoomPrefs.set(id, zoomForLayout);
-        prefService.setPreference(userName, PKEY_TOPO_ZOOM, zoomPrefs);
-        return zoomPrefs;
-    }
+    private void attachZoomData(ObjectNode result, UiTopoLayout layout, String rid) {
 
-    private ObjectNode defaultZoomForLayout() {
-        return objectNode()
-            .put(ZOOM_SCALE, DEFAULT_SCALE)
-            .put(ZOOM_PAN_X, DEFAULT_PAN)
-            .put(ZOOM_PAN_Y, DEFAULT_PAN);
-    }
+        ObjectNode zoomData = objectNode();
 
-    private void addZoomPan(ObjectNode result, UiTopoLayoutId layoutId) {
-        // need to look up topo_zoom settings from preferences service.
+        // first, set configured scale and offset
+        addCfgZoomData(zoomData, layout);
 
-        // NOTE:
-        // UiPreferencesService API only allows us to retrieve ALL prefs for
-        // the given user. It would be better if we could call something like:
-        //
-        //   ObjectNode value = prefService.getPreference(userName, prefKey);
-        //
-        // to get back a single value.
-
-        Map<String, ObjectNode> userPrefs = prefService.getPreferences(userName);
-        ObjectNode zoomPrefs = userPrefs.get(PKEY_TOPO_ZOOM);
-
-        if (zoomPrefs == null) {
-            zoomPrefs = initialZoomForLayout(objectNode(), layoutId.id());
+        // next, retrieve user-set zoom data, if we have it
+        ObjectNode userZoom = metaUi.get(contextKey(rid, ZOOM_KEY));
+        if (userZoom != null) {
+            zoomData.set("usr", userZoom);
         }
+        result.set("bgZoom", zoomData);
+    }
 
-        ObjectNode zoomData = (ObjectNode) zoomPrefs.get(layoutId.id());
-
-        if (zoomData == null) {
-            zoomPrefs = initialZoomForLayout(zoomPrefs, layoutId.id());
-            zoomData = (ObjectNode) zoomPrefs.get(layoutId.id());
-        }
-
-        result.put("bgZoomScale", zoomData.get(ZOOM_SCALE).asText());
-        result.put("bgZoomPanX", zoomData.get(ZOOM_PAN_X).asText());
-        result.put("bgZoomPanY", zoomData.get(ZOOM_PAN_Y).asText());
+    private void addCfgZoomData(ObjectNode data, UiTopoLayout layout) {
+        ObjectNode zoom = objectNode();
+        zoom.put("scale", layout.scale());
+        zoom.put("offsetX", layout.offsetX());
+        zoom.put("offsetY", layout.offsetY());
+        data.set("cfg", zoom);
     }
 
     private void addMapParameters(ObjectNode result, String mapId) {
@@ -623,7 +598,7 @@
      * being displayed in.
      *
      * @param ridStr region-id string
-     * @param nodes the nodes
+     * @param nodes  the nodes
      * @return a JSON representation of the nodes
      */
     public ArrayNode closedNodes(String ridStr, Set<UiNode> nodes) {
@@ -640,51 +615,6 @@
         return array;
     }
 
-    // TODO: These methods do not seem to be used; consider removing them.
-    /*
-     * Returns a JSON array representation of a list of regions. Note that the
-     * information about each region is limited to what needs to be used to
-     * show the regions as nodes on the view.
-     *
-     * @param regions the regions
-     * @return a JSON representation of the minimal region information
-     */
-//    public ArrayNode closedRegions(Set<UiRegion> regions) {
-//        ArrayNode array = arrayNode();
-//        for (UiRegion r : regions) {
-//            array.add(jsonClosedRegion(r));
-//        }
-//        return array;
-//    }
-
-    /*
-     * Returns a JSON array representation of a list of devices.
-     *
-     * @param devices the devices
-     * @return a JSON representation of the devices
-     */
-//    public ArrayNode devices(Set<UiDevice> devices) {
-//        ArrayNode array = arrayNode();
-//        for (UiDevice device : devices) {
-//            array.add(json(device));
-//        }
-//        return array;
-//    }
-
-    /*
-     * Returns a JSON array representation of a list of hosts.
-     *
-     * @param hosts the hosts
-     * @return a JSON representation of the hosts
-     */
-//    public ArrayNode hosts(Set<UiHost> hosts) {
-//        ArrayNode array = arrayNode();
-//        for (UiHost host : hosts) {
-//            array.add(json(host));
-//        }
-//        return array;
-//    }
-
     // package-private for unit testing
     List<Set<UiNode>> splitByLayer(List<String> layerTags,
                                    Set<? extends UiNode> nodes) {
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 801a970d..e5946f9 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
@@ -95,14 +95,14 @@
 
     // ==================================================================
 
-    private String safeId(Region r) {
-        return r == null ? "(root)" : r.id().toString();
+    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);
+        return t2json.layout(currentLayout, crumbs, currentRegionId());
     }
 
     private ObjectNode mkRegionMessage(UiTopoLayout currentLayout) {
@@ -114,9 +114,8 @@
 
     private ObjectNode mkPeersMessage(UiTopoLayout currentLayout) {
         Set<UiNode> peers = topoSession.getPeerNodes(currentLayout);
-        String ridStr = safeId(topoSession.currentLayout().region());
         ObjectNode peersPayload = objectNode();
-        peersPayload.set("peers", t2json.closedNodes(ridStr, peers));
+        peersPayload.set("peers", t2json.closedNodes(currentRegionId(), peers));
         return peersPayload;
     }
 
@@ -212,8 +211,7 @@
         public void process(ObjectNode payload) {
             // NOTE: metadata for a node is stored within the context of the
             //       current region.
-            String ridStr = safeId(topoSession.currentLayout().region());
-            t2json.updateMeta(ridStr, payload);
+            t2json.updateMeta(currentRegionId(), payload);
         }
     }
 
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2.js b/web/gui/src/main/webapp/app/view/topo2/topo2.js
index 77d0e0c3..775228c 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2.js
@@ -24,7 +24,7 @@
     'use strict';
 
     // references to injected services
-    var $scope, $log, fs, mast, ks,
+    var $scope, $log, fs, mast, ks, wss,
         gs, sus, ps, t2es, t2fs, t2is, t2bcs, t2kcs, t2ms, t2mcs, t2zs;
 
     // DOM elements
@@ -65,15 +65,21 @@
     function zoomCallback() {
         var sc = zoomer.scale(),
             tr = zoomer.translate(),
-            sparse = {};
+            metaUi = isNaN(sc) ? {
+                useCfg: 1
+            } : {
+                scale: sc,
+                offsetX: tr[0],
+                offsetY: tr[1]
+            };
 
-        sparse[currentLayoutId] =  {
-            zoomScale: sc,
-            zoomPanX: tr[0],
-            zoomPanY: tr[1]
-        };
+        // Note: Meta data stored in the context of the current layout,
+        //       automatically, by the server
 
-        ps.mergePrefs('topo2_zoom', sparse);
+        wss.sendEvent('updateMeta2', {
+            id: 'layoutZoom',
+            memento: metaUi
+        });
     }
 
     function setUpZoom() {
@@ -128,6 +134,7 @@
             fs = _fs_;
             mast = _mast_;
             ks = _ks_;
+            wss = _wss_;
             gs = _gs_;
             sus = _sus_;
             ps = _ps_;
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 8fa9822..29c6a93 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2Background.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2Background.js
@@ -25,6 +25,24 @@
 
     var instance;
 
+    function getZoom(z) {
+        var u = z.usr,
+            c = z.cfg;
+        return (u && !u.useCfg) ? u : c;
+    }
+
+    // returns the pan (offset) values as an array [x, y]
+    function zoomPan(z) {
+        var zoom = getZoom(z);
+        return [zoom.offsetX, zoom.offsetY];
+    }
+
+    // returns the scale value
+    function zoomScale(z) {
+        var zoom = getZoom(z);
+        return zoom.scale;
+    }
+
     angular.module('ovTopo2')
         .factory('Topo2BackgroundService', [
             '$log', 'Topo2ViewController', 'Topo2SpriteLayerService', 'Topo2MapService',
@@ -49,9 +67,10 @@
 
                         this.background = data;
                         this.bgType = data.bgType;
+                        this.zoomData = data.bgZoom;
 
                         var _this = this,
-                            pan = [this.background.bgZoomPanX, this.background.bgZoomPanY];
+                            pan = zoomPan(this.zoomData);
 
                         if (this.bgType === 'geo') {
 
@@ -59,16 +78,12 @@
                             t2sls.hide();
                             t2ms.show();
 
-                            t2ms.setUpMap(data.bgId, data.bgFilePath, data.bgZoomScale)
+                            t2ms.setUpMap(data.bgId, data.bgFilePath, zoomScale(data.bgZoom))
                             .then(function (proj) {
-                                // var z = ps.getPrefs('topo2_zoom', { tx: 0, ty: 0, sc: 1 });
-                                // zoomer.panZoom([z.tx, z.ty], z.sc);
-
                                 t2mcs.projection(proj);
-                                // $log.debug('** Zoom restored:', z);
                                 $log.debug('** We installed the projection:', proj);
                                 _this.region.loaded('bgRendered', true);
-                                t2zs.panAndZoom(pan, _this.background.bgZoomScale, 1000);
+                                t2zs.panAndZoom(pan, zoomScale(_this.zoomData), 1000);
                             });
                         } else if (this.bgType === 'grid') {
 
@@ -79,7 +94,7 @@
                             t2sls.loadLayout(data.bgId).then(function (spriteLayout) {
                                 _this.background.layout = spriteLayout;
                                 _this.region.loaded('bgRendered', true);
-                                t2zs.panAndZoom(pan, _this.background.bgZoomScale, 1000);
+                                t2zs.panAndZoom(pan, zoomScale(_this.zoomData), 1000);
                             });
                         } else {
                             // No background type - Tell the region the background is ready for placing nodes
@@ -98,7 +113,7 @@
                 });
 
 
-                return instance || new BackgroundView();;
+                return instance || new BackgroundView();
             }
         ]);
 })();
\ No newline at end of file
