http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java 
b/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java
index 9d82704..d9eefe0 100644
--- a/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java
+++ b/core/src/main/java/org/apache/brooklyn/core/location/AbstractLocation.java
@@ -35,7 +35,6 @@ import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ExecutionContext;
 import org.apache.brooklyn.api.mgmt.SubscriptionContext;
 import org.apache.brooklyn.api.mgmt.SubscriptionHandle;
-import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.LocationMemento;
 import org.apache.brooklyn.api.objs.BrooklynObject;
@@ -44,7 +43,6 @@ import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
-import org.apache.brooklyn.config.ConfigMap;
 import org.apache.brooklyn.core.BrooklynFeatureEnablement;
 import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.config.ConfigConstraints;
@@ -70,7 +68,6 @@ import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.flags.FlagUtils;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.stream.Streams;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -227,8 +224,8 @@ public abstract class AbstractLocation extends 
AbstractBrooklynObject implements
             }
 
             configMap = new LocationConfigMap(this, 
managementContext.getStorage().<ConfigKey<?>,Object>getMap(getId()+"-config"));
-            if (oldConfig.size() > 0) {
-                configMap.setLocalConfig(oldConfig.getLocalConfig());
+            if (!oldConfig.isEmpty()) {
+                configMap.setLocalConfig(oldConfig.getAllConfigLocalRaw());
             }
         }
     }
@@ -245,7 +242,7 @@ public abstract class AbstractLocation extends 
AbstractBrooklynObject implements
         
         boolean firstTime = !configured.getAndSet(true);
             
-        config().set(properties);
+        config().putAll(properties);
         
         if (properties.containsKey(PARENT_LOCATION.getName())) {
             // need to ensure parent's list of children is also updated
@@ -420,7 +417,7 @@ public abstract class AbstractLocation extends 
AbstractBrooklynObject implements
         }
 
         @Override
