You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2015/08/19 13:10:21 UTC

[63/72] [abbrv] incubator-brooklyn git commit: BROOKLYN-162 - jclouds last few package prefixes needed, and tidy in core and elsewhere related (or observed in the process)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/persister/XmlMementoSerializer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/persister/XmlMementoSerializer.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/persister/XmlMementoSerializer.java
deleted file mode 100644
index 6133958..0000000
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/persister/XmlMementoSerializer.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.mgmt.rebind.persister;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.NoSuchElementException;
-import java.util.Stack;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.Task;
-import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister.LookupContext;
-import org.apache.brooklyn.api.objs.Identifiable;
-import org.apache.brooklyn.api.policy.Policy;
-import org.apache.brooklyn.api.sensor.Enricher;
-import org.apache.brooklyn.api.sensor.Feed;
-import org.apache.brooklyn.core.catalog.internal.CatalogBundleDto;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.config.BasicConfigKey;
-import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContextSequential;
-import org.apache.brooklyn.core.mgmt.classloading.ClassLoaderFromBrooklynClassLoadingContext;
-import org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContext;
-import org.apache.brooklyn.core.mgmt.rebind.dto.BasicCatalogItemMemento;
-import org.apache.brooklyn.core.mgmt.rebind.dto.BasicEnricherMemento;
-import org.apache.brooklyn.core.mgmt.rebind.dto.BasicEntityMemento;
-import org.apache.brooklyn.core.mgmt.rebind.dto.BasicFeedMemento;
-import org.apache.brooklyn.core.mgmt.rebind.dto.BasicLocationMemento;
-import org.apache.brooklyn.core.mgmt.rebind.dto.BasicPolicyMemento;
-import org.apache.brooklyn.core.mgmt.rebind.dto.MutableBrooklynMemento;
-import org.apache.brooklyn.effector.core.BasicParameterType;
-import org.apache.brooklyn.effector.core.EffectorAndBody;
-import org.apache.brooklyn.effector.core.EffectorTasks.EffectorBodyTaskFactory;
-import org.apache.brooklyn.effector.core.EffectorTasks.EffectorTaskFactory;
-import org.apache.brooklyn.sensor.core.BasicAttributeSensor;
-import org.apache.brooklyn.util.core.xstream.XmlSerializer;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.text.Strings;
-
-import com.thoughtworks.xstream.converters.Converter;
-import com.thoughtworks.xstream.converters.MarshallingContext;
-import com.thoughtworks.xstream.converters.SingleValueConverter;
-import com.thoughtworks.xstream.converters.UnmarshallingContext;
-import com.thoughtworks.xstream.converters.reflection.ReflectionConverter;
-import com.thoughtworks.xstream.core.ReferencingMarshallingContext;
-import com.thoughtworks.xstream.core.util.HierarchicalStreams;
-import com.thoughtworks.xstream.io.HierarchicalStreamReader;
-import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
-import com.thoughtworks.xstream.io.path.PathTrackingReader;
-import com.thoughtworks.xstream.mapper.Mapper;
-import com.thoughtworks.xstream.mapper.MapperWrapper;
-
-/* uses xml, cleaned up a bit
- * 
- * there is an early attempt at doing this with JSON in pull request #344 but 
- * it is not nicely deserializable, see comments at http://xstream.codehaus.org/json-tutorial.html */  
-public class XmlMementoSerializer<T> extends XmlSerializer<T> implements MementoSerializer<T> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(XmlMementoSerializer.class);
-
-    private final ClassLoader classLoader;
-    private LookupContext lookupContext;
-
-    public XmlMementoSerializer(ClassLoader classLoader) {
-        this.classLoader = checkNotNull(classLoader, "classLoader");
-        xstream.setClassLoader(this.classLoader);
-        
-        // old (deprecated in 070? or earlier) single-file persistence uses this keyword; TODO remove soon in 080 ?
-        xstream.alias("brooklyn", MutableBrooklynMemento.class);
-        
-        xstream.alias("entity", BasicEntityMemento.class);
-        xstream.alias("location", BasicLocationMemento.class);
-        xstream.alias("policy", BasicPolicyMemento.class);
-        xstream.alias("feed", BasicFeedMemento.class);
-        xstream.alias("enricher", BasicEnricherMemento.class);
-        xstream.alias("configKey", BasicConfigKey.class);
-        xstream.alias("catalogItem", BasicCatalogItemMemento.class);
-        xstream.alias("bundle", CatalogBundleDto.class);
-        xstream.alias("attributeSensor", BasicAttributeSensor.class);
-
-        xstream.alias("effector", Effector.class);
-        xstream.addDefaultImplementation(EffectorAndBody.class, Effector.class);
-        xstream.alias("parameter", BasicParameterType.class);
-        xstream.addDefaultImplementation(EffectorBodyTaskFactory.class, EffectorTaskFactory.class);
-        
-        xstream.alias("entityRef", Entity.class);
-        xstream.alias("locationRef", Location.class);
-        xstream.alias("policyRef", Policy.class);
-        xstream.alias("enricherRef", Enricher.class);
-
-        xstream.registerConverter(new LocationConverter());
-        xstream.registerConverter(new PolicyConverter());
-        xstream.registerConverter(new EnricherConverter());
-        xstream.registerConverter(new EntityConverter());
-        xstream.registerConverter(new FeedConverter());
-        xstream.registerConverter(new CatalogItemConverter());
-        xstream.registerConverter(new SpecConverter());
-
-        xstream.registerConverter(new ManagementContextConverter());
-        xstream.registerConverter(new TaskConverter(xstream.getMapper()));
-    
-        //For compatibility with existing persistence stores content.
-        xstream.aliasField("registeredTypeName", BasicCatalogItemMemento.class, "symbolicName");
-        xstream.registerLocalConverter(BasicCatalogItemMemento.class, "libraries", new CatalogItemLibrariesConverter());
-    }
-    
-    // Warning: this is called in the super-class constuctor, so before this constructor!
-    @Override
-    protected MapperWrapper wrapMapper(MapperWrapper next) {
-        MapperWrapper mapper = super.wrapMapper(next);
-        mapper = new CustomMapper(mapper, Entity.class, "entityProxy");
-        mapper = new CustomMapper(mapper, Location.class, "locationProxy");
-        return mapper;
-    }
-
-    @Override
-    public void serialize(Object object, Writer writer) {
-        super.serialize(object, writer);
-        try {
-            writer.append("\n");
-        } catch (IOException e) {
-            throw Exceptions.propagate(e);
-        }
-    }
-
-    @Override
-    public void setLookupContext(LookupContext lookupContext) {
-        this.lookupContext = checkNotNull(lookupContext, "lookupContext");
-    }
-
-    @Override
-    public void unsetLookupContext() {
-        this.lookupContext = null;
-    }
-    
-    /**
-     * For changing the tag used for anything that implements/extends the given type.
-     * Necessary for using EntityRef rather than the default "dynamic-proxy" tag.
-     * 
-     * @author aled
-     */
-    public class CustomMapper extends MapperWrapper {
-        private final Class<?> clazz;
-        private final String alias;
-
-        public CustomMapper(Mapper wrapped, Class<?> clazz, String alias) {
-            super(wrapped);
-            this.clazz = checkNotNull(clazz, "clazz");
-            this.alias = checkNotNull(alias, "alias");
-        }
-
-        public String getAlias() {
-            return alias;
-        }
-
-        @Override
-        public String serializedClass(@SuppressWarnings("rawtypes") Class type) {
-            if (type != null && clazz.isAssignableFrom(type)) {
-                return alias;
-            } else {
-                return super.serializedClass(type);
-            }
-        }
-
-        @Override
-        public Class<?> realClass(String elementName) {
-            if (elementName.equals(alias)) {
-                return clazz;
-            } else {
-                return super.realClass(elementName);
-            }
-        }
-    }
-
-    public abstract class IdentifiableConverter<IT extends Identifiable> implements SingleValueConverter {
-        private final Class<IT> clazz;
-        
-        IdentifiableConverter(Class<IT> clazz) {
-            this.clazz = clazz;
-        }
-        @Override
-        public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
-            boolean result = clazz.isAssignableFrom(type);
-            return result;
-        }
-
-        @Override
-        public String toString(Object obj) {
-            return obj == null ? null : ((Identifiable)obj).getId();
-        }
-        @Override
-        public Object fromString(String str) {
-            if (lookupContext == null) {
-                LOG.warn("Cannot unmarshal from persisted xml {} {}; no lookup context supplied!", clazz.getSimpleName(), str);
-                return null;
-            } else {
-                return lookup(str);
-            }
-        }
-        
-        protected abstract IT lookup(String id);
-    }
-
-    public class LocationConverter extends IdentifiableConverter<Location> {
-        LocationConverter() {
-            super(Location.class);
-        }
-        @Override
-        protected Location lookup(String id) {
-            return lookupContext.lookupLocation(id);
-        }
-    }
-
-    public class PolicyConverter extends IdentifiableConverter<Policy> {
-        PolicyConverter() {
-            super(Policy.class);
-        }
-        @Override
-        protected Policy lookup(String id) {
-            return lookupContext.lookupPolicy(id);
-        }
-    }
-
-    public class EnricherConverter extends IdentifiableConverter<Enricher> {
-        EnricherConverter() {
-            super(Enricher.class);
-        }
-        @Override
-        protected Enricher lookup(String id) {
-            return lookupContext.lookupEnricher(id);
-        }
-    }
-    
-    public class FeedConverter extends IdentifiableConverter<Feed> {
-        FeedConverter() {
-            super(Feed.class);
-        }
-        @Override
-        protected Feed lookup(String id) {
-            return lookupContext.lookupFeed(id);
-        }
-    }
-    
-    public class EntityConverter extends IdentifiableConverter<Entity> {
-        EntityConverter() {
-            super(Entity.class);
-        }
-        @Override
-        protected Entity lookup(String id) {
-            return lookupContext.lookupEntity(id);
-        }
-    }
-
-    @SuppressWarnings("rawtypes")
-    public class CatalogItemConverter extends IdentifiableConverter<CatalogItem> {
-        CatalogItemConverter() {
-            super(CatalogItem.class);
-        }
-        @Override
-        protected CatalogItem<?,?> lookup(String id) {
-            return lookupContext.lookupCatalogItem(id);
-        }
-    }
-
-
-    static boolean loggedTaskWarning = false;
-    public class TaskConverter implements Converter {
-        private final Mapper mapper;
-        
-        TaskConverter(Mapper mapper) {
-            this.mapper = mapper;
-        }
-        @Override
-        public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
-            return Task.class.isAssignableFrom(type);
-        }
-        @SuppressWarnings("deprecation")
-        @Override
-        public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
-            if (source == null) return;
-            if (((Task<?>)source).isDone() && !((Task<?>)source).isError()) {
-                try {
-                    context.convertAnother(((Task<?>)source).get());
-                } catch (InterruptedException e) {
-                    throw Exceptions.propagate(e);
-                } catch (ExecutionException e) {
-                    LOG.warn("Unexpected exception getting done (and non-error) task result for "+source+"; continuing: "+e, e);
-                }
-            } else {
-                // TODO How to log sensibly, without it logging this every second?!
-                // jun 2014, have added a "log once" which is not ideal but better than the log never behaviour
-                if (!loggedTaskWarning) {
-                    LOG.warn("Intercepting and skipping request to serialize a Task"
-                        + (context instanceof ReferencingMarshallingContext ? " at "+((ReferencingMarshallingContext)context).currentPath() : "")+
-                        " (only logging this once): "+source);
-                    loggedTaskWarning = true;
-                }
-                
-                return;
-            }
-        }
-        @Override
-        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
-            if (reader.hasMoreChildren()) {
-                Class<?> type = HierarchicalStreams.readClassType(reader, mapper);
-                reader.moveDown();
-                Object result = context.convertAnother(null, type);
-                reader.moveUp();
-                return result;
-            } else {
-                return null;
-            }
-        }
-    }
-    
-    public class ManagementContextConverter implements Converter {
-        @Override
-        public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
-            return ManagementContext.class.isAssignableFrom(type);
-        }
-        @Override
-        public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
-            // write nothing, and always insert the current mgmt context
-        }
-        @Override
-        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
-            return lookupContext.lookupManagementContext();
-        }
-    }
-
-    /** When reading/writing specs, it checks whether there is a catalog item id set and uses it to load */
-    public class SpecConverter extends ReflectionConverter {
-        SpecConverter() {
-            super(xstream.getMapper(), xstream.getReflectionProvider());
-        }
-        @Override
-        public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
-            return AbstractBrooklynObjectSpec.class.isAssignableFrom(type);
-        }
-        @Override
-        public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
-            if (source == null) return;
-            AbstractBrooklynObjectSpec<?, ?> spec = (AbstractBrooklynObjectSpec<?, ?>) source;
-            String catalogItemId = spec.getCatalogItemId();
-            if (Strings.isNonBlank(catalogItemId)) {
-                // write this field first, so we can peek at it when we read
-                writer.startNode("catalogItemId");
-                writer.setValue(catalogItemId);
-                writer.endNode();
-                
-                // we're going to write the catalogItemId field twice :( but that's okay.
-                // better solution would be to have mark/reset on reader so we can peek for such a field;
-                // see comment below
-                super.marshal(source, writer, context);
-            } else {
-                super.marshal(source, writer, context);
-            }
-        }
-        @Override
-        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
-            String catalogItemId = null;
-            instantiateNewInstanceSettingCache(reader, context);
-            
-            if (reader instanceof PathTrackingReader) {
-                // have to assume this is first; there is no mark/reset support on these readers
-                // (if there were then it would be easier, we could just look for that child anywhere,
-                // and not need a custom writer!)
-                if ("catalogItemId".equals( ((PathTrackingReader)reader).peekNextChild() )) {
-                    // cache the instance
-                    
-                    reader.moveDown();
-                    catalogItemId = reader.getValue();
-                    reader.moveUp();
-                }
-            }
-            boolean customLoaderSet = false;
-            try {
-                if (Strings.isNonBlank(catalogItemId)) {
-                    if (lookupContext==null) throw new NullPointerException("lookupContext required to load catalog item "+catalogItemId);
-                    CatalogItem<?, ?> cat = CatalogUtils.getCatalogItemOptionalVersion(lookupContext.lookupManagementContext(), catalogItemId);
-                    if (cat==null) throw new NoSuchElementException("catalog item: "+catalogItemId);
-                    BrooklynClassLoadingContext clcNew = CatalogUtils.newClassLoadingContext(lookupContext.lookupManagementContext(), cat);
-                    pushXstreamCustomClassLoader(clcNew);
-                    customLoaderSet = true;
-                }
-                
-                AbstractBrooklynObjectSpec<?, ?> result = (AbstractBrooklynObjectSpec<?, ?>) super.unmarshal(reader, context);
-                // we wrote it twice so this shouldn't be necessary; but if we fix it so we only write once, we'd need this
-                result.catalogItemId(catalogItemId);
-                return result;
-            } finally {
-                instance = null;
-                if (customLoaderSet) {
-                    popXstreamCustomClassLoader();
-                }
-            }
-        }
-
-        Object instance;
-        
-        @Override
-        protected Object instantiateNewInstance(HierarchicalStreamReader reader, UnmarshallingContext context) {
-            // the super calls getAttribute which requires that we have not yet done moveDown,
-            // so we do this earlier and cache it for when we call super.unmarshal
-            if (instance==null)
-                throw new IllegalStateException("Instance should be created and cached");
-            return instance;
-        }
-        protected void instantiateNewInstanceSettingCache(HierarchicalStreamReader reader, UnmarshallingContext context) {
-            instance = super.instantiateNewInstance(reader, context);
-        }
-    }
-    
-    Stack<BrooklynClassLoadingContext> contexts = new Stack<BrooklynClassLoadingContext>();
-    Stack<ClassLoader> cls = new Stack<ClassLoader>();
-    AtomicReference<Thread> xstreamLockOwner = new AtomicReference<Thread>();
-    int lockCount;
-    
-    /** Must be accompanied by a corresponding {@link #popXstreamCustomClassLoader()} when finished. */
-    @SuppressWarnings("deprecation")
-    protected void pushXstreamCustomClassLoader(BrooklynClassLoadingContext clcNew) {
-        acquireXstreamLock();
-        BrooklynClassLoadingContext oldClc;
-        if (!contexts.isEmpty()) {
-            oldClc = contexts.peek();
-        } else {
-            // TODO XmlMementoSerializer should take a BCLC instead of a CL
-            oldClc = JavaBrooklynClassLoadingContext.create(lookupContext.lookupManagementContext(), xstream.getClassLoader());
-        }
-        BrooklynClassLoadingContextSequential clcMerged = new BrooklynClassLoadingContextSequential(lookupContext.lookupManagementContext(),
-            oldClc, clcNew);
-        contexts.push(clcMerged);
-        cls.push(xstream.getClassLoader());
-        ClassLoader newCL = ClassLoaderFromBrooklynClassLoadingContext.of(clcMerged);
-        xstream.setClassLoader(newCL);
-    }
-
-    protected void popXstreamCustomClassLoader() {
-        synchronized (xstreamLockOwner) {
-            releaseXstreamLock();
-            xstream.setClassLoader(cls.pop());
-            contexts.pop();
-        }
-    }
-    
-    protected void acquireXstreamLock() {
-        synchronized (xstreamLockOwner) {
-            while (true) {
-                if (xstreamLockOwner.compareAndSet(null, Thread.currentThread()) || 
-                    Thread.currentThread().equals( xstreamLockOwner.get() )) {
-                    break;
-                }
-                try {
-                    xstreamLockOwner.wait(1000);
-                } catch (InterruptedException e) {
-                    throw Exceptions.propagate(e);
-                }
-            }
-            lockCount++;
-        }
-    }
-
-    protected void releaseXstreamLock() {
-        synchronized (xstreamLockOwner) {
-            if (lockCount<=0) {
-                throw new IllegalStateException("xstream not locked");
-            }
-            if (--lockCount == 0) {
-                if (!xstreamLockOwner.compareAndSet(Thread.currentThread(), null)) {
-                    Thread oldOwner = xstreamLockOwner.getAndSet(null);
-                    throw new IllegalStateException("xstream was locked by "+oldOwner+" but unlock attempt by "+Thread.currentThread());
-                }
-                xstreamLockOwner.notifyAll();
-            }
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/plane/dto/BasicManagementNodeSyncRecord.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/plane/dto/BasicManagementNodeSyncRecord.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/plane/dto/BasicManagementNodeSyncRecord.java
deleted file mode 100644
index d492260..0000000
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/plane/dto/BasicManagementNodeSyncRecord.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.mgmt.rebind.plane.dto;
-
-import java.io.Serializable;
-import java.net.URI;
-
-import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState;
-import org.apache.brooklyn.api.mgmt.ha.ManagementNodeSyncRecord;
-import org.apache.brooklyn.core.BrooklynVersion;
-import org.apache.brooklyn.util.time.Time;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
-
-import com.google.common.base.Objects;
-
-/**
- * Represents the state of a management node within the Brooklyn management plane
- * (DTO class).
- * 
- * @author aled
- */
-@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE)
-public class BasicManagementNodeSyncRecord implements ManagementNodeSyncRecord, Serializable {
-
-    private static final long serialVersionUID = 4918161834047884244L;
-
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    public static class Builder {
-        private String brooklynVersion = BrooklynVersion.get();
-        protected String nodeId;
-        protected URI uri;
-        protected ManagementNodeState status;
-        protected Long priority;
-        protected long localTimestamp;
-        protected Long remoteTimestamp;
-
-        protected Builder self() {
-            return (Builder) this;
-        }
-        public Builder brooklynVersion(String val) {
-            brooklynVersion = val; return self();
-        }
-        public Builder nodeId(String val) {
-            nodeId = val; return self();
-        }
-        public Builder uri(URI val) {
-            uri = val; return self();
-        }
-        public Builder status(ManagementNodeState val) {
-            status = val; return self();
-        }
-        public Builder priority(Long val) {
-            priority = val; return self();
-        }
-        public Builder localTimestamp(long val) {
-            localTimestamp = val; return self();
-        }
-        public Builder remoteTimestamp(Long val) {
-            remoteTimestamp = val; return self();
-        }
-        public Builder from(ManagementNodeSyncRecord other) {
-            return from(other, false);
-        }
-        public Builder from(ManagementNodeSyncRecord other, boolean ignoreNulls) {
-            if (ignoreNulls && other==null) return this;
-            if (other.getBrooklynVersion()!=null) brooklynVersion = other.getBrooklynVersion();
-            if (other.getNodeId()!=null) nodeId = other.getNodeId();
-            if (other.getUri()!=null) uri = other.getUri();
-            if (other.getStatus()!=null) status = other.getStatus();
-            if (other.getPriority()!=null) priority = other.getPriority();
-            if (other.getLocalTimestamp()>0) localTimestamp = other.getLocalTimestamp();
-            if (other.getRemoteTimestamp()!=null) remoteTimestamp = other.getRemoteTimestamp();
-            return this;
-        }
-        public ManagementNodeSyncRecord build() {
-            return new BasicManagementNodeSyncRecord(this);
-        }
-    }
-    
-    private String brooklynVersion;
-    private String nodeId;
-    private URI uri;
-    private ManagementNodeState status;
-    private Long priority;
-    private Long localTimestamp;
-    private Long remoteTimestamp;
-    
-    /** @deprecated since 0.7.0, use {@link #localTimestamp} or {@link #remoteTimestamp},
-     * but kept (or rather added back in) to support deserializing previous instances */
-    @Deprecated
-    private Long timestampUtc;
-
-
-    // for de-serialization
-    @SuppressWarnings("unused")
-    private BasicManagementNodeSyncRecord() {
-    }
-
-    // Trusts the builder to not mess around with mutability concurrently with build().
-    protected BasicManagementNodeSyncRecord(Builder builder) {
-        brooklynVersion = builder.brooklynVersion;
-        nodeId = builder.nodeId;
-        uri = builder.uri;
-        status = builder.status;
-        priority = builder.priority;
-        localTimestamp = builder.localTimestamp;
-        remoteTimestamp = builder.remoteTimestamp;
-    }
-
-    @Override
-    public String getBrooklynVersion() {
-        return brooklynVersion;
-    }
-    
-    @Override
-    public String getNodeId() {
-        return nodeId;
-    }
-    
-    @Override
-    public URI getUri() {
-        return uri;
-    }
-    
-    @Override
-    public ManagementNodeState getStatus() {
-        return status;
-    }
-    
-    @Override
-    public Long getPriority() {
-        return priority;
-    }
-    
-    @Override
-    public long getLocalTimestamp() {
-        if (localTimestamp!=null) return localTimestamp;
-        if (timestampUtc!=null) return timestampUtc;
-        throw new NullPointerException("localTimestamp not known for "+getNodeId());
-    }
-    
-    @Override
-    public Long getRemoteTimestamp() {
-        return remoteTimestamp;
-    }
-    
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("nodeId", getNodeId())
-                .add("status", getStatus()).toString();
-    }
-    
-    @Override
-    public String toVerboseString() {
-        return Objects.toStringHelper(this)
-                .omitNullValues()
-                .add("brooklynVersion", getBrooklynVersion())
-                .add("nodeId", getNodeId())
-                .add("uri", getUri())
-                .add("status", getStatus())
-                .add("priority", getPriority())
-                .add("localTimestamp", getLocalTimestamp()+"="+Time.makeDateString(getLocalTimestamp()))
-                .add("remoteTimestamp", getRemoteTimestamp()+(getRemoteTimestamp()==null ? "" : 
-                    "="+Time.makeDateString(getRemoteTimestamp())))
-                .toString();
-    }
-
-    /** used here for store to inject remote timestamp */
-    public void setRemoteTimestamp(Long remoteTimestamp) {
-        this.remoteTimestamp = remoteTimestamp;
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/plane/dto/ManagementPlaneSyncRecordImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/plane/dto/ManagementPlaneSyncRecordImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/plane/dto/ManagementPlaneSyncRecordImpl.java
deleted file mode 100644
index fc09365..0000000
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/plane/dto/ManagementPlaneSyncRecordImpl.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.mgmt.rebind.plane.dto;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import java.io.Serializable;
-import java.util.Map;
-
-import org.apache.brooklyn.api.mgmt.ha.ManagementNodeSyncRecord;
-import org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecord;
-import org.apache.brooklyn.util.collections.MutableMap;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-
-public class ManagementPlaneSyncRecordImpl implements ManagementPlaneSyncRecord, Serializable {
-
-    private static final long serialVersionUID = -4207907303446336973L;
-
-    public static Builder builder() {
-        return new Builder();
-    }
-    
-    public static class Builder {
-        protected String masterNodeId;
-        protected final Map<String,ManagementNodeSyncRecord> nodes = MutableMap.of();
-        
-        public Builder masterNodeId(String val) {
-            masterNodeId = val; return this;
-        }
-        public Builder nodes(Iterable<ManagementNodeSyncRecord> vals) {
-            checkState(!Iterables.contains(checkNotNull(vals, "nodes must not be null"), null),  "nodes must not contain null: %s", vals);
-            for (ManagementNodeSyncRecord val: vals) nodes.put(val.getNodeId(), val);
-            return this;
-        }
-        public Builder node(ManagementNodeSyncRecord val) {
-            checkNotNull(val, "node must not be null"); 
-            nodes.put(val.getNodeId(), val);
-            return this;
-        }
-        public ManagementPlaneSyncRecord build() {
-            return new ManagementPlaneSyncRecordImpl(this);
-        }
-    }
-
-    private String masterNodeId;
-    private Map<String, ManagementNodeSyncRecord> managementNodes;
-    
-    private ManagementPlaneSyncRecordImpl(Builder builder) {
-        masterNodeId = builder.masterNodeId;
-        managementNodes = Maps.newLinkedHashMap();
-        for (ManagementNodeSyncRecord node : builder.nodes.values()) {
-            checkState(!managementNodes.containsKey(node.getNodeId()), "duplicate nodeId %s", node.getNodeId());
-            managementNodes.put(node.getNodeId(), node);
-        }
-    }
-
-    @Override
-    public String getMasterNodeId() {
-        return masterNodeId;
-    }
-    
-    @Override
-    public Map<String, ManagementNodeSyncRecord> getManagementNodes() {
-        return managementNodes;
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("masterNodeId", masterNodeId)
-                .add("nodes", managementNodes.keySet())
-                .toString();
-    }
-
-    @Override
-    public String toVerboseString() {
-        return toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
index 1e547ee..74b1375 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
@@ -26,7 +26,7 @@ import java.util.Map;
 import org.apache.brooklyn.api.mgmt.rebind.RebindExceptionHandler;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoRawData;
 import org.apache.brooklyn.api.objs.BrooklynObjectType;
-import org.apache.brooklyn.core.mgmt.rebind.persister.BrooklynMementoPersisterToObjectStore;
+import org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
 import org.apache.brooklyn.core.mgmt.rebind.transformer.impl.XsltTransformer;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java
index 02d058e..e66c8b3 100644
--- a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalLocationFactory.java
@@ -28,8 +28,8 @@ import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.mgmt.internal.LocalLocationManager;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
-import org.apache.brooklyn.location.basic.AbstractLocation;
-import org.apache.brooklyn.location.basic.LocationInternal;
+import org.apache.brooklyn.location.core.AbstractLocation;
+import org.apache.brooklyn.location.core.internal.LocationInternal;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.flags.FlagUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/effector/core/EffectorTasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/effector/core/EffectorTasks.java b/core/src/main/java/org/apache/brooklyn/effector/core/EffectorTasks.java
index 7a0881d..4f1b8d5 100644
--- a/core/src/main/java/org/apache/brooklyn/effector/core/EffectorTasks.java
+++ b/core/src/main/java/org/apache/brooklyn/effector/core/EffectorTasks.java
@@ -33,9 +33,9 @@ import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
 import org.apache.brooklyn.core.mgmt.internal.EffectorUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.Machines;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.location.basic.WinRmMachineLocation;
+import org.apache.brooklyn.location.core.Machines;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
+import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.task.DynamicSequentialTask;
 import org.apache.brooklyn.util.core.task.DynamicTasks;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/entity/core/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/core/AbstractEntity.java b/core/src/main/java/org/apache/brooklyn/entity/core/AbstractEntity.java
index a4447af..2814f32 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/core/AbstractEntity.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/core/AbstractEntity.java
@@ -75,7 +75,7 @@ import org.apache.brooklyn.entity.core.internal.EntityConfigMap;
 import org.apache.brooklyn.entity.lifecycle.PolicyDescriptor;
 import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic.ServiceNotUpLogic;
-import org.apache.brooklyn.location.basic.Locations;
+import org.apache.brooklyn.location.core.Locations;
 import org.apache.brooklyn.policy.core.AbstractPolicy;
 import org.apache.brooklyn.sensor.core.AttributeMap;
 import org.apache.brooklyn.sensor.core.AttributeSensorAndConfigKey;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/entity/core/Entities.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/core/Entities.java b/core/src/main/java/org/apache/brooklyn/entity/core/Entities.java
index b9ea275..4e479f5 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/core/Entities.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/core/Entities.java
@@ -75,8 +75,8 @@ import org.apache.brooklyn.core.objs.proxy.EntityProxyImpl;
 import org.apache.brooklyn.effector.core.Effectors;
 import org.apache.brooklyn.entity.trait.Startable;
 import org.apache.brooklyn.entity.trait.StartableMethods;
-import org.apache.brooklyn.location.basic.LocationInternal;
-import org.apache.brooklyn.location.basic.Locations;
+import org.apache.brooklyn.location.core.Locations;
+import org.apache.brooklyn.location.core.internal.LocationInternal;
 import org.apache.brooklyn.sensor.core.DependentConfiguration;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/entity/core/EntitySuppliers.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/core/EntitySuppliers.java b/core/src/main/java/org/apache/brooklyn/entity/core/EntitySuppliers.java
index 3c6ebea..7d5640c 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/core/EntitySuppliers.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/core/EntitySuppliers.java
@@ -19,8 +19,8 @@
 package org.apache.brooklyn.entity.core;
 
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.location.basic.Machines;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
+import org.apache.brooklyn.location.core.Machines;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
 
 import com.google.common.base.Supplier;
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java b/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java
index b0791b2..0e54806 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/drivers/ReflectiveEntityDriverFactory.java
@@ -28,9 +28,9 @@ import org.apache.brooklyn.api.entity.drivers.EntityDriver;
 import org.apache.brooklyn.api.location.Location;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
 import org.apache.brooklyn.location.paas.PaasLocation;
-import org.apache.brooklyn.location.basic.WinRmMachineLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
+import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.Exceptions;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java
index 69f3744..a348489 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java
@@ -52,8 +52,8 @@ import org.apache.brooklyn.entity.trait.Startable;
 import org.apache.brooklyn.entity.trait.StartableMethods;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.Locations;
 import org.apache.brooklyn.location.cloud.AvailabilityZoneExtension;
+import org.apache.brooklyn.location.core.Locations;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartable.java b/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartable.java
index 0d6c62e..432e045 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartable.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartable.java
@@ -26,7 +26,7 @@ import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.entity.trait.Startable;
-import org.apache.brooklyn.location.basic.Locations;
+import org.apache.brooklyn.location.core.Locations;
 
 import com.google.common.collect.ImmutableList;
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartableImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartableImpl.java b/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartableImpl.java
index 3ff4b21..1818262 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartableImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/stock/BasicStartableImpl.java
@@ -33,7 +33,7 @@ import org.apache.brooklyn.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.entity.trait.Startable;
 import org.apache.brooklyn.entity.trait.StartableMethods;
-import org.apache.brooklyn.location.basic.Locations;
+import org.apache.brooklyn.location.core.Locations;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/location/access/BrooklynAccessUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/location/access/BrooklynAccessUtils.java b/core/src/main/java/org/apache/brooklyn/location/access/BrooklynAccessUtils.java
index 38e9fdd..941f557 100644
--- a/core/src/main/java/org/apache/brooklyn/location/access/BrooklynAccessUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/location/access/BrooklynAccessUtils.java
@@ -28,9 +28,9 @@ import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.entity.core.Attributes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.Machines;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.location.basic.SupportsPortForwarding;
+import org.apache.brooklyn.location.core.Machines;
+import org.apache.brooklyn.location.core.SupportsPortForwarding;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.core.task.DynamicTasks;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.core.task.ssh.SshTasks;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerImpl.java b/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerImpl.java
index 62b5c29..83be7f0 100644
--- a/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerImpl.java
@@ -34,7 +34,7 @@ import org.apache.brooklyn.api.mgmt.rebind.RebindContext;
 import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.LocationMemento;
 import org.apache.brooklyn.core.mgmt.rebind.BasicLocationRebindSupport;
-import org.apache.brooklyn.location.basic.AbstractLocation;
+import org.apache.brooklyn.location.core.AbstractLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerLocationResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerLocationResolver.java b/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerLocationResolver.java
index 1cc5318..525631c 100644
--- a/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerLocationResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/location/access/PortForwardManagerLocationResolver.java
@@ -23,12 +23,12 @@ import java.util.Map;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationRegistry;
 import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.location.basic.LocationConfigUtils;
-import org.apache.brooklyn.location.basic.LocationInternal;
-import org.apache.brooklyn.location.basic.LocationPredicates;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.AbstractLocationResolver;
+import org.apache.brooklyn.location.core.AbstractLocationResolver;
+import org.apache.brooklyn.location.core.LocationConfigUtils;
+import org.apache.brooklyn.location.core.LocationPredicates;
+import org.apache.brooklyn.location.core.internal.LocationInternal;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 
 import com.google.common.base.Optional;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java b/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java
deleted file mode 100644
index bab336a..0000000
--- a/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocation.java
+++ /dev/null
@@ -1,707 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.location.basic;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.brooklyn.util.GroovyJavaMethods.elvis;
-import static org.apache.brooklyn.util.JavaGroovyEquivalents.groovyTruth;
-
-import java.io.Closeable;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationSpec;
-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.Configurable;
-import org.apache.brooklyn.config.ConfigInheritance;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
-import org.apache.brooklyn.core.config.BasicConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.internal.BrooklynFeatureEnablement;
-import org.apache.brooklyn.core.internal.storage.BrooklynStorage;
-import org.apache.brooklyn.core.internal.storage.Reference;
-import org.apache.brooklyn.core.internal.storage.impl.BasicReference;
-import org.apache.brooklyn.core.mgmt.internal.LocalLocationManager;
-import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
-import org.apache.brooklyn.core.mgmt.rebind.BasicLocationRebindSupport;
-import org.apache.brooklyn.core.objs.AbstractBrooklynObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.geo.HasHostGeoInfo;
-import org.apache.brooklyn.location.geo.HostGeoInfo;
-import org.apache.brooklyn.util.collections.SetFromLiveMap;
-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.guava.Maybe;
-import org.apache.brooklyn.util.stream.Streams;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Objects.ToStringHelper;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.reflect.TypeToken;
-
-/**
- * A basic implementation of the {@link Location} interface.
- *
- * This provides an implementation which works according to the requirements of
- * the interface documentation, and is ready to be extended to make more specialized locations.
- * 
- * Override {@link #configure(Map)} to add special initialization logic.
- */
-public abstract class AbstractLocation extends AbstractBrooklynObject implements LocationInternal, HasHostGeoInfo, Configurable {
-    
-    private static final long serialVersionUID = -7495805474138619830L;
-
-    /** @deprecated since 0.7.0 shouldn't be public */
-    @Deprecated
-    public static final Logger LOG = LoggerFactory.getLogger(AbstractLocation.class);
-
-    public static final ConfigKey<Location> PARENT_LOCATION = new BasicConfigKey<Location>(Location.class, "parentLocation");
-
-    public static final ConfigKey<Boolean> TEMPORARY_LOCATION = ConfigKeys.newBooleanConfigKey("temporaryLocation",
-            "Indicates that the location is a temporary location that has been created to test connectivity, and that" +
-            "the location's events should not be recorded by usage listeners", false);
-
-    private final AtomicBoolean configured = new AtomicBoolean();
-    
-    private Reference<Long> creationTimeUtc = new BasicReference<Long>(System.currentTimeMillis());
-    
-    // _not_ set from flag; configured explicitly in configure, because we also need to update the parent's list of children
-    private Reference<Location> parent = new BasicReference<Location>();
-    
-    // NB: all accesses should be synchronized
-    private Set<Location> children = Sets.newLinkedHashSet();
-
-    private Reference<String> name = new BasicReference<String>();
-    private boolean displayNameAutoGenerated = true;
-
-    private Reference<HostGeoInfo> hostGeoInfo = new BasicReference<HostGeoInfo>();
-
-    private BasicConfigurationSupport config = new BasicConfigurationSupport();
-    
-    private ConfigBag configBag = new ConfigBag();
-
-    private volatile boolean managed;
-
-    private boolean inConstruction;
-
-    private Reference<Map<Class<?>, Object>> extensions = new BasicReference<Map<Class<?>, Object>>(Maps.<Class<?>, Object>newConcurrentMap());
-
-    private final LocationDynamicType locationType;
-
-    /**
-     * Construct a new instance of an AbstractLocation.
-     */
-    public AbstractLocation() {
-        this(Maps.newLinkedHashMap());
-    }
-    
-    /**
-     * Construct a new instance of an AbstractLocation.
-     *
-     * The properties map recognizes the following keys:
-     * <ul>
-     * <li>name - a name for the location
-     * <li>parentLocation - the parent {@link Location}
-     * </ul>
-     * 
-     * Other common properties (retrieved via get/findLocationProperty) include:
-     * <ul>
-     * <li>latitude
-     * <li>longitude
-     * <li>displayName
-     * <li>iso3166 - list of iso3166-2 code strings
-     * <li>timeZone
-     * <li>abbreviatedName
-     * </ul>
-     */
-    public AbstractLocation(Map<?,?> properties) {
-        super(properties);
-        inConstruction = true;
-        
-        // When one calls getConfig(key), we want to use the default value specified on *this* location
-        // if it overrides the default config, by using the type object 
-        locationType = new LocationDynamicType(this);
-        
-        if (isLegacyConstruction()) {
-            AbstractBrooklynObject checkWeGetThis = configure(properties);
-            assert this.equals(checkWeGetThis) : this+" configure method does not return itself; returns "+checkWeGetThis+" instead of "+this;
-
-            boolean deferConstructionChecks = (properties.containsKey("deferConstructionChecks") && TypeCoercions.coerce(properties.get("deferConstructionChecks"), Boolean.class));
-            if (!deferConstructionChecks) {
-                FlagUtils.checkRequiredFields(this);
-            }
-        }
-        
-        inConstruction = false;
-    }
-
-    protected void assertNotYetManaged() {
-        if (!inConstruction && Locations.isManaged(this)) {
-            LOG.warn("Configuration being made to {} after deployment; may not be supported in future versions", this);
-        }
-        //throw new IllegalStateException("Cannot set configuration "+key+" on active location "+this)
-    }
-
-    public void setManagementContext(ManagementContextInternal managementContext) {
-        super.setManagementContext(managementContext);
-        if (displayNameAutoGenerated && getId() != null) name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
-
-        if (BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_USE_BROOKLYN_LIVE_OBJECTS_DATAGRID_STORAGE)) {
-            Location oldParent = parent.get();
-            Set<Location> oldChildren = children;
-            Map<String, Object> oldConfig = configBag.getAllConfig();
-            Long oldCreationTimeUtc = creationTimeUtc.get();
-            String oldDisplayName = name.get();
-            HostGeoInfo oldHostGeoInfo = hostGeoInfo.get();
-
-            parent = managementContext.getStorage().getReference(getId()+"-parent");
-            children = SetFromLiveMap.create(managementContext.getStorage().<Location,Boolean>getMap(getId()+"-children"));
-            creationTimeUtc = managementContext.getStorage().getReference(getId()+"-creationTime");
-            hostGeoInfo = managementContext.getStorage().getReference(getId()+"-hostGeoInfo");
-            name = managementContext.getStorage().getReference(getId()+"-displayName");
-
-            // Only override stored defaults if we have actual values. We might be in setManagementContext
-            // because we are reconstituting an existing entity in a new brooklyn management-node (in which
-            // case believe what is already in the storage), or we might be in the middle of creating a new 
-            // entity. Normally for a new entity (using EntitySpec creation approach), this will get called
-            // before setting the parent etc. However, for backwards compatibility we still support some
-            // things calling the entity's constructor directly.
-            if (oldParent != null) parent.set(oldParent);
-            if (oldChildren.size() > 0) children.addAll(oldChildren);
-            if (creationTimeUtc.isNull()) creationTimeUtc.set(oldCreationTimeUtc);
-            if (hostGeoInfo.isNull()) hostGeoInfo.set(oldHostGeoInfo);
-            if (name.isNull()) {
-                name.set(oldDisplayName);
-            } else {
-                displayNameAutoGenerated = false;
-            }
-
-            configBag = ConfigBag.newLiveInstance(managementContext.getStorage().<String,Object>getMap(getId()+"-config"));
-            if (oldConfig.size() > 0) {
-                configBag.putAll(oldConfig);
-            }
-        }
-    }
-
-    /**
-     * @deprecated since 0.7.0; only used for legacy brooklyn types where constructor is called directly;
-     * see overridden method for more info
-     */
-    @SuppressWarnings("serial")
-    @Override
-    @Deprecated
-    public AbstractLocation configure(Map<?,?> properties) {
-        assertNotYetManaged();
-        
-        boolean firstTime = !configured.getAndSet(true);
-            
-        configBag.putAll(properties);
-        
-        if (properties.containsKey(PARENT_LOCATION.getName())) {
-            // need to ensure parent's list of children is also updated
-            setParent(configBag.get(PARENT_LOCATION));
-            
-            // don't include parentLocation in configBag, as breaks rebind
-            configBag.remove(PARENT_LOCATION);
-        }
-
-        // NB: flag-setting done here must also be done in BasicLocationRebindSupport 
-        FlagUtils.setFieldsFromFlagsWithBag(this, properties, configBag, firstTime);
-        FlagUtils.setAllConfigKeys(this, configBag, false);
-
-        if (properties.containsKey("displayName")) {
-            name.set((String) removeIfPossible(properties, "displayName"));
-            displayNameAutoGenerated = false;
-        } else if (properties.containsKey("name")) {
-            name.set((String) removeIfPossible(properties, "name"));
-            displayNameAutoGenerated = false;
-        } else if (isLegacyConstruction()) {
-            name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
-            displayNameAutoGenerated = true;
-        }
-
-        // TODO Explicitly dealing with iso3166 here because want custom splitter rule comma-separated string.
-        // Is there a better way to do it (e.g. more similar to latitude, where configKey+TypeCoercion is enough)?
-        if (groovyTruth(properties.get("iso3166"))) {
-            Object rawCodes = removeIfPossible(properties, "iso3166");
-            Set<String> codes;
-            if (rawCodes instanceof CharSequence) {
-                codes = ImmutableSet.copyOf(Splitter.on(",").trimResults().split((CharSequence)rawCodes));
-            } else {
-                codes = TypeCoercions.coerce(rawCodes, new TypeToken<Set<String>>() {});
-            }
-            configBag.put(LocationConfigKeys.ISO_3166, codes);
-        }
-        
-        return this;
-    }
-
-    // TODO ensure no callers rely on 'remove' semantics, and don't remove;
-    // or perhaps better use a config bag so we know what is used v unused
-    private static Object removeIfPossible(Map<?,?> map, Object key) {
-        try {
-            return map.remove(key);
-        } catch (Exception e) {
-            return map.get(key);
-        }
-    }
-    
-    public boolean isManaged() {
-        return getManagementContext() != null && managed;
-    }
-
-    public void onManagementStarted() {
-        if (displayNameAutoGenerated) name.set(getClass().getSimpleName()+":"+getId().substring(0, Math.min(getId().length(),4)));
-        this.managed = true;
-    }
-    
-    public void onManagementStopped() {
-        this.managed = false;
-        if (getManagementContext().isRunning()) {
-            BrooklynStorage storage = ((ManagementContextInternal)getManagementContext()).getStorage();
-            storage.remove(getId()+"-parent");
-            storage.remove(getId()+"-children");
-            storage.remove(getId()+"-creationTime");
-            storage.remove(getId()+"-hostGeoInfo");
-            storage.remove(getId()+"-displayName");
-            storage.remove(getId()+"-config");
-        }
-    }
-    
-    @Override
-    public String getDisplayName() {
-        return name.get();
-    }
-    
-    protected boolean isDisplayNameAutoGenerated() {
-        return displayNameAutoGenerated;
-    }
-    
-    @Override
-    public Location getParent() {
-        return parent.get();
-    }
-    
-    @Override
-    public Collection<Location> getChildren() {
-        synchronized (children) {
-            return ImmutableList.copyOf(children);
-        }
-    }
-
-    @Override
-    public void setParent(Location newParent) {
-        setParent(newParent, true);
-    }
-    
-    public void setParent(Location newParent, boolean updateChildListParents) {
-        if (newParent == this) {
-            throw new IllegalArgumentException("Location cannot be its own parent: "+this);
-        }
-        if (newParent == parent.get()) {
-            return; // no-op; already have desired parent
-        }
-        
-        if (parent.get() != null) {
-            Location oldParent = parent.get();
-            parent.set(null);
-            if (updateChildListParents)
-                ((AbstractLocation)oldParent).removeChild(this);
-        }
-        // TODO Should we support a location changing parent? The resulting unmanage/manage might cause problems.
-        // The code above suggests we do, but maybe we should warn or throw error, or at least test it!
-        
-        parent.set(newParent);
-        if (newParent != null) {
-            if (updateChildListParents)
-                ((AbstractLocation)newParent).addChild(this);
-        }
-        
-        onChanged();
-    }
-
-    @Override
-    public ConfigurationSupportInternal config() {
-        return config ;
-    }
-
-    private class BasicConfigurationSupport implements ConfigurationSupportInternal {
-
-        @Override
-        public <T> T get(ConfigKey<T> key) {
-            if (hasConfig(key, false)) return getLocalBag().get(key);
-            if (getParent() != null && isInherited(key)) {
-                return getParent().getConfig(key);
-            }
-            
-            // In case this entity class has overridden the given key (e.g. to set default), then retrieve this entity's key
-            // TODO when locations become entities, the duplication of this compared to EntityConfigMap.getConfig will disappear.
-            @SuppressWarnings("unchecked")
-            ConfigKey<T> ownKey = (ConfigKey<T>) elvis(locationType.getConfigKey(key.getName()), key);
-
-            return ownKey.getDefaultValue();
-        }
-
-        @Override
-        public <T> T get(HasConfigKey<T> key) {
-            return get(key.getConfigKey());
-        }
-
-        @Override
-        public <T> T set(ConfigKey<T> key, T val) {
-            T result = configBag.put(key, val);
-            onChanged();
-            return result;
-        }
-
-        @Override
-        public <T> T set(HasConfigKey<T> key, T val) {
-            return set(key.getConfigKey(), val);
-        }
-
-        @Override
-        public <T> T set(ConfigKey<T> key, Task<T> val) {
-            // TODO Support for locations
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public <T> T set(HasConfigKey<T> key, Task<T> val) {
-            // TODO Support for locations
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public ConfigBag getBag() {
-            ConfigBag result = ConfigBag.newInstanceExtending(configBag, ImmutableMap.of());
-            Location p = getParent();
-            if (p!=null) result.putIfAbsent(((LocationInternal)p).config().getBag());
-            return result;
-        }
-
-        @Override
-        public ConfigBag getLocalBag() {
-            return configBag;
-        }
-
-        @Override
-        public Maybe<Object> getRaw(ConfigKey<?> key) {
-            if (hasConfig(key, false)) return Maybe.of(getLocalBag().getStringKey(key.getName()));
-            if (getParent() != null && isInherited(key)) return ((LocationInternal)getParent()).config().getRaw(key);
-            return Maybe.absent();
-        }
-
-        @Override
-        public Maybe<Object> getRaw(HasConfigKey<?> key) {
-            return getRaw(key.getConfigKey());
-        }
-
-        @Override
-        public Maybe<Object> getLocalRaw(ConfigKey<?> key) {
-            if (hasConfig(key, false)) return Maybe.of(getLocalBag().getStringKey(key.getName()));
-            return Maybe.absent();
-        }
-
-        @Override
-        public Maybe<Object> getLocalRaw(HasConfigKey<?> key) {
-            return getLocalRaw(key.getConfigKey());
-        }
-
-        @Override
-        public void addToLocalBag(Map<String, ?> vals) {
-            configBag.putAll(vals);
-        }
-
-        @Override
-        public void removeFromLocalBag(String key) {
-            configBag.remove(key);
-        }
-
-        @Override
-        public void refreshInheritedConfig() {
-            // no-op for location
-        }
-        
-        @Override
-        public void refreshInheritedConfigOfChildren() {
-            // no-op for location
-        }
-        
-        private boolean hasConfig(ConfigKey<?> key, boolean includeInherited) {
-            if (includeInherited && isInherited(key)) {
-                return getBag().containsKey(key);
-            } else {
-                return getLocalBag().containsKey(key);
-            }
-        }
-        
-        private boolean isInherited(ConfigKey<?> key) {
-            ConfigInheritance inheritance = key.getInheritance();
-            if (inheritance==null) inheritance = getDefaultInheritance();
-            return inheritance.isInherited(key, getParent(), AbstractLocation.this);
-        }
-
-        private ConfigInheritance getDefaultInheritance() {
-            return ConfigInheritance.ALWAYS;
-        }
-    }
-    
-    @Override
-    public <T> T getConfig(HasConfigKey<T> key) {
-        return config().get(key);
-    }
-
-    @Override
-    public <T> T getConfig(ConfigKey<T> key) {
-        return config().get(key);
-    }
-
-    @Override
-    @Deprecated
-    public boolean hasConfig(ConfigKey<?> key, boolean includeInherited) {
-        return config.hasConfig(key, includeInherited);
-    }
-
-    @Override
-    @Deprecated
-    public Map<String,Object> getAllConfig(boolean includeInherited) {
-        // TODO Have no information about what to include/exclude inheritance wise.
-        // however few things use getAllConfigBag()
-        ConfigBag bag = (includeInherited ? config().getBag() : config().getLocalBag());
-        return bag.getAllConfig();
-    }
-    
-    @Override
-    @Deprecated
-    public ConfigBag getAllConfigBag() {
-        // TODO see comments in EntityConfigMap and on interface methods. 
-        // here ConfigBag is used exclusively so
-        // we have no information about what to include/exclude inheritance wise.
-        // however few things use getAllConfigBag()
-        return config().getBag();
-    }
-    
-    @Override
-    public ConfigBag getLocalConfigBag() {
-        return config().getLocalBag();
-    }
-
-    /** 
-     * @deprecated since 0.7; use {@link #getLocalConfigBag()}
-     * @since 0.6
-     */
-    @Deprecated
-    public ConfigBag getRawLocalConfigBag() {
-        return config().getLocalBag();
-    }
-    
-    @Override
-    @Deprecated
-    public <T> T setConfig(ConfigKey<T> key, T value) {
-        return config().set(key, value);
-    }
-
-    /**
-     * @since 0.6.0 (?) - use getDisplayName
-     * @deprecated since 0.7.0; use {@link #getDisplayName()}
-     */
-    @Deprecated
-    public void setName(String newName) {
-        setDisplayName(newName);
-    }
-
-    public void setDisplayName(String newName) {
-        name.set(newName);
-        displayNameAutoGenerated = false;
-        onChanged();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (! (o instanceof Location)) {
-            return false;
-        }
-
-        Location l = (Location) o;
-        return getId().equals(l.getId());
-    }
-
-    @Override
-    public int hashCode() {
-        return getId().hashCode();
-    }
-
-    @Override
-    public boolean containsLocation(Location potentialDescendent) {
-        Location loc = potentialDescendent;
-        while (loc != null) {
-            if (this == loc) return true;
-            loc = loc.getParent();
-        }
-        return false;
-    }
-
-    protected <T extends Location> T addChild(LocationSpec<T> spec) {
-        T child = getManagementContext().getLocationManager().createLocation(spec);
-        addChild(child);
-        return child;
-    }
-    
-    @SuppressWarnings("deprecation")
-    public void addChild(Location child) {
-        // Previously, setParent delegated to addChildLocation and we sometimes ended up with
-        // duplicate entries here. Instead this now uses a similar scheme to 
-        // AbstractLocation.setParent/addChild (with any weaknesses for distribution that such a 
-        // scheme might have...).
-        // 
-        // We continue to use a list to allow identical-looking locations, but they must be different 
-        // instances.
-        
-        synchronized (children) {
-            for (Location contender : children) {
-                if (contender == child) {
-                    // don't re-add; no-op
-                    return;
-                }
-            }
-
-            children.add(child);
-        }
-        
-        if (isManaged()) {
-            if (!getManagementContext().getLocationManager().isManaged(child)) {
-                Locations.manage(child, getManagementContext());
-            }
-        } else if (getManagementContext() != null) {
-            if (((LocalLocationManager)getManagementContext().getLocationManager()).getLocationEvenIfPreManaged(child.getId()) == null) {
-                ((ManagementContextInternal)getManagementContext()).prePreManage(child);
-            }
-        }
-
-        children.add(child);
-        child.setParent(this);
-        
-        onChanged();
-    }
-    
-    public boolean removeChild(Location child) {
-        boolean removed;
-        synchronized (children) {
-            removed = children.remove(child);
-        }
-        if (removed) {
-            if (child instanceof Closeable) {
-                Streams.closeQuietly((Closeable)child);
-            }
-            child.setParent(null);
-            
-            if (isManaged()) {
-                getManagementContext().getLocationManager().unmanage(child);
-            }
-        }
-        onChanged();
-        return removed;
-    }
-
-    protected void onChanged() {
-        // currently changes simply trigger re-persistence; there is no intermediate listener as we do for EntityChangeListener
-        if (isManaged()) {
-            getManagementContext().getRebindManager().getChangeListener().onChanged(this);
-        }
-    }
-
-    /** Default String representation is simplified name of class, together with selected fields. */
-    @Override
-    public String toString() {
-        return string().toString();
-    }
-    
-    @Override
-    public String toVerboseString() {
-        return toString();
-    }
-
-    /** override this, adding to the returned value, to supply additional fields to include in the toString */
-    protected ToStringHelper string() {
-        return Objects.toStringHelper(getClass()).add("id", getId()).add("name", name);
-    }
-    
-    @Override
-    public HostGeoInfo getHostGeoInfo() { return hostGeoInfo.get(); }
-    
-    public void setHostGeoInfo(HostGeoInfo hostGeoInfo) {
-        if (hostGeoInfo!=null) { 
-            this.hostGeoInfo.set(hostGeoInfo);
-            setConfig(LocationConfigKeys.LATITUDE, hostGeoInfo.latitude); 
-            setConfig(LocationConfigKeys.LONGITUDE, hostGeoInfo.longitude); 
-        } 
-    }
-
-    @Override
-    public RebindSupport<LocationMemento> getRebindSupport() {
-        return new BasicLocationRebindSupport(this);
-    }
-    
-    @Override
-    public boolean hasExtension(Class<?> extensionType) {
-        return extensions.get().containsKey(checkNotNull(extensionType, "extensionType"));
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public <T> T getExtension(Class<T> extensionType) {
-        Object extension = extensions.get().get(checkNotNull(extensionType, "extensionType"));
-        if (extension == null) {
-            throw new IllegalArgumentException("No extension of type "+extensionType+" registered for location "+this);
-        }
-        return (T) extension;
-    }
-    
-    @Override
-    public <T> void addExtension(Class<T> extensionType, T extension) {
-        checkNotNull(extensionType, "extensionType");
-        checkNotNull(extension, "extension");
-        checkArgument(extensionType.isInstance(extension), "extension %s does not implement %s", extension, extensionType);
-        extensions.get().put(extensionType, extension);
-    }
-
-    @Override
-    public Map<String, String> toMetadataRecord() {
-        ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
-        if (getDisplayName() != null) builder.put("displayName", getDisplayName());
-        if (getParent() != null && getParent().getDisplayName() != null) {
-            builder.put("parentDisplayName", getParent().getDisplayName());
-        }
-        return builder.build();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a1ad34d7/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocationResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocationResolver.java b/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocationResolver.java
deleted file mode 100644
index 90a1861..0000000
--- a/core/src/main/java/org/apache/brooklyn/location/basic/AbstractLocationResolver.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.location.basic;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationRegistry;
-import org.apache.brooklyn.api.location.LocationResolver;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.AbstractLocationResolver.SpecParser.ParsedSpec;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.text.KeyValueParser;
-
-import com.google.common.collect.ImmutableList;
-
-/**
- * Examples of valid specs:
- *   <ul>
- *     <li>byon(hosts=myhost)
- *     <li>byon(hosts=myhost,myhost2)
- *     <li>byon(hosts="myhost, myhost2")
- *     <li>byon(hosts=myhost,myhost2, name=abc)
- *     <li>byon(hosts="myhost, myhost2", name="my location name")
- *   </ul>
- * 
- * @author aled
- */
-@SuppressWarnings({"unchecked","rawtypes"})
-public abstract class AbstractLocationResolver implements LocationResolver {
-
-    public static final Logger log = LoggerFactory.getLogger(AbstractLocationResolver.class);
-    
-    protected volatile ManagementContext managementContext;
-
-    protected volatile SpecParser specParser;
-
-    protected abstract Class<? extends Location> getLocationType();
-    
-    protected abstract SpecParser getSpecParser();
-    
-    @Override
-    public void init(ManagementContext managementContext) {
-        this.managementContext = checkNotNull(managementContext, "managementContext");
-        this.specParser = getSpecParser();
-    }
-    
-    @Override
-    public boolean accepts(String spec, LocationRegistry registry) {
-        return BasicLocationRegistry.isResolverPrefixForSpec(this, spec, true);
-    }
-
-    @Override
-    public Location newLocationFromString(Map locationFlags, String spec, LocationRegistry registry) {
-        ConfigBag config = extractConfig(locationFlags, spec, registry);
-        Map globalProperties = registry.getProperties();
-        String namedLocation = (String) locationFlags.get(LocationInternal.NAMED_SPEC_NAME.getName());
-        
-        if (registry != null) {
-            LocationPropertiesFromBrooklynProperties.setLocalTempDir(globalProperties, config);
-        }
-
-        return managementContext.getLocationManager().createLocation(LocationSpec.create(getLocationType())
-            .configure(config.getAllConfig())
-            .configure(LocationConfigUtils.finalAndOriginalSpecs(spec, locationFlags, globalProperties, namedLocation)));
-    }
-
-    protected ConfigBag extractConfig(Map<?,?> locationFlags, String spec, LocationRegistry registry) {
-        Map globalProperties = registry.getProperties();
-        ParsedSpec parsedSpec = specParser.parse(spec);
-        String namedLocation = (String) locationFlags.get(LocationInternal.NAMED_SPEC_NAME.getName());
-        
-        // prefer args map over location flags
-        Map<String, Object> filteredProperties = getFilteredLocationProperties(getPrefix(), namedLocation, globalProperties);
-        ConfigBag flags = ConfigBag.newInstance(parsedSpec.argsMap).putIfAbsent(locationFlags).putIfAbsent(filteredProperties);
-
-        return flags;
-    }
-    
-    protected Map<String, Object> getFilteredLocationProperties(String provider, String namedLocation, Map<String, ?> globalProperties) {
-        return new LocationPropertiesFromBrooklynProperties().getLocationProperties(getPrefix(), namedLocation, globalProperties);
-    }
-    
-    /**
-     * Parses a spec, by default of the general form "prefix:parts1:part2(arg1=val1,arg2=val2)"
-     */
-    protected static class SpecParser {
-        
-        protected static class ParsedSpec {
-            public final String spec;
-            public final List<String> partsList;
-            public final Map<String,String> argsMap;
-            
-            ParsedSpec(String spec, List<String> partsList, Map<String,String> argsMap) {
-                this.spec = spec;
-                this.partsList = ImmutableList.copyOf(partsList);
-                this.argsMap = Collections.unmodifiableMap(MutableMap.copyOf(argsMap));
-            }
-        }
-        
-        protected final String prefix;
-        protected final Pattern pattern;
-        private String exampleUsage;
-        
-        public SpecParser(String prefix) {
-            this.prefix = prefix;
-            pattern = Pattern.compile("("+prefix+"|"+prefix.toLowerCase()+"|"+prefix.toUpperCase()+")" + "(:)?" + "(\\((.*)\\))?$");
-        }
-        
-        public SpecParser(String prefix, Pattern pattern) {
-            this.prefix = prefix;
-            this.pattern = pattern;
-        }
-        
-        public SpecParser setExampleUsage(String exampleUsage) {
-            this.exampleUsage = exampleUsage;
-            return this;
-        }
-
-        protected String getUsage(String spec) {
-            if (exampleUsage == null) {
-                return "Spec should be in the form "+pattern;
-            } else {
-                return "for example, "+exampleUsage;
-            }
-        }
-        
-        protected void checkParsedSpec(ParsedSpec parsedSpec) {
-            // If someone tries "byon:(),byon:()" as a single spec, we get weird key-values!
-            for (String key : parsedSpec.argsMap.keySet()) {
-                if (key.contains(":") || key.contains("{") || key.contains("}") || key.contains("(") || key.contains(")")) {
-                    throw new IllegalArgumentException("Invalid byon spec: "+parsedSpec.spec+" (key="+key+")");
-                }
-            }
-            String name = parsedSpec.argsMap.get("name");
-            if (parsedSpec.argsMap.containsKey("name") && (name == null || name.isEmpty())) {
-                throw new IllegalArgumentException("Invalid location '"+parsedSpec.spec+"'; if name supplied then value must be non-empty");
-            }
-            String displayName = parsedSpec.argsMap.get("displayName");
-            if (parsedSpec.argsMap.containsKey("displayName") && (displayName == null || displayName.isEmpty())) {
-                throw new IllegalArgumentException("Invalid location '"+parsedSpec.spec+"'; if displayName supplied then value must be non-empty");
-            }
-        }
-        
-        public ParsedSpec parse(String spec) {
-            Matcher matcher = pattern.matcher(spec);
-            if (!matcher.matches()) {
-                throw new IllegalArgumentException("Invalid location '"+spec+"'; "+getUsage(spec));
-            }
-            
-            String argsPart = matcher.group(3);
-            if (argsPart != null && argsPart.startsWith("(") && argsPart.endsWith(")")) {
-                // TODO Hacky; hosts("1.1.1.1") returns argsPart=("1.1.1.1")
-                argsPart = argsPart.substring(1, argsPart.length()-1);
-            }
-            Map<String, String> argsMap = KeyValueParser.parseMap(argsPart);
-            ParsedSpec result = new ParsedSpec(spec, ImmutableList.<String>of(), argsMap);
-            checkParsedSpec(result);
-            return result;
-        }
-    }
-}