diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiRegion.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiRegion.java
index ada4d15..0a2fa2f 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiRegion.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiRegion.java
@@ -123,7 +123,7 @@
      * @return true if root region
      */
     public boolean isRoot() {
-        return id().equals(parent);
+        return parent == null;
     }
 
     /**
@@ -181,7 +181,7 @@
      * @return the backing region instance
      */
     public Region backingRegion() {
-        return topology.services.region().getRegion(regionId);
+        return isRoot() ? null : topology.services.region().getRegion(regionId);
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/LayoutLocation.java b/core/api/src/main/java/org/onosproject/ui/topo/LayoutLocation.java
index 9e006b5..69be6aa 100644
--- a/core/api/src/main/java/org/onosproject/ui/topo/LayoutLocation.java
+++ b/core/api/src/main/java/org/onosproject/ui/topo/LayoutLocation.java
@@ -17,6 +17,12 @@
 
 package org.onosproject.ui.topo;
 
+import com.google.common.base.Strings;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -25,6 +31,14 @@
  */
 public final class LayoutLocation {
     private static final double ZERO_THRESHOLD = Double.MIN_VALUE * 2.0;
+    private static final String COMMA = ",";
+    private static final String TILDE = "~";
+    private static final String EMPTY = "";
+
+    private static final String E_BAD_COMPACT = "Badly formatted compact form: ";
+    private static final String E_EMPTY_ID = "id must be non-empty";
+    private static final String E_BAD_DOUBLE = "unparsable double";
+
 
     /**
      * Designates the type of location; either geographic or logical grid.
@@ -45,7 +59,6 @@
         this.locType = locType;
     }
 
-
     private boolean doubleIsZero(double value) {
         return value >= -ZERO_THRESHOLD && value <= ZERO_THRESHOLD;
     }
@@ -70,6 +83,16 @@
     }
 
     /**
+     * Returns the location type (geo or grid), which indicates how the data
+     * is to be interpreted.
+     *
+     * @return location type
+     */
+    public Type locType() {
+        return locType;
+    }
+
+    /**
      * Returns the latitude (geo) or y-coord (grid) data value.
      *
      * @return geo latitude or grid y-coord
@@ -87,27 +110,111 @@
         return longOrX;
     }
 
-    /**
-     * Returns the location type (geo or grid), which indicates how the data
-     * is to be interpreted.
-     *
-     * @return location type
-     */
-    public Type locType() {
-        return locType;
-    }
-
     @Override
     public String toString() {
         return toStringHelper(this)
                 .add("id", id)
+                .add("loc-type", locType)
                 .add("lat/Y", latOrY)
                 .add("long/X", longOrX)
-                .add("loc-type", locType)
                 .toString();
     }
 
     /**
+     * Produces a compact string representation of this instance.
+     *
+     * @return compact string rep
+     */
+    public String toCompactListString() {
+        return id + COMMA + locType + COMMA + latOrY + COMMA + longOrX;
+    }
+
+    /**
+     * Produces a layout location instance from a compact string representation.
+     *
+     * @param s the compact string
+     * @return a corresponding instance
+     */
+    public static LayoutLocation fromCompactString(String s) {
+        String[] tokens = s.split(COMMA);
+        if (tokens.length != 4) {
+            throw new IllegalArgumentException(E_BAD_COMPACT + s);
+        }
+        String id = tokens[0];
+        String type = tokens[1];
+        String latY = tokens[2];
+        String longX = tokens[3];
+
+        if (Strings.isNullOrEmpty(id)) {
+            throw new IllegalArgumentException(E_BAD_COMPACT + E_EMPTY_ID);
+        }
+
+        double latOrY;
+        double longOrX;
+        try {
+            latOrY = Double.parseDouble(latY);
+            longOrX = Double.parseDouble(longX);
+        } catch (NumberFormatException nfe) {
+            throw new IllegalArgumentException(E_BAD_COMPACT + E_BAD_DOUBLE);
+        }
+
+        return LayoutLocation.layoutLocation(id, type, latOrY, longOrX);
+    }
+
+    /**
+     * Produces a compact encoding of a list of layout locations.
+     *
+     * @param locs array of layout location instances
+     * @return string encoding
+     */
+    public static String toCompactListString(LayoutLocation... locs) {
+        if (locs == null || locs.length == 0) {
+            return EMPTY;
+        }
+        List<LayoutLocation> lls = Arrays.asList(locs);
+        return toCompactListString(lls);
+    }
+
+    /**
+     * Produces a compact encoding of a list of layout locations.
+     *
+     * @param locs list of layout location instances
+     * @return string encoding
+     */
+    public static String toCompactListString(List<LayoutLocation> locs) {
+        // note: locs may be empty
+        if (locs == null || locs.isEmpty()) {
+            return EMPTY;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (LayoutLocation ll : locs) {
+            sb.append(ll.toCompactListString()).append(TILDE);
+        }
+        final int len = sb.length();
+        sb.replace(len - 1, len, "");
+        return sb.toString();
+    }
+
+    /**
+     * Returns a list of layout locations from a compact string representation.
+     *
+     * @param compactList string representation
+     * @return corresponding list of layout locations
+     */
+    public static List<LayoutLocation> fromCompactListString(String compactList) {
+        List<LayoutLocation> locs = new ArrayList<>();
+        if (!Strings.isNullOrEmpty(compactList)) {
+            String[] items = compactList.split(TILDE);
+            for (String s : items) {
+                locs.add(fromCompactString(s));
+            }
+        }
+        return locs;
+    }
+
+
+    /**
      * Creates an instance of a layout location.
      *
      * @param id      an identifier for the item at this location
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/LayoutLocationTest.java b/core/api/src/test/java/org/onosproject/ui/topo/LayoutLocationTest.java
index 64908fd..cca430c 100644
--- a/core/api/src/test/java/org/onosproject/ui/topo/LayoutLocationTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/topo/LayoutLocationTest.java
@@ -20,9 +20,12 @@
 import org.junit.Test;
 import org.onosproject.ui.AbstractUiTest;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.google.common.collect.ImmutableList.of;
 import static org.junit.Assert.*;
-import static org.onosproject.ui.topo.LayoutLocation.Type;
-import static org.onosproject.ui.topo.LayoutLocation.layoutLocation;
+import static org.onosproject.ui.topo.LayoutLocation.*;
 
 /**
  * Unit tests for {@link LayoutLocation}.
@@ -30,11 +33,18 @@
 public class LayoutLocationTest extends AbstractUiTest {
 
     private static final String SOME_ID = "foo";
+    private static final String OTHER_ID = "bar";
     private static final double SQRT2 = 1.414;
     private static final double PI = 3.142;
     private static final double ZERO = 0.0;
 
+    private static final String COMPACT_LL_1 = "foo,GEO,3.142,1.414";
+    private static final String COMPACT_LL_2 = "bar,GRID,1.414,3.142";
+
+    private static final String COMPACT_LIST = COMPACT_LL_1 + "~" + COMPACT_LL_2;
+
     private LayoutLocation ll;
+    private LayoutLocation ll2;
 
     @Test
     public void basic() {
@@ -86,4 +96,121 @@
     public void nullId() {
         layoutLocation(null, Type.GRID, PI, PI);
     }
+
+    @Test
+    public void compactString() {
+        ll = layoutLocation(SOME_ID, Type.GEO, PI, SQRT2);
+        String s = ll.toCompactListString();
+        assertEquals("wrong compactness", COMPACT_LL_1, s);
+    }
+
+    @Test
+    public void fromCompactStringTest() {
+        ll = fromCompactString(COMPACT_LL_1);
+        verifyLL1(ll);
+    }
+
+    private void verifyLL1(LayoutLocation ll) {
+        assertEquals("LL1 bad id", SOME_ID, ll.id());
+        assertEquals("LL1 bad type", Type.GEO, ll.locType());
+        assertEquals("LL1 bad Y", PI, ll.latOrY(), TOLERANCE);
+        assertEquals("LL1 bad X", SQRT2, ll.longOrX(), TOLERANCE);
+    }
+
+    private void verifyLL2(LayoutLocation ll) {
+        assertEquals("LL1 bad id", OTHER_ID, ll.id());
+        assertEquals("LL1 bad type", Type.GRID, ll.locType());
+        assertEquals("LL1 bad Y", SQRT2, ll.latOrY(), TOLERANCE);
+        assertEquals("LL1 bad X", PI, ll.longOrX(), TOLERANCE);
+    }
+
+
+    @Test(expected = IllegalArgumentException.class)
+    public void badCompactTooShort() {
+        fromCompactString("one,two,three");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void badCompactTooLong() {
+        fromCompactString("one,two,three,4,5");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void badCompactNoId() {
+        fromCompactString(",GEO,1,2");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void badCompactUnparsableY() {
+        fromCompactString("foo,GEO,yyy,2.3");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void badCompactUnparsableX() {
+        fromCompactString("foo,GEO,0.2,xxx");
+    }
+
+    @Test
+    public void toCompactList() {
+        ll = layoutLocation(SOME_ID, Type.GEO, PI, SQRT2);
+        ll2 = layoutLocation(OTHER_ID, Type.GRID, SQRT2, PI);
+        String compact = toCompactListString(ll, ll2);
+        print(compact);
+        assertEquals("wrong list encoding", COMPACT_LIST, compact);
+    }
+
+    @Test
+    public void toCompactList2() {
+        ll = layoutLocation(SOME_ID, Type.GEO, PI, SQRT2);
+        ll2 = layoutLocation(OTHER_ID, Type.GRID, SQRT2, PI);
+        List<LayoutLocation> locs = of(ll, ll2);
+        String compact = toCompactListString(locs);
+        print(compact);
+        assertEquals("wrong list encoding", COMPACT_LIST, compact);
+    }
+
+    @Test
+    public void fromCompactList() {
+        List<LayoutLocation> locs = fromCompactListString(COMPACT_LIST);
+        ll = locs.get(0);
+        ll2 = locs.get(1);
+        verifyLL1(ll);
+        verifyLL2(ll2);
+    }
+
+    @Test
+    public void fromCompactListNull() {
+        List<LayoutLocation> locs = fromCompactListString(null);
+        assertEquals("non-empty list", 0, locs.size());
+    }
+
+    @Test
+    public void fromCompactListEmpty() {
+        List<LayoutLocation> locs = fromCompactListString("");
+        assertEquals("non-empty list", 0, locs.size());
+    }
+
+    @Test
+    public void toCompactListStringNullList() {
+        String s = toCompactListString((List<LayoutLocation>) null);
+        assertEquals("not empty string", "", s);
+    }
+
+    @Test
+    public void toCompactListStringNullArray() {
+        String s = toCompactListString((LayoutLocation[]) null);
+        assertEquals("not empty string", "", s);
+    }
+
+    @Test
+    public void toCompactListStringEmptyArray() {
+        String s = toCompactListString();
+        assertEquals("not empty string", "", s);
+    }
+
+    @Test
+    public void toCompactListStringEmptyList() {
+        String s = toCompactListString(new ArrayList<>());
+        assertEquals("not empty string", "", s);
+    }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
index ed26b41..a5cb416 100644
--- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
@@ -931,8 +931,7 @@
             }
         }
 
-        // checks if the specified device is allowed by the BasicDeviceConfig
-        // and if not, removes it
+        // removes the specified device if it exists
         private void kickOutBadDevice(DeviceId deviceId) {
             Device badDevice = getDevice(deviceId);
             if (badDevice != null) {
diff --git a/core/net/src/main/java/org/onosproject/net/region/impl/RegionManager.java b/core/net/src/main/java/org/onosproject/net/region/impl/RegionManager.java
index bf82842..f81493b 100644
--- a/core/net/src/main/java/org/onosproject/net/region/impl/RegionManager.java
+++ b/core/net/src/main/java/org/onosproject/net/region/impl/RegionManager.java
@@ -23,12 +23,15 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.util.ItemNotFoundException;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.net.Annotations;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.HostId;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.BasicElementConfig;
 import org.onosproject.net.config.basics.BasicRegionConfig;
@@ -40,6 +43,7 @@
 import org.onosproject.net.region.RegionService;
 import org.onosproject.net.region.RegionStore;
 import org.onosproject.net.region.RegionStoreDelegate;
+import org.onosproject.ui.topo.LayoutLocation;
 import org.slf4j.Logger;
 
 import java.util.Collection;
@@ -51,6 +55,7 @@
 import static com.google.common.collect.ImmutableList.of;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.REGION_READ;
+import static org.onosproject.ui.topo.LayoutLocation.toCompactListString;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -68,8 +73,13 @@
     private static final String DEVICE_IDS_EMPTY = "Device IDs cannot be empty";
     private static final String NAME_NULL = "Name cannot be null";
 
+    private static final String PEER_LOCATIONS = "peerLocations";
+
     private final Logger log = getLogger(getClass());
 
+    private final NetworkConfigListener networkConfigListener =
+            new InternalNetworkConfigListener();
+
     private RegionStoreDelegate delegate = this::post;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -82,12 +92,14 @@
     public void activate() {
         store.setDelegate(delegate);
         eventDispatcher.addSink(RegionEvent.class, listenerRegistry);
+        networkConfigService.addListener(networkConfigListener);
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate() {
         store.unsetDelegate(delegate);
+        networkConfigService.removeListener(networkConfigListener);
         eventDispatcher.removeSink(RegionEvent.class);
         log.info("Stopped");
     }
@@ -99,10 +111,13 @@
     private Annotations genAnnots(RegionId id) {
         BasicRegionConfig cfg =
                 networkConfigService.getConfig(id, BasicRegionConfig.class);
-
         if (cfg == null) {
             return DefaultAnnotations.builder().build();
         }
+        return genAnnots(cfg, id);
+    }
+
+    private Annotations genAnnots(BasicRegionConfig cfg, RegionId rid) {
 
         DefaultAnnotations.Builder builder = DefaultAnnotations.builder()
                 .set(BasicElementConfig.NAME, cfg.name())
@@ -115,6 +130,9 @@
             builder.set(BasicElementConfig.UI_TYPE, uiType);
         }
 
+        List<LayoutLocation> locMappings = cfg.getMappings();
+        builder.set(PEER_LOCATIONS, toCompactListString(locMappings));
+
         return builder.build();
     }
 
@@ -126,7 +144,7 @@
         checkNotNull(name, REGION_TYPE_NULL);
 
         return store.createRegion(regionId, name, type, genAnnots(regionId),
-                masterNodeIds == null ? of() : masterNodeIds);
+                                  masterNodeIds == null ? of() : masterNodeIds);
     }
 
     @Override
@@ -137,7 +155,7 @@
         checkNotNull(name, REGION_TYPE_NULL);
 
         return store.updateRegion(regionId, name, type, genAnnots(regionId),
-                masterNodeIds == null ? of() : masterNodeIds);
+                                  masterNodeIds == null ? of() : masterNodeIds);
     }
 
     @Override
@@ -197,4 +215,53 @@
         return ImmutableSet.of();
     }
 
+    // by default allowed, otherwise check flag
+    private boolean isAllowed(BasicRegionConfig cfg) {
+        return (cfg == null || cfg.isAllowed());
+    }
+
+    private class InternalNetworkConfigListener implements NetworkConfigListener {
+        @Override
+        public void event(NetworkConfigEvent event) {
+            RegionId rid = (RegionId) event.subject();
+            BasicRegionConfig cfg =
+                    networkConfigService.getConfig(rid, BasicRegionConfig.class);
+
+            if (!isAllowed(cfg)) {
+                kickOutBadRegion(rid);
+
+            } else {
+                // (1) Find the region
+                // (2) Syntehsize new region + cfg details
+                // (3) re-insert new region element into store
+
+                try {
+                    Region region = getRegion(rid);
+                    String name = region.name();
+                    Region.Type type = region.type();
+                    Annotations annots = genAnnots(cfg, rid);
+                    List<Set<NodeId>> masterNodeIds = region.masters();
+
+                    store.updateRegion(rid, name, type, annots, masterNodeIds);
+
+                } catch (ItemNotFoundException infe) {
+                    log.debug("warn: no region found with id {}", rid);
+                }
+            }
+        }
+
+        @Override
+        public boolean isRelevant(NetworkConfigEvent event) {
+            return (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED
+                    || event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)
+                    && (event.configClass().equals(BasicRegionConfig.class));
+        }
+
+        private void kickOutBadRegion(RegionId regionId) {
+            Region badRegion = getRegion(regionId);
+            if (badRegion != null) {
+                removeRegion(regionId);
+            }
+        }
+    }
 }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/region/impl/DistributedRegionStore.java b/core/store/dist/src/main/java/org/onosproject/store/region/impl/DistributedRegionStore.java
index e00af16..c8b5299 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/region/impl/DistributedRegionStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/region/impl/DistributedRegionStore.java
@@ -247,9 +247,12 @@
         @Override
         public void event(MapEvent<RegionId, Set<DeviceId>> event) {
             if (event.type() != MapEvent.Type.REMOVE) {
-                notifyDelegate(new RegionEvent(REGION_MEMBERSHIP_CHANGED,
-                        regionsById.get(event.key()),
-                        event.newValue().value()));
+                Region r = regionsById.get(event.key());
+                if (r != null) {
+                    notifyDelegate(new RegionEvent(REGION_MEMBERSHIP_CHANGED,
+                                                   r,
+                                                   event.newValue().value()));
+                }
             }
         }
     }
diff --git a/tools/test/topos/regions-europe.sh b/tools/test/topos/regions-europe.sh
index 8f4790a..58f2944 100755
--- a/tools/test/topos/regions-europe.sh
+++ b/tools/test/topos/regions-europe.sh
@@ -16,7 +16,7 @@
 
 
 ## unfortunately, it takes a time for the sim to start up
-#  this is not ideal...
+#  this is not ideal... but we'll live with it for now
 
 echo
 echo "Sleeping while sim starts up... (${sleepfor} seconds)..."
@@ -111,7 +111,6 @@
 null-create-link direct Leeds Warrington
 
 # -- UK Peers
-## TODO: figure out why this data isn't getting put into runtime config?!
 region-add-peer-loc rUK rES 50.4060  -3.3860
 region-add-peer-loc rUK rFR 50.4060  -1.8482
 region-add-peer-loc rUK rIT 50.4060  -0.1361
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 a2c13c5..5c9b608 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
@@ -20,6 +20,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.base.Strings;
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterService;
@@ -55,6 +56,7 @@
 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.topo.LayoutLocation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -72,6 +74,7 @@
 import static org.onosproject.net.AnnotationKeys.LATITUDE;
 import static org.onosproject.net.AnnotationKeys.LONGITUDE;
 import static org.onosproject.ui.model.topo.UiNode.LAYER_DEFAULT;
+import static org.onosproject.ui.topo.LayoutLocation.fromCompactListString;
 
 /**
  * Facility for creating JSON messages to send to the topology view in the
@@ -98,6 +101,7 @@
 
     private static final String GEO = "geo";
     private static final String GRID = "grid";
+    private static final String PEER_LOCATIONS = "peerLocations";
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -342,6 +346,10 @@
         payload.set("hosts", jsonGrouped(ridStr, splitHosts));
         payload.set("layerOrder", jsonStrings(layerTags));
 
+        if (!region.isRoot()) {
+            addPeerLocations(payload, region.backingRegion());
+        }
+
         return payload;
     }
 
@@ -497,6 +505,24 @@
         }
     }
 
+    private void addPeerLocations(ObjectNode node, Region r) {
+        String compact = r.annotations().value(PEER_LOCATIONS);
+        if (!Strings.isNullOrEmpty(compact)) {
+            List<LayoutLocation> locs = fromCompactListString(compact);
+
+            ObjectNode o = objectNode();
+            for (LayoutLocation ll : locs) {
+                ObjectNode lnode = objectNode()
+                    .put("locType", ll.locType().toString())
+                    .put("latOrY", ll.latOrY())
+                    .put("longOrX", ll.longOrX());
+                o.set(ll.id(), lnode);
+            }
+
+            node.set(PEER_LOCATIONS, o);
+        }
+    }
+
     private void addIps(ObjectNode node, Host h) {
         Set<IpAddress> ips = h.ipAddresses();
 
@@ -578,7 +604,7 @@
                 .put("nHosts", region.hostCount());
         // TODO: device and host counts should take into account any nested
         //       subregions. i.e. should be the sum of all devices/hosts in
-        //       all descendent subregions.
+        //       all descendant subregions.
 
         Region r = region.backingRegion();
         // this is location data, as injected via network configuration script
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoSession.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoSession.java
index 3f7f4dc..3a3f141 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoSession.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoSession.java
@@ -229,7 +229,7 @@
         // now add the devices that reside in the parent region
         if (!layout.isRoot()) {
             UiTopoLayout parentLayout = layoutService.getLayout(layout.parent());
-            getRegion(parentLayout).devices().forEach(peers::add);
+            peers.addAll(getRegion(parentLayout).devices());
         }
 
         // TODO: Finally, filter out regions / devices that are not connected
diff --git a/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/ModelCacheTest.java b/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/ModelCacheTest.java
index 606756b..8d7ada6 100644
--- a/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/ModelCacheTest.java
+++ b/web/gui/src/test/java/org/onosproject/ui/impl/topo/model/ModelCacheTest.java
@@ -25,23 +25,19 @@
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
 import org.onosproject.net.Link;
-import org.onosproject.net.region.Region;
-import org.onosproject.ui.model.topo.UiModelEvent.Type;
 import org.onosproject.ui.model.topo.UiClusterMember;
 import org.onosproject.ui.model.topo.UiDevice;
 import org.onosproject.ui.model.topo.UiDeviceLink;
 import org.onosproject.ui.model.topo.UiElement;
 import org.onosproject.ui.model.topo.UiHost;
 import org.onosproject.ui.model.topo.UiLinkId;
+import org.onosproject.ui.model.topo.UiModelEvent.Type;
 import org.onosproject.ui.model.topo.UiRegion;
 
 import java.util.Collection;
 import java.util.Iterator;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 import static org.onosproject.cluster.NodeId.nodeId;
 import static org.onosproject.net.PortNumber.portNumber;
 import static org.onosproject.ui.model.topo.UiLinkId.uiLinkId;
@@ -223,9 +219,6 @@
         assertEquals("wrong id", REGION_2.id(), region.id());
         assertEquals("unex # device IDs", 3, region.deviceIds().size());
         assertContains("missing ID", region.deviceIds(), DEVID_4, DEVID_5, DEVID_6);
-        Region r = region.backingRegion();
-        print(r);
-        assertEquals("wrong region name", "Region-R2", r.name());
     }
 
     private static final String[] LINKS_2_7 = {D2, "27", D7, "72"};