-        protected AbstractConfigMapImpl getConfigsInternal() {
+        protected AbstractConfigMapImpl<Location> getConfigsInternal() {
             return configMap;
         }
         
@@ -499,7 +496,7 @@ public abstract class AbstractLocation extends 
AbstractBrooklynObject implements
     @Override
     @Deprecated
     public boolean hasConfig(ConfigKey<?> key, boolean includeInherited) {
-        return config().getInternalConfigMap().getConfigRaw(key, 
includeInherited).isPresent();
+        return 
config().getInternalConfigMap().getConfigInheritedRaw(key).getWithoutError().asMaybe().isPresent();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
 
b/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
index 537d616..850f3d5 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/location/BasicLocationRegistry.java
@@ -40,7 +40,7 @@ import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.api.typereg.RegisteredType;
-import org.apache.brooklyn.config.ConfigMap;
+import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.core.config.ConfigPredicates;
 import org.apache.brooklyn.core.config.ConfigUtils;
 import org.apache.brooklyn.core.location.internal.LocationInternal;
@@ -274,7 +274,7 @@ public class BasicLocationRegistry implements 
LocationRegistry {
             // we need ability/format for persisting named locations, and 
better support for adding+saving via REST/GUI)
             int count = 0; 
             String NAMED_LOCATION_PREFIX = "brooklyn.location.named.";
-            ConfigMap namedLocationProps = 
mgmt.getConfig().submap(ConfigPredicates.nameStartsWith(NAMED_LOCATION_PREFIX));
+            StringConfigMap namedLocationProps = 
mgmt.getConfig().submap(ConfigPredicates.nameStartsWith(NAMED_LOCATION_PREFIX));
             for (String k: namedLocationProps.asMapWithStringKeys().keySet()) {
                 String name = k.substring(NAMED_LOCATION_PREFIX.length());
                 // If has a dot, then is a sub-property of a named location 
(e.g. brooklyn.location.named.prod1.user=bob)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationConfigMap.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationConfigMap.java
 
b/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationConfigMap.java
index e820f0d..076443a 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationConfigMap.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/location/internal/LocationConfigMap.java
@@ -18,25 +18,18 @@
  */
 package org.apache.brooklyn.core.location.internal;
 
-import static org.apache.brooklyn.util.groovy.GroovyJavaMethods.elvis;
-
 import java.util.Map;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.mgmt.ExecutionContext;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
-import org.apache.brooklyn.config.ConfigInheritance;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigMap;
-import org.apache.brooklyn.config.ConfigValueAtContainer;
-import org.apache.brooklyn.core.config.BasicConfigInheritance;
-import 
org.apache.brooklyn.core.config.BasicConfigInheritance.AncestorContainerAndKeyValueIterator;
-import org.apache.brooklyn.core.config.ConfigKeys.InheritanceContext;
 import org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl;
 import org.apache.brooklyn.core.location.AbstractLocation;
-import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
-import org.apache.brooklyn.util.core.internal.ConfigKeySelfExtracting;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,8 +37,9 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 
-public class LocationConfigMap extends AbstractConfigMapImpl {
+public class LocationConfigMap extends AbstractConfigMapImpl<Location> {
 
+    @SuppressWarnings("unused")
     private static final Logger log = 
LoggerFactory.getLogger(LocationConfigMap.class);
     
     public LocationConfigMap(AbstractLocation loc) {
@@ -56,61 +50,6 @@ public class LocationConfigMap extends AbstractConfigMapImpl 
{
         super(loc, storage);
     }
 
-    protected AbstractLocation getLocation() {
-        return (AbstractLocation) getBrooklynObject();
-    }
-    
-    @Override
-    protected BrooklynObjectInternal getParent() {
-        return (BrooklynObjectInternal) getLocation().getParent();
-    }
-    
-    @Override
-    protected <T> Maybe<T> getConfigImpl(final ConfigKey<T> key) {
-        Function<Location, ConfigKey<T>> keyFn = new Function<Location, 
ConfigKey<T>>() {
-            @SuppressWarnings("unchecked")
-            @Override
-            public ConfigKey<T> apply(Location input) {
-                if (input instanceof AbstractLocation) {
-                    return (ConfigKey<T>) elvis( 
((AbstractLocation)input).getLocationTypeInternal().getConfigKey(key.getName()),
 key );
-                }
-                return key;
-            }
-        };
-        
-        // In case this entity class has overridden the given key (e.g. to set 
default), then retrieve this entity's key
-        ConfigKey<T> ownKey = keyFn.apply(getLocation());
-        if (ownKey==null) ownKey = key;
-        
-        LocalEvaluateKeyValue<Location,T> evalFn = new 
LocalEvaluateKeyValue<Location,T>(ownKey);
-
-        if (ownKey instanceof ConfigKeySelfExtracting) {
-            Maybe<T> ownExplicitValue = evalFn.apply(getLocation());
-            
-            AncestorContainerAndKeyValueIterator<Location, T> ckvi = new 
AncestorContainerAndKeyValueIterator<Location,T>(
-                getLocation(), keyFn, evalFn, new 
Function<Location,Location>() {
-                    @Override
-                    public Location apply(Location input) {
-                        if (input==null) return null;
-                        return input.getParent();
-                    }
-                });
-            
-            ConfigValueAtContainer<Location,T> result = 
getDefaultRuntimeInheritance().resolveInheriting(ownKey,
-                ownExplicitValue, getLocation(),
-                ckvi, InheritanceContext.RUNTIME_MANAGEMENT);
-        
-            return result.asMaybe();
-        } else {
-            log.warn("Config key {} of {} is not a ConfigKeySelfExtracting; 
cannot retrieve value; returning default", ownKey, getBrooklynObject());
-            return Maybe.absent();
-        }
-    }
-    
-    private ConfigInheritance getDefaultRuntimeInheritance() {
-        return BasicConfigInheritance.OVERWRITE; 
-    }
-
     @Override
     protected ExecutionContext getExecutionContext(BrooklynObject bo) {
         if (bo==null) return null;
@@ -128,18 +67,33 @@ public class LocationConfigMap extends 
AbstractConfigMapImpl {
     }
 
     @Override
-    public ConfigMap submap(Predicate<ConfigKey<?>> filter) {
+    public LocationConfigMap submap(Predicate<ConfigKey<?>> filter) {
         throw new UnsupportedOperationException("Location does not support 
submap");
     }
 
     @Override
     protected Object coerceConfigVal(ConfigKey<?> key, Object v) {
         if ((Class.class.isAssignableFrom(key.getType()) || 
Function.class.isAssignableFrom(key.getType())) && v instanceof String) {
-            // strings can be written where classes/functions are permitted; 
this is a common pattern when configuring locations
-            // (bit sloppy to allow this; tests catch it, eg ImageChooser in 
jclouds)
+            // strings can be written where classes/functions are permitted; 
+            // this because an occasional pattern only for locations because 
validation wasn't enforced there
+            // (and locations do a lot more config in brooklyn.properties) - 
eg ImageChooser in jclouds
+            // TODO slowly warn on this then phase it out
             return v;
         }
         
         return super.coerceConfigVal(key, v);
     }
+
+    @Override
+    protected Location getParentOfContainer(Location container) {
+        if (container==null) return null;
+        return container.getParent();
+    }
+
+    @Override @Nullable protected <T> ConfigKey<?> 
getKeyAtContainerImpl(@Nonnull Location container, ConfigKey<T> queryKey) {
+        return 
((AbstractLocation)container).getLocationTypeInternal().getConfigKey(queryKey.getName());
+    }
+    
 }
+
+

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/PerUserEntitlementManager.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/PerUserEntitlementManager.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/PerUserEntitlementManager.java
index 5452060..61d26d4 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/PerUserEntitlementManager.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/PerUserEntitlementManager.java
@@ -19,6 +19,7 @@
 package org.apache.brooklyn.core.mgmt.entitlement;
 
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.brooklyn.api.mgmt.entitlement.EntitlementClass;
 import org.apache.brooklyn.api.mgmt.entitlement.EntitlementContext;
@@ -64,11 +65,11 @@ public class PerUserEntitlementManager implements 
EntitlementManager {
     public PerUserEntitlementManager(BrooklynProperties properties) {
         this(load(properties, properties.getConfig(DEFAULT_MANAGER)));
         
-        BrooklynProperties users = 
properties.submap(ConfigPredicates.nameStartsWith(PER_USER_ENTITLEMENTS_CONFIG_PREFIX+"."));
-        for (Map.Entry<ConfigKey<?>,?> key: users.getAllConfig().entrySet()) {
-            if (key.getKey().getName().equals(DEFAULT_MANAGER.getName())) 
continue;
-            String user = Strings.removeFromStart(key.getKey().getName(), 
PER_USER_ENTITLEMENTS_CONFIG_PREFIX+".");
-            addUser(user, load(properties, Strings.toString(key.getValue())));
+        Set<ConfigKey<?>> users = 
properties.findKeys(ConfigPredicates.nameStartsWith(PER_USER_ENTITLEMENTS_CONFIG_PREFIX+"."));
+        for (ConfigKey<?> key: users) {
+            if (key.getName().equals(DEFAULT_MANAGER.getName())) continue;
+            String user = Strings.removeFromStart(key.getName(), 
PER_USER_ENTITLEMENTS_CONFIG_PREFIX+".");
+            addUser(user, load(properties, 
Strings.toString(properties.getConfig(key))));
         }
         
         log.info(getClass().getSimpleName()+" created with 
"+perUserManagers.size()+" user"+Strings.s(perUserManagers)+" and "

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
index ac67f22..1a388d5 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
@@ -88,7 +88,7 @@ public class BasicExternalConfigSupplierRegistry implements 
ExternalConfigSuppli
         //     brooklyn.external.<name>.<key> : <value>
 
         String EXTERNAL_PROVIDER_PREFIX = "brooklyn.external.";
-        Map<String, Object> externalProviderProperties = 
mgmt.getConfig().submap(ConfigPredicates.startingWith(EXTERNAL_PROVIDER_PREFIX)).asMapWithStringKeys();
+        Map<String, Object> externalProviderProperties = 
mgmt.getConfig().submap(ConfigPredicates.nameStartsWith(EXTERNAL_PROVIDER_PREFIX)).asMapWithStringKeys();
         ClassLoader classloader = mgmt.getCatalogClassLoader();
         List<Exception> exceptions = new LinkedList<Exception>();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
index 2495557..69f2423 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
@@ -143,7 +143,7 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
     }
 
     @Override
-    public Map<ConfigKey<?>, Object> getAllConfig() {
+    public Map<ConfigKey<?>,Object> getAllConfigLocalRaw() {
         Map<ConfigKey<?>, Object> raw = delegate.getAllConfig();
         Map<ConfigKey<?>, Object> result = Maps.newLinkedHashMap();
         for (Map.Entry<ConfigKey<?>, Object> entry : raw.entrySet()) {
@@ -152,6 +152,11 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
         return result;
     }
 
+    @Override @Deprecated
+    public Map<ConfigKey<?>, Object> getAllConfig() {
+        return getAllConfigLocalRaw();
+    }
+
     @Override
     public Map<String, Object> asMapWithStringKeys() {
         Map<ConfigKey<?>, Object> raw = delegate.getAllConfig();
@@ -197,6 +202,10 @@ public class DeferredBrooklynProperties implements 
BrooklynProperties {
         BrooklynProperties submap = delegate.submap(filter);
         return new DeferredBrooklynProperties(submap, mgmt);
     }
+    @Override
+    public Set<ConfigKey<?>> findKeys(Predicate<ConfigKey<?>> filter) {
+        return delegate.findKeys(filter);
+    }
 
     @Override
     public BrooklynProperties addEnvironmentVars() {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java
index c576663..370173f 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java
@@ -114,7 +114,7 @@ public class BasicEntityRebindSupport extends 
AbstractBrooklynObjectRebindSuppor
             }
         }
         
-        ((EntityInternal)entity).config().set(memento.getConfigUnmatched());
+        ((EntityInternal)entity).config().putAll(memento.getConfigUnmatched());
         ((EntityInternal)entity).config().refreshInheritedConfig();
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicLocationRebindSupport.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicLocationRebindSupport.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicLocationRebindSupport.java
index 5273c65..99f5a24 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicLocationRebindSupport.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicLocationRebindSupport.java
@@ -70,7 +70,7 @@ public class BasicLocationRebindSupport extends 
AbstractBrooklynObjectRebindSupp
         // Note that the flags have been set in the constructor
         // Sept 2016 - now ignores unused and config description
         
-        location.config().set(memento.getLocationConfig());
+        location.config().putAll(memento.getLocationConfig());
 
         for (Map.Entry<String, Object> entry : 
memento.getLocationConfig().entrySet()) {
             String flagName = entry.getKey();
@@ -90,7 +90,7 @@ public class BasicLocationRebindSupport extends 
AbstractBrooklynObjectRebindSupp
                 } else {
                     value = TypeCoercions.coerce(entry.getValue(), fieldType);
                     if (value != null) {
-                        location.config().set(MutableMap.of(flagName, value));
+                        location.config().putAll(MutableMap.of(flagName, 
value));
                         FlagUtils.setFieldFromFlag(location, flagName, value);
                     }
                 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
index a13dc91..33d38a1 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
@@ -329,7 +329,7 @@ public class MementosGenerators {
         // current code will lose the ConfigKey type on rebind for anything 
not defined on class.
         // Whereas entities support that.
         // TODO Do we need the "nonPersistableFlagNames" that locations use?
-        Map<ConfigKey<?>, Object> config = 
((AbstractPolicy)policy).getConfigMap().getAllConfig();
+        Map<ConfigKey<?>, Object> config = 
((AbstractPolicy)policy).config().getInternalConfigMap().getAllConfigLocalRaw();
         for (Map.Entry<ConfigKey<?>, Object> entry : config.entrySet()) {
             ConfigKey<?> key = checkNotNull(entry.getKey(), "config=%s", 
config);
             Object value = configValueToPersistable(entry.getValue(), policy, 
key.getName());
@@ -372,7 +372,7 @@ public class MementosGenerators {
         // current code will lose the ConfigKey type on rebind for anything 
not defined on class.
         // Whereas entities support that.
         // TODO Do we need the "nonPersistableFlagNames" that locations use?
-        Map<ConfigKey<?>, Object> config = 
((AbstractEnricher)enricher).getConfigMap().getAllConfig();
+        Map<ConfigKey<?>, Object> config = 
((AbstractEnricher)enricher).config().getInternalConfigMap().getAllConfigLocalRaw();
         for (Map.Entry<ConfigKey<?>, Object> entry : config.entrySet()) {
             ConfigKey<?> key = checkNotNull(entry.getKey(), "config=%s", 
config);
             Object value = configValueToPersistable(entry.getValue(), 
enricher, key.getName());
@@ -402,7 +402,7 @@ public class MementosGenerators {
         // current code will lose the ConfigKey type on rebind for anything 
not defined on class.
         // Whereas entities support that.
         // TODO Do we need the "nonPersistableFlagNames" that locations use?
-        Map<ConfigKey<?>, Object> config = 
((AbstractFeed)feed).getConfigMap().getAllConfig();
+        Map<ConfigKey<?>, Object> config = 
((AbstractFeed)feed).config().getInternalConfigMap().getAllConfigLocalRaw();
         for (Map.Entry<ConfigKey<?>, Object> entry : config.entrySet()) {
             ConfigKey<?> key = checkNotNull(entry.getKey(), "config=%s", 
config);
             Object value = configValueToPersistable(entry.getValue(), feed, 
key.getName());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/objs/AbstractConfigurationSupportInternal.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractConfigurationSupportInternal.java
 
b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractConfigurationSupportInternal.java
index c1b1942..402abb8 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractConfigurationSupportInternal.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractConfigurationSupportInternal.java
@@ -20,6 +20,7 @@
 package org.apache.brooklyn.core.objs;
 
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
@@ -31,7 +32,7 @@ import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
-import org.apache.brooklyn.config.ConfigMap;
+import org.apache.brooklyn.config.ConfigMap.ConfigMapWithInheritance;
 import org.apache.brooklyn.core.config.MapConfigKey;
 import org.apache.brooklyn.core.config.StructuredConfigKey;
 import org.apache.brooklyn.core.config.SubElementConfigKey;
@@ -48,6 +49,8 @@ import org.apache.brooklyn.util.guava.Maybe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Predicate;
+
 public abstract class AbstractConfigurationSupportInternal implements 
BrooklynObjectInternal.ConfigurationSupportInternal {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(AbstractConfigurationSupportInternal.class);
@@ -155,7 +158,7 @@ public abstract class AbstractConfigurationSupportInternal 
implements BrooklynOb
         return set(key.getConfigKey(), val);
     }
 
-    protected abstract AbstractConfigMapImpl getConfigsInternal();
+    protected abstract AbstractConfigMapImpl<? extends BrooklynObject> 
getConfigsInternal();
     protected abstract <T> void assertValid(ConfigKey<T> key, T val);
     protected abstract BrooklynObject getContainer();
     protected abstract <T> void onConfigChanging(ConfigKey<T> key, Object val);
@@ -187,32 +190,38 @@ public abstract class 
AbstractConfigurationSupportInternal implements BrooklynOb
 
     @Override
     public ConfigBag getLocalBag() {
-        return getConfigsInternal().getLocalConfigBag();
+        return 
ConfigBag.newInstance(getConfigsInternal().getAllConfigLocalRaw());
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public Maybe<Object> getRaw(ConfigKey<?> key) {
-        return getConfigsInternal().getConfigRaw(key, true);
+        return (Maybe<Object>) 
getConfigsInternal().getConfigInheritedRaw(key).getWithoutError().asMaybe();
     }
 
     @Override
     public Maybe<Object> getLocalRaw(ConfigKey<?> key) {
-        return getConfigsInternal().getConfigRaw(key, false);
+        return getConfigsInternal().getConfigLocalRaw(key);
     }
 
     @Override
+    public void putAll(Map<?, ?> vals) {
+        getConfigsInternal().putAll(vals);
+    }
+    
+    @Override @Deprecated
     public void set(Map<?, ?> vals) {
-        getConfigsInternal().addToLocalBag(vals);
+        putAll(vals);
     }
 
     @Override
     public void removeKey(String key) {
-        getConfigsInternal().removeFromLocalBag(key);
+        getConfigsInternal().removeKey(key);
     }
     
     @Override
     public void removeKey(ConfigKey<?> key) {
-        getConfigsInternal().removeFromLocalBag(key);
+        getConfigsInternal().removeKey(key);
     }
     
     @Override
@@ -221,7 +230,12 @@ public abstract class AbstractConfigurationSupportInternal 
implements BrooklynOb
     }
     
     @Override
-    public ConfigMap getInternalConfigMap() {
+    public Set<ConfigKey<?>> findKeys(Predicate<ConfigKey<?>> filter) {
+        return getConfigsInternal().findKeys(filter);
+    }
+    
+    @Override
+    public ConfigMapWithInheritance<? extends BrooklynObject> 
getInternalConfigMap() {
         return getConfigsInternal();
     }
 
@@ -229,8 +243,9 @@ public abstract class AbstractConfigurationSupportInternal 
implements BrooklynOb
         return getConfigsInternal().getAllConfigLocalRaw();
     }
     
+    @SuppressWarnings("deprecation")
     @Override
-    // TODO deprecate because key inheritance not respected
+    // see super; we aspire to depreate this due to poor treatment of 
inheritance
     public ConfigBag getBag() {
         return getConfigsInternal().getAllConfigBag();
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java 
b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
index c231157..5b1dc88 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
@@ -40,7 +40,6 @@ import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigMap;
 import org.apache.brooklyn.core.config.ConfigConstraints;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl;
@@ -311,7 +310,7 @@ public abstract class AbstractEntityAdjunct extends 
AbstractBrooklynObject imple
         }
         
         @Override
-        protected AbstractConfigMapImpl getConfigsInternal() {
+        protected AbstractConfigMapImpl<?> getConfigsInternal() {
             return configsInternal;
         }
 
@@ -344,14 +343,6 @@ public abstract class AbstractEntityAdjunct extends 
AbstractBrooklynObject imple
         return config().set(key, val);
     }
     
-    // TODO make immutable
-    /** for inspection only */
-    @Beta
-    @Deprecated
-    public ConfigMap getConfigMap() {
-        return configsInternal;
-    }
-    
     /**
      * Invoked whenever a config change is applied after management is started.
      * Default implementation throws an exception to disallow the change. 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/objs/AdjunctConfigMap.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/objs/AdjunctConfigMap.java 
b/core/src/main/java/org/apache/brooklyn/core/objs/AdjunctConfigMap.java
index 6494600..fc13cd8 100644
--- a/core/src/main/java/org/apache/brooklyn/core/objs/AdjunctConfigMap.java
+++ b/core/src/main/java/org/apache/brooklyn/core/objs/AdjunctConfigMap.java
@@ -18,18 +18,15 @@
  */
 package org.apache.brooklyn.core.objs;
 
-import static org.apache.brooklyn.util.groovy.GroovyJavaMethods.elvis;
-
 import java.util.Map;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.ExecutionContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.objs.EntityAdjunct;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.internal.AbstractConfigMapImpl;
 import org.apache.brooklyn.core.entity.EntityInternal;
-import org.apache.brooklyn.util.core.flags.TypeCoercions;
-import org.apache.brooklyn.util.core.internal.ConfigKeySelfExtracting;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,8 +34,9 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 
-public class AdjunctConfigMap extends AbstractConfigMapImpl {
+public class AdjunctConfigMap extends AbstractConfigMapImpl<EntityAdjunct> {
 
+    @SuppressWarnings("unused")
     private static final Logger LOG = 
LoggerFactory.getLogger(AdjunctConfigMap.class);
 
     public AdjunctConfigMap(AbstractEntityAdjunct adjunct) {
@@ -49,29 +47,20 @@ public class AdjunctConfigMap extends AbstractConfigMapImpl 
{
      * @deprecated since 0.10.0 kept for serialization */ @Deprecated
     private AbstractEntityAdjunct adjunct;
     @Override
-    public BrooklynObjectInternal getBrooklynObject() {
-        BrooklynObjectInternal result = super.getBrooklynObject();
+    public EntityAdjunct getContainer() {
+        EntityAdjunct result = super.getContainer();
         if (result!=null) return result;
 
         synchronized (this) {
-            result = super.getBrooklynObject();
+            result = super.getContainer();
             if (result!=null) return result;
             bo = adjunct;
             adjunct = null;
         }
-        return super.getBrooklynObject();
-    }
-
-    protected AbstractEntityAdjunct getAdjunct() {
-        return (AbstractEntityAdjunct) getBrooklynObject();
+        return super.getContainer();
     }
 
     @Override
-    protected BrooklynObjectInternal getParent() {
-        return null;
-    }
-    
-    @Override
     protected void postLocalEvaluate(ConfigKey<?> key, BrooklynObject bo, 
Maybe<?> rawValue, Maybe<?> resolvedValue) { /* noop */ }
 
     @Override
@@ -84,31 +73,23 @@ public class AdjunctConfigMap extends AbstractConfigMapImpl 
{
         return (entity != null) ? 
((EntityInternal)entity).getExecutionContext() : null;
     }
     
-    protected <T> Maybe<T> getConfigImpl(ConfigKey<T> key) {
-        // tasks won't resolve if we aren't yet connected to an entity
-        
-        // no need for inheritance, so much simpler than other impls
-        
-        @SuppressWarnings("unchecked")
-        ConfigKey<T> ownKey = getAdjunct()!=null ? 
(ConfigKey<T>)elvis(getAdjunct().getAdjunctType().getConfigKey(key.getName()), 
key) : key;
-        
-        if (ownKey instanceof ConfigKeySelfExtracting) {
-            if (((ConfigKeySelfExtracting<T>)ownKey).isSet(ownConfig)) {
-                return Maybe.ofAllowingNull( 
((ConfigKeySelfExtracting<T>)ownKey).extractValue(ownConfig, 
getExecutionContext(getAdjunct())) );
-            }
-        } else {
-            LOG.warn("Config key {} of {} is not a ConfigKeySelfExtracting; 
cannot retrieve value; returning default", ownKey, this);
-        }
-        return Maybe.ofAllowingNull( 
TypeCoercions.coerce(ownKey.getDefaultValue(), key.getTypeToken()) );
-    }
-    
     @Override
     public AdjunctConfigMap submap(Predicate<ConfigKey<?>> filter) {
-        AdjunctConfigMap m = new AdjunctConfigMap(getAdjunct());
+        AdjunctConfigMap m = new 
AdjunctConfigMap((AbstractEntityAdjunct)getContainer());
         for (Map.Entry<ConfigKey<?>,Object> entry: ownConfig.entrySet())
             if (filter.apply(entry.getKey()))
                 m.ownConfig.put(entry.getKey(), entry.getValue());
         return m;
     }
 
+    @Override
+    protected EntityAdjunct getParentOfContainer(EntityAdjunct container) {
+        return null;
+    }
+
+    @Override
+    protected <T> ConfigKey<?> getKeyAtContainerImpl(EntityAdjunct container, 
ConfigKey<T> queryKey) {
+        return 
((AbstractEntityAdjunct)container).getAdjunctType().getConfigKey(queryKey.getName());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/objs/BasicConfigurableObject.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/objs/BasicConfigurableObject.java 
b/core/src/main/java/org/apache/brooklyn/core/objs/BasicConfigurableObject.java
index d199608..d3e29b6 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/objs/BasicConfigurableObject.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/objs/BasicConfigurableObject.java
@@ -18,19 +18,25 @@
  */
 package org.apache.brooklyn.core.objs;
 
+import java.util.Set;
+
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.objs.Configurable;
 import org.apache.brooklyn.api.objs.Identifiable;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigMap;
 import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
+import org.apache.brooklyn.config.ConfigMap;
 import org.apache.brooklyn.core.mgmt.HasBrooklynManagementContext;
 import org.apache.brooklyn.core.mgmt.ManagementContextInjectable;
+import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.apache.brooklyn.util.text.Identifiers;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
 /**
  * A parent class for ancilliary objects that do not require the full heavy 
lifting of {@link AbstractBrooklynObject}
  * or similar, but wish to use {@link ConfigKey} and {@link Configurable} in 
their construction, via the
@@ -115,5 +121,10 @@ public class BasicConfigurableObject implements 
Configurable, Identifiable, Mana
         public <T> T set(HasConfigKey<T> key, Task<T> val) {
             return set(key.getConfigKey(), val);
         }
+        
+        @Override
+        public Set<ConfigKey<?>> findKeys(Predicate<ConfigKey<?>> predicate) {
+            return 
MutableSet.copyOf(Iterables.filter(config.getAllConfigAsConfigKeyMap().keySet(),
 predicate));
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java 
b/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java
index 7a46cfe..1c76f6d 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/objs/BrooklynObjectInternal.java
@@ -26,7 +26,7 @@ import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.objs.Configurable;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
-import org.apache.brooklyn.config.ConfigMap;
+import org.apache.brooklyn.config.ConfigMap.ConfigMapWithInheritance;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.guava.Maybe;
 
@@ -64,7 +64,7 @@ public interface BrooklynObjectInternal extends 
BrooklynObject, Rebindable {
          * and callers should be advised this beta method may be removed. 
          */
         @Beta
-        // TODO deprecate
+        // TODO deprecate. used fairly extensively, mostly in tests. a bit 
more care will be needed to refactor.
         ConfigBag getBag();
 
         /**
@@ -72,7 +72,7 @@ public interface BrooklynObjectInternal extends 
BrooklynObject, Rebindable {
          * backed by a string-based map, including config names that did not 
match anything on this entity.
          */
         @Beta
-        // TODO deprecate
+        // TODO deprecate. used extensively in tests but should be easy (if 
tedious) to refactor.
         ConfigBag getLocalBag();
         
         /** Returns all config defined here, in {@link 
#getLocalRaw(ConfigKey)} format */
@@ -131,6 +131,10 @@ public interface BrooklynObjectInternal extends 
BrooklynObject, Rebindable {
 
         /** Adds keys or strings, making anonymous keys from strings; throws 
on other keys */
         @Beta
+        void putAll(Map<?, ?> vals);
+        
+        /** @deprecated since 0.10.0 use {@link #putAll(Map)} instead */
+        @Deprecated  // and confirmed no uses
         void set(Map<?, ?> vals);
 
         @Beta
@@ -145,8 +149,13 @@ public interface BrooklynObjectInternal extends 
BrooklynObject, Rebindable {
         @Beta
         void refreshInheritedConfigOfChildren();
         
-        @Beta
-        ConfigMap getInternalConfigMap();
+        /** This is currently the only way to get some rolled up collections 
and raw,
+         * and also to test for the presence of a value (without any default).
+         * As more accessors are added callers may be asked to migrate. 
+         * Callers may also consider using {@link 
#findKeys(com.google.common.base.Predicate)}
+         * if that isn't too inefficient. */
+        @Beta  // TODO provide more accessors and deprecate this
+        ConfigMapWithInheritance<? extends BrooklynObject> 
getInternalConfigMap();
 
         /** Clears all local config, e.g. on tear-down */
         void removeAllLocalConfig();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java 
b/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java
index 27d6343..fa13d37 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java
@@ -57,7 +57,7 @@ public class BrooklynServerPaths {
     /** @see BrooklynServerPaths#getMgmtBaseDir(ManagementContext) */
     @SuppressWarnings("deprecation")
     public static String getMgmtBaseDir(StringConfigMap brooklynProperties) {
-        String base = (String) 
brooklynProperties.getConfigRaw(BrooklynServerConfig.MGMT_BASE_DIR, 
true).orNull();
+        String base = (String) 
brooklynProperties.getConfigLocalRaw(BrooklynServerConfig.MGMT_BASE_DIR).orNull();
         if (base==null) {
             base = 
brooklynProperties.getConfig(BrooklynServerConfig.BROOKLYN_DATA_DIR);
             if (base!=null)
@@ -199,7 +199,7 @@ public class BrooklynServerPaths {
         }
         @Override
         protected String getDefaultPathFromConfig() {
-            Maybe<Object> result = 
brooklynProperties.getConfigRaw(BrooklynServerConfig.PERSISTENCE_BACKUPS_DIR, 
true);
+            Maybe<Object> result = 
brooklynProperties.getConfigLocalRaw(BrooklynServerConfig.PERSISTENCE_BACKUPS_DIR);
             if (result.isPresent()) return Strings.toString(result.get());
             if (isBackupSameLocation()) {
                 return 
backupContainerFor(brooklynProperties.getConfig(BrooklynServerConfig.PERSISTENCE_DIR));

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocation.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocation.java
 
b/core/src/main/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocation.java
index 1cabfc5..cc4c2d1 100644
--- 
a/core/src/main/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocation.java
+++ 
b/core/src/main/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocation.java
@@ -385,7 +385,7 @@ implements MachineProvisioningLocation<T>, Closeable {
         origConfigs.put(machine, origConfig);
         requestPersist();
         
-        ((ConfigurationSupportInternal)machine.config()).set(strFlags);
+        ((ConfigurationSupportInternal)machine.config()).putAll(strFlags);
     }
     
     protected void restoreMachineConfig(MachineLocation machine) {
@@ -402,7 +402,7 @@ implements MachineProvisioningLocation<T>, Closeable {
         for (String key : newKeys) {
             ((ConfigurationSupportInternal)machine.config()).removeKey(key);
         }
-        ((ConfigurationSupportInternal)machine.config()).set(origConfig);
+        ((ConfigurationSupportInternal)machine.config()).putAll(origConfig);
     }
     
     @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java 
b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
index 9f24b47..dab7238 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
@@ -107,7 +107,7 @@ public class ClassLoaderUtils {
         checkNotNull(callingClass, "callingClass");
         this.classLoader = getValidClassLoader(callingClass.getClassLoader());
         this.entity = null;
-        this.mgmt = checkNotNull(mgmt, "mgmt");
+        this.mgmt = mgmt;
     }
 
     // class.getClassLoader() could return null for classes on the boot class 
path,

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java 
b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
index 1ecc461..28abc86 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshTasks.java
@@ -21,6 +21,7 @@ package org.apache.brooklyn.util.core.task.ssh;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.annotation.Nullable;
 
@@ -32,28 +33,31 @@ import org.apache.brooklyn.api.mgmt.TaskAdaptable;
 import org.apache.brooklyn.api.mgmt.TaskFactory;
 import org.apache.brooklyn.api.mgmt.TaskQueueingContext;
 import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.config.ConfigPredicates;
 import org.apache.brooklyn.core.config.ConfigUtils;
 import org.apache.brooklyn.core.effector.ssh.SshEffectorTasks;
 import org.apache.brooklyn.core.location.AbstractLocation;
 import org.apache.brooklyn.core.location.internal.LocationInternal;
 import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
+import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.ResourceUtils;
-import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.internal.ssh.SshTool;
 import org.apache.brooklyn.util.core.task.DynamicTasks;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.core.task.ssh.internal.PlainSshExecTaskFactory;
 import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
 import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
+import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.net.Urls;
 import org.apache.brooklyn.util.ssh.BashCommands;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.Identifiers;
 import org.apache.brooklyn.util.text.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
@@ -122,22 +126,24 @@ public class SshTasks {
     }
 
     private static Map<String, Object> getSshFlags(Location location) {
-        ConfigBag allConfig = ConfigBag.newInstance();
+        Set<ConfigKey<?>> sshConfig = MutableSet.of();
         
+        StringConfigMap mgmtConfig = null;
+        
sshConfig.addAll(location.config().findKeys(ConfigPredicates.nameStartsWith(SshTool.BROOKLYN_CONFIG_KEY_PREFIX)));
         if (location instanceof AbstractLocation) {
             ManagementContext mgmt = 
((AbstractLocation)location).getManagementContext();
-            if (mgmt!=null)
-                allConfig.putAll(mgmt.getConfig().getAllConfig());
+            if (mgmt!=null) {
+                mgmtConfig = mgmt.getConfig();
+                
sshConfig.addAll(mgmtConfig.findKeys(ConfigPredicates.nameStartsWith(SshTool.BROOKLYN_CONFIG_KEY_PREFIX)));
+            }
         }
         
-        allConfig.putAll(((LocationInternal)location).config().getBag());
         
         Map<String, Object> result = Maps.newLinkedHashMap();
-        for (String keyS : allConfig.getAllConfig().keySet()) {
-            ConfigKey<?> key = ConfigKeys.newConfigKey(Object.class, keyS);
-            if (key.getName().startsWith(SshTool.BROOKLYN_CONFIG_KEY_PREFIX)) {
-                
result.put(ConfigUtils.unprefixedKey(SshTool.BROOKLYN_CONFIG_KEY_PREFIX, 
key).getName(), allConfig.get(key));
-            }
+        for (ConfigKey<?> key : sshConfig) {
+            Maybe<Object> v = 
((LocationInternal)location).config().getRaw(key);
+            if (v.isAbsent() && mgmtConfig!=null) v = Maybe.of( (Object) 
mgmtConfig.getConfig(key) );
+            
result.put(ConfigUtils.unprefixedKey(SshTool.BROOKLYN_CONFIG_KEY_PREFIX, 
key).getName(), v.get());
         }
         return result;
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java 
b/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java
index af5e816..8e7603b 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntityConfigTest.java
@@ -22,6 +22,7 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
@@ -36,7 +37,6 @@ import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.mgmt.ExecutionManager;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigMap;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.config.ConfigPredicates;
 import 
org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey.IntegerAttributeSensorAndConfigKey;
@@ -327,14 +327,17 @@ public class EntityConfigTest extends 
BrooklynAppUnitTestSupport {
         assertEquals(entity.getConfig(MySubEntity.SUPER_KEY_2), "changed");
     }
     
+    // Sept 2016 previously tested submap here, but we've deprecated that 
+    // (it was failing also due to the new approach, and not worth fixing)
     @Test
-    public void testConfigSubMap() throws Exception {
+    public void testConfigFilter() throws Exception {
         MySubEntity entity = 
app.addChild(EntitySpec.create(MySubEntity.class));
         entity.config().set(MyBaseEntity.SUPER_KEY_1, "s1");
         entity.config().set(MySubEntity.SUB_KEY_2, "s2");
-        ConfigMap sub = 
entity.config().getInternalConfigMap().submap(ConfigPredicates.nameMatchesGlob("sup*"));
-        Assert.assertEquals(sub.getConfigRaw(MyBaseEntity.SUPER_KEY_1, 
true).get(), "s1");
-        Assert.assertFalse(sub.getConfigRaw(MySubEntity.SUB_KEY_2, 
true).isPresent());
+        Set<ConfigKey<?>> filteredKeys = 
entity.config().getInternalConfigMap().findKeys(ConfigPredicates.nameMatchesGlob("sup*"));
+        Assert.assertTrue(filteredKeys.contains(MyBaseEntity.SUPER_KEY_1));
+        Assert.assertFalse(filteredKeys.contains(MySubEntity.SUB_KEY_2));
+        Assert.assertEquals(filteredKeys.size(), 1);
     }
 
     @SuppressWarnings({ "rawtypes", "unchecked" })

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
index 4ab2f1f..00c3432 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindFailuresTest.java
@@ -40,7 +40,6 @@ import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigMap;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.enricher.AbstractEnricher;
 import org.apache.brooklyn.core.entity.EntityFunctions;
@@ -219,22 +218,15 @@ public class RebindFailuresTest extends 
RebindTestFixtureWithApp {
     }
     
     public static class MyPolicyFailingImpl extends AbstractPolicy {
-        @SetFromFlag("failOnGenerateMemento")
-        public static final ConfigKey<Boolean> FAIL_ON_GENERATE_MEMENTO = 
ConfigKeys.newBooleanConfigKey("failOnGenerateMemento", "Whether to throw 
exception when generating memento", false);
+        // would be nice to test this -- how to intercept memento generation?
+        // (code was here but not used)
+//        @SetFromFlag("failOnGenerateMemento")
+//        public static final ConfigKey<Boolean> FAIL_ON_GENERATE_MEMENTO = 
ConfigKeys.newBooleanConfigKey("failOnGenerateMemento", "Whether to throw 
exception when generating memento", false);
         
         @SetFromFlag("failOnRebind")
         public static final ConfigKey<Boolean> FAIL_ON_REBIND = 
ConfigKeys.newBooleanConfigKey("failOnRebind", "Whether to throw exception when 
rebinding", false);
         
         @Override
-        public ConfigMap getConfigMap() {
-            if (Boolean.TRUE.equals(getConfig(FAIL_ON_GENERATE_MEMENTO))) {
-                throw new RuntimeException("Simulating failure in "+this+", 
which will cause memento-generation to fail");
-            } else {
-                return super.getConfigMap();
-            }
-        }
-        
-        @Override
         public void rebind() {
             if (Boolean.TRUE.equals(getConfig(FAIL_ON_REBIND))) {
                 throw new RuntimeException("Simulating failure in "+this+", 
which will cause rebind to fail");
@@ -243,22 +235,14 @@ public class RebindFailuresTest extends 
RebindTestFixtureWithApp {
     }
 
     public static class MyEnricherFailingImpl extends AbstractEnricher {
-        @SetFromFlag("failOnGenerateMemento")
-        public static final ConfigKey<Boolean> FAIL_ON_GENERATE_MEMENTO = 
ConfigKeys.newBooleanConfigKey("failOnGenerateMemento", "Whether to throw 
exception when generating memento", false);
+        // would be nice to test this -- see MyPolicyFailingImpl
+//        @SetFromFlag("failOnGenerateMemento")
+//        public static final ConfigKey<Boolean> FAIL_ON_GENERATE_MEMENTO = 
ConfigKeys.newBooleanConfigKey("failOnGenerateMemento", "Whether to throw 
exception when generating memento", false);
         
         @SetFromFlag("failOnRebind")
         public static final ConfigKey<Boolean> FAIL_ON_REBIND = 
ConfigKeys.newBooleanConfigKey("failOnRebind", "Whether to throw exception when 
rebinding", false);
         
         @Override
-        public ConfigMap getConfigMap() {
-            if (Boolean.TRUE.equals(getConfig(FAIL_ON_GENERATE_MEMENTO))) {
-                throw new RuntimeException("Simulating failure in "+this+", 
which will cause memento-generation to fail");
-            } else {
-                return super.getConfigMap();
-            }
-        }
-        
-        @Override
         public void rebind() {
             if (Boolean.TRUE.equals(getConfig(FAIL_ON_REBIND))) {
                 throw new RuntimeException("Simulating failure in "+this+", 
which will cause rebind to fail");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java 
b/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java
index 905674a..792b441 100644
--- 
a/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/util/core/internal/FlagUtilsTest.java
@@ -37,6 +37,7 @@ import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.flags.FlagUtils;
 import 
org.apache.brooklyn.util.core.flags.FlagUtils.FlagConfigKeyAndValueRecord;
@@ -48,6 +49,7 @@ import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -403,6 +405,11 @@ public class FlagUtilsTest {
             public <T> T set(HasConfigKey<T> key, Task<T> val) {
                 return set(key.getConfigKey(), val);
             }
+
+            @Override
+            public Set<ConfigKey<?>> findKeys(Predicate<ConfigKey<?>> 
predicate) {
+                return 
MutableSet.copyOf(Iterables.filter(bag.getAllConfigAsConfigKeyMap().keySet(), 
predicate));
+            }
         }
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsByonLocationResolver.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsByonLocationResolver.java
 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsByonLocationResolver.java
index 7bd0381..dac284f 100644
--- 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsByonLocationResolver.java
+++ 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsByonLocationResolver.java
@@ -154,7 +154,7 @@ public class JcloudsByonLocationResolver extends 
AbstractLocationResolver implem
                 JcloudsLocation jcloudsLocation = (JcloudsLocation) 
managementContext.getLocationManager().createLocation(jcloudsLocationSpec.get());
                 for (Map<?,?> machineFlags : machinesFlags) {
                     try {
-                        jcloudsLocation.config().set(machineFlags);
+                        jcloudsLocation.config().putAll(machineFlags);
                         JcloudsMachineLocation machine = 
jcloudsLocation.registerMachine(jcloudsLocation.config().getBag());
                         result.add(machine);
                     } catch (NoMachinesAvailableException e) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
index f6f31a8..31bf4dc 100644
--- 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
+++ 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
@@ -249,7 +249,7 @@ public class JcloudsLocation extends 
AbstractCloudMachineProvisioningLocation im
         if (config().getLocalBag().containsKey("providerLocationId")) {
             LOG.warn("Using deprecated 'providerLocationId' key in "+this);
             if (!config().getLocalBag().containsKey(CLOUD_REGION_ID))
-                config().set(MutableMap.of(CLOUD_REGION_ID.getName(), 
(String)config().getLocalBag().getStringKey("providerLocationId")));
+                config().putAll(MutableMap.of(CLOUD_REGION_ID.getName(), 
(String)config().getLocalBag().getStringKey("providerLocationId")));
         }
 
         if (isDisplayNameAutoGenerated() || !groovyTruth(getDisplayName())) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/AbstractPortableTemplateBuilder.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/AbstractPortableTemplateBuilder.java
 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/AbstractPortableTemplateBuilder.java
index b73e7ec..c935ea8 100644
--- 
a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/AbstractPortableTemplateBuilder.java
+++ 
b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/templates/AbstractPortableTemplateBuilder.java
@@ -453,7 +453,7 @@ public abstract class AbstractPortableTemplateBuilder<T 
extends AbstractPortable
         if (this == obj) return true;
         if (obj == null) return false;
         if (getClass() != obj.getClass()) return false;
-        AbstractPortableTemplateBuilder other = 
(AbstractPortableTemplateBuilder) obj;
+        AbstractPortableTemplateBuilder<?> other = 
(AbstractPortableTemplateBuilder<?>) obj;
         if (!Objects.equal(additionalOptions, other.additionalOptions)) return 
false;
         if (!Objects.equal(commands, other.commands)) return false;
         if (!Objects.equal(locationId, other.locationId)) return false;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
index 69342a0..591c4ab 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/BrooklynWebConfig.java
@@ -158,7 +158,7 @@ public class BrooklynWebConfig {
             "SSL_RSA_WITH_3DES_EDE_CBC_SHA");
 
     public final static boolean hasNoSecurityOptions(ConfigMap config) {
-        return 
config.submap(ConfigPredicates.nameStartsWith(BASE_NAME_SECURITY)).isEmpty();
+        return 
config.findKeys(ConfigPredicates.nameStartsWith(BASE_NAME_SECURITY)).isEmpty();
     }
-    
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
index f682d37..5a2ac0d 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
@@ -28,6 +28,7 @@ import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityInternal;
+import org.apache.brooklyn.core.entity.internal.EntityConfigMap;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.EntityAndItem;
 import org.apache.brooklyn.rest.api.EntityConfigApi;
@@ -43,7 +44,6 @@ import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicates;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
@@ -107,9 +107,10 @@ public class EntityConfigResource extends 
AbstractBrooklynRestResource implement
 
         @Override
         public Map<String, Object> call() throws Exception {
-            Map<ConfigKey<?>, ?> source = ((EntityInternal) 
entity).config().getBag().getAllConfigAsConfigKeyMap();
+            // TODO on API for this, and other config (location, policy, etc), 
support requesting local v inherited and resolved v raw
+            Map<ConfigKey<?>, Object> source = ( 
(EntityConfigMap)((EntityInternal) entity).config().getInternalConfigMap() 
).getAllConfigInheritedRawValuesIgnoringErrors();
             Map<String, Object> result = Maps.newLinkedHashMap();
-            for (Map.Entry<ConfigKey<?>, ?> ek : source.entrySet()) {
+            for (Map.Entry<ConfigKey<?>, Object> ek : source.entrySet()) {
                 ConfigKey<?> key = ek.getKey();
                 Object value = ek.getValue();
                 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java
index c8a7962..e289e93 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java
@@ -34,6 +34,7 @@ import org.apache.brooklyn.rest.filter.HaHotStateRequired;
 import org.apache.brooklyn.rest.transform.PolicyTransformer;
 import org.apache.brooklyn.rest.util.BrooklynRestResourceUtils;
 import org.apache.brooklyn.rest.util.WebResourceUtils;
+import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 
 import com.google.common.collect.Lists;
@@ -61,7 +62,8 @@ public class PolicyConfigResource extends 
AbstractBrooklynRestResource implement
     public Map<String, Object> batchConfigRead(String application, String 
entityToken, String policyToken) {
         // TODO: add test
         Policy policy = brooklyn().getPolicy(application, entityToken, 
policyToken);
-        Map<String, Object> source = 
((BrooklynObjectInternal)policy).config().getBag().getAllConfig();
+        Map<String, Object> source = ConfigBag.newInstance(
+            
((BrooklynObjectInternal)policy).config().getInternalConfigMap().getAllConfigInheritedRawValuesIgnoringErrors()
 ).getAllConfig();
         Map<String, Object> result = Maps.newLinkedHashMap();
         for (Map.Entry<String, Object> ek : source.entrySet()) {
             result.put(ek.getKey(), getStringValueForDisplay(brooklyn(), 
policy, ek.getValue()));

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/LocationTransformer.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/LocationTransformer.java
 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/LocationTransformer.java
index a9ae1d3..c612c6f 100644
--- 
a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/LocationTransformer.java
+++ 
b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/LocationTransformer.java
@@ -176,21 +176,20 @@ public class LocationTransformer {
             if (ll!=null) specId = ll.getId();
         }
         
-        Map<String, Object> configOrig;
+        ConfigBag configOrig = ConfigBag.newInstance();
         if (level == LocationDetailLevel.LOCAL_EXCLUDING_SECRET) {
-            configOrig = 
MutableMap.copyOf(((LocationInternal)l).config().getLocalBag().getAllConfig());
+            configOrig.putAll( 
((LocationInternal)l).config().getInternalConfigMap().getAllConfigLocalRaw() );
         } else {
-            configOrig = 
MutableMap.copyOf(((LocationInternal)l).config().getBag().getAllConfig());
+            configOrig.putAll( 
((LocationInternal)l).config().getInternalConfigMap().getAllConfigInheritedRawValuesIgnoringErrors()
 );
         }
         if (level==LocationDetailLevel.LOCAL_EXCLUDING_SECRET) {
-            // for LOCAL, also get the display name
-            if 
(!configOrig.containsKey(LocationConfigKeys.DISPLAY_NAME.getName())) {
-                Map<String, Object> configExtra = 
((LocationInternal)l).config().getBag().getAllConfig();
-                if 
(configExtra.containsKey(LocationConfigKeys.DISPLAY_NAME.getName()))
-                    configOrig.put(LocationConfigKeys.DISPLAY_NAME.getName(), 
configExtra.get(LocationConfigKeys.DISPLAY_NAME.getName()));
+            // for LOCAL, also get an inherited display name
+            if (!configOrig.containsKey(LocationConfigKeys.DISPLAY_NAME)) {
+                Maybe<Object> dn = 
((LocationInternal)l).config().getRaw(LocationConfigKeys.DISPLAY_NAME);
+                if (dn.isPresent()) 
configOrig.configure(LocationConfigKeys.DISPLAY_NAME, 
l.config().get(LocationConfigKeys.DISPLAY_NAME));
             }
         }
-        Map<String, ?> config = level==LocationDetailLevel.NONE ? null : 
copyConfig(configOrig, level);
+        Map<String, ?> config = level==LocationDetailLevel.NONE ? null : 
copyConfig(configOrig.getAllConfig(), level);
         
         URI selfUri = serviceUriBuilder(ub, LocationApi.class, 
"get").build(l.getId());
         URI parentUri = l.getParent() == null ? null : serviceUriBuilder(ub, 
LocationApi.class, "get").build(l.getParent().getId());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java
 
b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java
index c0131b2..629dc3c 100644
--- 
a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java
+++ 
b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/LocationResourceTest.java
@@ -26,11 +26,19 @@ import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Nullable;
+import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.core.location.LocationConfigKeys;
+import org.apache.brooklyn.core.location.SimulatedLocation;
 import org.apache.brooklyn.location.byon.FixedListMachineProvisioningLocation;
+import org.apache.brooklyn.location.jclouds.JcloudsLocation;
+import org.apache.brooklyn.rest.domain.CatalogLocationSummary;
+import org.apache.brooklyn.rest.domain.LocationSummary;
+import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
+import org.apache.brooklyn.test.Asserts;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
@@ -41,15 +49,6 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
-import javax.ws.rs.core.GenericType;
-
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.core.location.SimulatedLocation;
-import org.apache.brooklyn.location.jclouds.JcloudsLocation;
-import org.apache.brooklyn.rest.domain.CatalogLocationSummary;
-import org.apache.brooklyn.rest.domain.LocationSummary;
-import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
-import org.apache.brooklyn.test.Asserts;
 
 
 @Test(singleThreaded = true, 
@@ -226,7 +225,7 @@ public class LocationResourceTest extends 
BrooklynRestResourceTest {
         log.info(" summary: " + locationSummary);
         
Assert.assertEquals(locationSummary.getConfig().get(LocationConfigKeys.DISPLAY_NAME.getName()),
 configDisplayName);
 
-        FixedListMachineProvisioningLocation l = 
(FixedListMachineProvisioningLocation) 
getManagementContext().getLocationRegistry().getLocationManaged(symbolicName);
+        FixedListMachineProvisioningLocation<?> l = 
(FixedListMachineProvisioningLocation<?>) 
getManagementContext().getLocationRegistry().getLocationManaged(symbolicName);
         Assert.assertEquals(l.getDisplayName(), configDisplayName);
     }
 
@@ -261,7 +260,7 @@ public class LocationResourceTest extends 
BrooklynRestResourceTest {
         log.info(" summary: " + locationSummary);
         
Assert.assertEquals(locationSummary.getConfig().get(LocationConfigKeys.DISPLAY_NAME.getName()),
 testsDisplayName);
 
-        FixedListMachineProvisioningLocation l = 
(FixedListMachineProvisioningLocation) 
getManagementContext().getLocationRegistry().getLocationManaged(symbolicName);
+        FixedListMachineProvisioningLocation<?> l = 
(FixedListMachineProvisioningLocation<?>) 
getManagementContext().getLocationRegistry().getLocationManaged(symbolicName);
         Assert.assertEquals(l.getDisplayName(), testsDisplayName);
     }
 
@@ -298,7 +297,7 @@ public class LocationResourceTest extends 
BrooklynRestResourceTest {
         log.info(" summary: " + locationSummary);
         
Assert.assertEquals(locationSummary.getConfig().get(LocationConfigKeys.DISPLAY_NAME.getName()),
 configDisplayName);
 
-        FixedListMachineProvisioningLocation l = 
(FixedListMachineProvisioningLocation) 
getManagementContext().getLocationRegistry().getLocationManaged(symbolicName);
+        FixedListMachineProvisioningLocation<?> l = 
(FixedListMachineProvisioningLocation<?>) 
getManagementContext().getLocationRegistry().getLocationManaged(symbolicName);
         Assert.assertEquals(l.getDisplayName(), configDisplayName);
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/EntityLocationUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/EntityLocationUtilsTest.java
 
b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/EntityLocationUtilsTest.java
index 3aee845..2559350 100644
--- 
a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/EntityLocationUtilsTest.java
+++ 
b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/util/EntityLocationUtilsTest.java
@@ -63,7 +63,7 @@ public class EntityLocationUtilsTest extends 
BrooklynAppUnitTestSupport {
         Entities.dumpInfo(app);
 
         log.info("r2loc: "+r2.getLocations());
-        log.info("props: 
"+((LocationInternal)r2.getLocations().iterator().next()).config().getBag().getAllConfig());
+        log.info("props: 
"+((LocationInternal)r2.getLocations().iterator().next()).config().getInternalConfigMap().getAllConfigInheritedRawValuesIgnoringErrors());
 
         Map<Location, Integer> counts = new 
EntityLocationUtils(mgmt).countLeafEntitiesByLocatedLocations();
         log.info("count: "+counts);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/effector/BrooklynNodeUpgradeEffectorBody.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/effector/BrooklynNodeUpgradeEffectorBody.java
 
b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/effector/BrooklynNodeUpgradeEffectorBody.java
index 67128c1..93e84a1 100644
--- 
a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/effector/BrooklynNodeUpgradeEffectorBody.java
+++ 
b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/effector/BrooklynNodeUpgradeEffectorBody.java
@@ -145,7 +145,7 @@ public class BrooklynNodeUpgradeEffectorBody extends 
EffectorBody<Void> {
                 DynamicTasks.waitForLast();
                 
((EntityInternal)entity()).sensors().set(SoftwareProcess.INSTALL_DIR, 
(String)null);
                 entity().config().set(SoftwareProcess.INSTALL_UNIQUE_LABEL, 
(String)null);
-                entity().config().set(parameters.getAllConfig());
+                entity().config().putAll(parameters.getAllConfig());
                 entity().sensors().set(BrooklynNode.DOWNLOAD_URL, 
entity().getConfig(DOWNLOAD_URL));
 
                 // Setting SUGGESTED_VERSION will result in an new empty 
INSTALL_FOLDER, but clear it

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0d655e05/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
----------------------------------------------------------------------
diff --git 
a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
 
b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
index 2362ec5..ae2cb73 100644
--- 
a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
+++ 
b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/VanillaSoftwareProcessTest.java
@@ -289,8 +289,7 @@ public class VanillaSoftwareProcessTest extends 
BrooklynAppUnitTestSupport {
         app.start(ImmutableList.of(loc));
 
         // since app does not define it, the child *should* run it
-        // TODO the following line should execute, when we fix not_reinherited 
semantics
-//        assertExecHasOnlyOnce(RecordingSshTool.getExecCmds(), 
"preInstallCommand");
+        assertExecHasOnlyOnce(RecordingSshTool.getExecCmds(), 
"preInstallCommand");
         assertExecHasOnlyOnce(RecordingSshTool.getExecCmds(), "launchCommand");
     }
 }

Reply via email to