http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
 
b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
index 399f9dc..70224aa 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java
@@ -20,15 +20,10 @@ package org.apache.brooklyn.core.resolve.entity;
 
 import java.util.Set;
 
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
-import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider;
+import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,27 +36,25 @@ public class CatalogEntitySpecResolver extends 
AbstractEntitySpecResolver {
         super(RESOLVER_NAME);
     }
 
+    // in 0.9.0 we've changed this *not* to perform
+    // symbolicName = 
DeserializingClassRenamesProvider.findMappedName(symbolicName);
+    // in belief that this should only apply to *java* loads 
TODO-type-registry confirm this
+
     @Override
     protected boolean canResolve(String type, BrooklynClassLoadingContext 
loader) {
         String localType = getLocalType(type);
-        CatalogItem<Entity, EntitySpec<?>> item = getCatalogItem(mgmt, 
localType);
-        if (item != null) {
-            try {
-                //Keeps behaviour of previous functionality, but probably 
should throw instead when using disabled items.
-                checkUsable(item);
-                return true;
-            } catch (IllegalStateException e) {
-                return false;
-            }
-        } else {
-            return false;
-        }
+        RegisteredType item = mgmt.getTypeRegistry().get(localType);
+        if (item==null) return false;
+        //Keeps behaviour of previous functionality, but caller might be 
interested if item is disabled
+        if (item.isDisabled()) return false;
+        
+        return true;
     }
 
     @Override
     public EntitySpec<?> resolve(String type, BrooklynClassLoadingContext 
loader, Set<String> parentEncounteredTypes) {
         String localType = getLocalType(type);
-        CatalogItem<Entity, EntitySpec<?>> item = getCatalogItem(mgmt, 
localType);
+        RegisteredType item = mgmt.getTypeRegistry().get(localType);
 
         if (item == null) return null;
         checkUsable(item);
@@ -69,21 +62,14 @@ public class CatalogEntitySpecResolver extends 
AbstractEntitySpecResolver {
         //Take the symbolicName part of the catalog item only for recursion 
detection to prevent
         //cross referencing of different versions. Not interested in 
non-catalog item types.
         //Prevent catalog items self-referencing even if explicitly different 
version.
-        boolean nonRecursiveCall = 
!parentEncounteredTypes.contains(item.getSymbolicName());
-        if (nonRecursiveCall) {
-            // CatalogItem generics are just getting in the way, better get 
rid of them, we
-            // are casting anyway.
-            @SuppressWarnings({ "rawtypes" })
-            CatalogItem rawItem = item;
-            @SuppressWarnings({ "rawtypes", "unchecked" })
-            AbstractBrooklynObjectSpec rawSpec = 
EntityManagementUtils.createCatalogSpec(mgmt, rawItem, parentEncounteredTypes);
-            return (EntitySpec<?>) rawSpec;
-        } else {
-            return null;
-        }
+        boolean recursiveCall = 
parentEncounteredTypes.contains(item.getSymbolicName());
+        if (recursiveCall) return null;
+        return mgmt.getTypeRegistry().createSpec(item, 
+            RegisteredTypeConstraints.alreadyVisited(parentEncounteredTypes), 
+            EntitySpec.class);
     }
 
-    private void checkUsable(CatalogItem<Entity, EntitySpec<?>> item) {
+    private void checkUsable(RegisteredType item) {
         if (item.isDisabled()) {
             throw new IllegalStateException("Illegal use of disabled catalog 
item "+item.getSymbolicName()+":"+item.getVersion());
         } else if (item.isDeprecated()) {
@@ -91,9 +77,9 @@ public class CatalogEntitySpecResolver extends 
AbstractEntitySpecResolver {
         }
     }
 
-    protected CatalogItem<Entity,EntitySpec<?>> 
getCatalogItem(ManagementContext mgmt, String brooklynType) {
-        brooklynType = 
DeserializingClassRenamesProvider.findMappedName(brooklynType);
-        return CatalogUtils.getCatalogItemOptionalVersion(mgmt, Entity.class,  
brooklynType);
-    }
+//    protected CatalogItem<Entity,EntitySpec<?>> 
getCatalogItem(ManagementContext mgmt, String brooklynType) {
+//        brooklynType = 
DeserializingClassRenamesProvider.findMappedName(brooklynType);
+//        return CatalogUtils.getCatalogItemOptionalVersion(mgmt, 
Entity.class,  brooklynType);
+//    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
 
b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
index b8ce013..047e11d 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java
@@ -26,6 +26,7 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
+import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.Reflections;
 
@@ -37,6 +38,13 @@ public class JavaEntitySpecResolver extends 
AbstractEntitySpecResolver{
     }
 
     @Override
+    protected String getLocalType(String type) {
+        type = super.getLocalType(type);
+        type = DeserializingClassRenamesProvider.findMappedName(type);
+        return type;
+    }
+    
+    @Override
     protected boolean canResolve(String type, BrooklynClassLoadingContext 
loader) {
         String localType = getLocalType(type);
         Maybe<?> javaType = tryLoadJavaType(localType, loader);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
index 3d418e4..0a9a229 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
@@ -18,22 +18,21 @@
  */
 package org.apache.brooklyn.core.typereg;
 
+import javax.annotation.Nullable;
+
 import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
-import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.api.typereg.RegisteredTypeConstraint;
+import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.typereg.RegisteredTypes.JavaTypeImplementation;
 import org.apache.brooklyn.core.typereg.RegisteredTypes.RegisteredSpecType;
-import org.apache.brooklyn.core.typereg.RegisteredTypes.TypeImplementation;
-import org.apache.brooklyn.util.collections.MutableList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Iterables;
@@ -49,74 +48,73 @@ public class BasicBrooklynTypeRegistry implements 
BrooklynTypeRegistry {
         this.mgmt = mgmt;
     }
     
-    private static final Function<CatalogItem<?,?>,RegisteredType> CI_TO_RT = 
new Function<CatalogItem<?,?>, RegisteredType>() {
-        @Override
-        public RegisteredType apply(CatalogItem<?, ?> item) {
-            if (item==null) return null;
-            TypeImplementation impl = null;
-            if (item.getPlanYaml()!=null) {
-                impl = new TypeImplementation(null, item.getPlanYaml());
-            }
-            if (item.getJavaType()!=null) {
-                impl = new JavaTypeImplementation(item.getJavaType());
-            }
-            if (impl!=null) {
-                RegisteredSpecType type = new 
RegisteredSpecType(item.getSymbolicName(), item.getVersion(),
-                    item.getCatalogItemJavaType(), impl);
-                type.bundles = 
MutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries());
-                type.displayName = item.getDisplayName();
-                type.description = item.getDescription();
-                type.iconUrl = item.getIconUrl();
-                
-                // TODO
-                // disabled, deprecated
-                // javaType, specType, registeredTypeName ...
-                // tags ?
-                return type;
-            }
-            throw new IllegalStateException("Unsupported catalog item "+item+" 
when trying to create RegisteredType");
-        }
-    };
-    
     public Iterable<RegisteredType> getAll() {
         return getAll(Predicates.alwaysTrue());
     }
     
+    @SuppressWarnings("deprecation")
     @Override
     public Iterable<RegisteredType> getAll(Predicate<? super RegisteredType> 
filter) {
-        return 
Iterables.filter(Iterables.transform(mgmt.getCatalog().getCatalogItems(), 
CI_TO_RT), filter);
+        return 
Iterables.filter(Iterables.transform(mgmt.getCatalog().getCatalogItems(), 
RegisteredTypes.CI_TO_RT), filter);
     }
 
+    @SuppressWarnings("deprecation")
     @Override
-    public RegisteredType get(String symbolicNameWithOptionalVersion, 
RegisteredTypeKind kind, Class<?> parentClass) {
+    public RegisteredType get(String symbolicName, String version, 
RegisteredTypeConstraint constraint) {
+        if (constraint==null) constraint = RegisteredTypeConstraints.any();
+        if (version==null) version = BrooklynCatalog.DEFAULT_VERSION;
+        
+        // TODO lookup here, using constraints
+        
+        // fallback to catalog
+        CatalogItem<?, ?> item = 
mgmt.getCatalog().getCatalogItem(symbolicName, version);
+        // TODO apply constraint
+        return RegisteredTypes.CI_TO_RT.apply( item );
+    }
+
+    @Override
+    public RegisteredType get(String symbolicName, String version) {
+        return get(symbolicName, version, null);
+    }
+    
+    @Override
+    public RegisteredType get(String symbolicNameWithOptionalVersion, 
RegisteredTypeConstraint constraint) {
         if 
(CatalogUtils.looksLikeVersionedId(symbolicNameWithOptionalVersion)) {
-            String id = 
CatalogUtils.getSymbolicNameFromVersionedId(symbolicNameWithOptionalVersion);
+            String symbolicName = 
CatalogUtils.getSymbolicNameFromVersionedId(symbolicNameWithOptionalVersion);
             String version = 
CatalogUtils.getVersionFromVersionedId(symbolicNameWithOptionalVersion);
-            return get(id, version, kind, parentClass);
+            return get(symbolicName, version, constraint);
         } else {
-            return get(symbolicNameWithOptionalVersion, 
BrooklynCatalog.DEFAULT_VERSION, kind, parentClass);
+            return get(symbolicNameWithOptionalVersion, 
BrooklynCatalog.DEFAULT_VERSION, constraint);
         }
     }
 
     @Override
-    public RegisteredType get(String symbolicName, String version, 
RegisteredTypeKind kind, Class<?> parentClass) {
-        return CI_TO_RT.apply( mgmt.getCatalog().getCatalogItem(symbolicName, 
version) );
+    public RegisteredType get(String symbolicNameWithOptionalVersion) {
+        return get(symbolicNameWithOptionalVersion, 
(RegisteredTypeConstraint)null);
     }
 
+    @SuppressWarnings({ "deprecation", "unchecked", "rawtypes" })
     @Override
-    public RegisteredType get(String symbolicName, String version) {
-        return get(symbolicName, version, null, null);
-    }
-
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    @Override
-    public <T extends AbstractBrooklynObjectSpec> T createSpec(RegisteredType 
type, Class<T> specKind) {
+    public <SpecT extends AbstractBrooklynObjectSpec<?,?>> SpecT 
createSpec(RegisteredType type, @Nullable RegisteredTypeConstraint constraint, 
Class<SpecT> specSuperType) {
         if (!(type instanceof RegisteredSpecType)) { 
             throw new IllegalStateException("Cannot create spec from type 
"+type);
         }
+        if (constraint!=null) {
+            if (constraint.getKind()!=null && 
constraint.getKind()!=RegisteredTypeKind.SPEC) {
+                throw new IllegalStateException("Cannot create spec with 
constraint "+constraint);
+            }
+            if 
(constraint.getEncounteredTypes().contains(type.getSymbolicName())) {
+                // avoid recursive cycle
+                // TODO implement using java if permitted
+            }
+        }
+        constraint = 
RegisteredTypeConstraints.extendedWithSpecSuperType(constraint, specSuperType);
+
+        // TODO look up in the actual registry
         
-        CatalogItem item = 
mgmt.getCatalog().getCatalogItem(type.getSymbolicName(), type.getVersion());
-        return (T) mgmt.getCatalog().createSpec(item);
+        // fallback: look up in (legacy) catalog
+        CatalogItem item = (CatalogItem) 
mgmt.getCatalog().getCatalogItem(type.getSymbolicName(), type.getVersion());
+        return (SpecT) 
BasicBrooklynCatalog.internalCreateSpecWithTransformers(mgmt, item, 
constraint.getEncounteredTypes());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
 
b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
new file mode 100644
index 0000000..7f49335
--- /dev/null
+++ 
b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java
@@ -0,0 +1,152 @@
+/*
+ * 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.typereg;
+
+import groovy.xml.Entity;
+
+import java.util.Set;
+
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
+import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.objs.BrooklynObjectType;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
+import org.apache.brooklyn.api.typereg.RegisteredTypeConstraint;
+import org.apache.brooklyn.util.collections.MutableSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableSet;
+
+public class RegisteredTypeConstraints {
+
+    private static final Logger log = 
LoggerFactory.getLogger(RegisteredTypeConstraints.BasicRegisteredTypeConstraint.class);
+    
+    public final static class BasicRegisteredTypeConstraint implements 
RegisteredTypeConstraint {
+        private RegisteredTypeKind kind;
+        private Class<?> javaSuperType;
+        private Set<String> encounteredTypes;
+        
+        private BasicRegisteredTypeConstraint() {}
+        
+        public BasicRegisteredTypeConstraint(RegisteredTypeConstraint source) {
+            if (source==null) return;
+            
+            this.kind = source.getKind();
+            this.javaSuperType = source.getJavaSuperType();
+            this.encounteredTypes = source.getEncounteredTypes();
+        }
+
+        @Override
+        public RegisteredTypeKind getKind() {
+            return kind;
+        }
+        
+        @Override
+        public Class<?> getJavaSuperType() {
+            if (javaSuperType==null) return Object.class;
+            return javaSuperType;
+        }
+
+        @Override
+        public Set<String> getEncounteredTypes() {
+            if (encounteredTypes==null) return ImmutableSet.of();
+            return ImmutableSet.<String>copyOf(encounteredTypes);
+        }
+        
+        @Override
+        public String toString() {
+            return 
super.toString()+"["+kind+","+javaSuperType+","+encounteredTypes+"]";
+        }
+    }
+
+    /** returns a constraint which allows anything */
+    public static RegisteredTypeConstraint any() {
+        return new BasicRegisteredTypeConstraint();
+    }
+
+    public static RegisteredTypeConstraint alreadyVisited(Set<String> 
encounteredTypeSymbolicNames) {
+        BasicRegisteredTypeConstraint result = new 
BasicRegisteredTypeConstraint();
+        result.encounteredTypes = encounteredTypeSymbolicNames;
+        return result;
+    }
+    public static RegisteredTypeConstraint alreadyVisited(Set<String> 
encounteredTypeSymbolicNames, String anotherEncounteredType) {
+        BasicRegisteredTypeConstraint result = new 
BasicRegisteredTypeConstraint();
+        result.encounteredTypes = 
MutableSet.copyOf(encounteredTypeSymbolicNames);
+        if (anotherEncounteredType!=null) 
result.encounteredTypes.add(anotherEncounteredType);
+        return result;
+    }
+    
+    private static RegisteredTypeConstraint of(RegisteredTypeKind kind, 
Class<? extends BrooklynObject> javaSuperType) {
+        BasicRegisteredTypeConstraint result = new 
BasicRegisteredTypeConstraint();
+        result.kind = kind;
+        result.javaSuperType = javaSuperType;
+        return result;
+    }
+
+    public static RegisteredTypeConstraint spec(Class<? extends 
BrooklynObject> javaSuperType) {
+        return of(RegisteredTypeKind.SPEC, javaSuperType);
+    }
+
+    public static <T extends AbstractBrooklynObjectSpec<?,?>> 
RegisteredTypeConstraint extendedWithSpecSuperType(RegisteredTypeConstraint 
source, Class<T> specSuperType) {
+        Class<?> superType = lookupTargetTypeForSpec(specSuperType);
+        BasicRegisteredTypeConstraint constraint = new 
BasicRegisteredTypeConstraint(source);
+        if (source==null) source = constraint;
+        if (source.getJavaSuperType()==null || 
source.getJavaSuperType().isAssignableFrom( superType )) {
+            // the constraint was weaker than present; return the new 
constraint
+            return constraint;
+        }
+        if (superType.isAssignableFrom( source.getJavaSuperType() )) {
+            // the constraint was already for something more specific; ignore 
what we've inferred here
+            return source;
+        }
+        // trickier situation; the constraint had a type not compatible with 
the spec type; log a warning and leave alone
+        // (e.g. caller specified some java super type which is not a super or 
sub of the spec target type;
+        // this may be because the caller specified a Spec as the type 
supertype, which is wrong;
+        // or they may have specified an interface along a different 
hierarchy, which we discouraged
+        // as it will make filtering/indexing more complex)
+        log.warn("Ambiguous spec supertypes ("+specSuperType+" for target 
"+source.getJavaSuperType()+"); "
+            + "it is recommended that any registered type constraint for a 
spec be compatible with the spec type");
+        return source;
+    }
+    
+    /** given a spec, returns the class of the item it targets, for instance 
{@link EntitySpec} for {@link Entity} */
+    private static <T extends AbstractBrooklynObjectSpec<?,?>> Class<? extends 
BrooklynObject> lookupTargetTypeForSpec(Class<T> specSuperType) {
+        if (specSuperType==null) return BrooklynObject.class;
+        BrooklynObjectType best = null;
+
+        for (BrooklynObjectType t: BrooklynObjectType.values()) {
+            if (t.getSpecType()==null) continue;
+            if (!t.getSpecType().isAssignableFrom(specSuperType)) continue;
+            // on equality, exit immediately
+            if (t.getSpecType().equals(specSuperType)) return 
t.getInterfaceType();
+            // else pick which is best
+            if (best==null) { best = t; continue; }
+            // if t is more specific, it is better (handles case when e.g. a 
Policy is a subclass of Entity)
+            if (best.getSpecType().isAssignableFrom(t.getSpecType())) { best = 
t; continue; }
+        }
+        if (best==null) {
+            log.warn("Unexpected spec supertype ("+specSuperType+"); treating 
as any "+BrooklynObject.class, new Throwable("Trace for unexpected spec 
supertype"));
+            return BrooklynObject.class;
+        }
+        // the spec is more specific, but we're not familiar with it here; 
return the best
+        return best.getInterfaceType();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
 
b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
index 7c719f2..271add5 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java
@@ -20,6 +20,7 @@ package org.apache.brooklyn.core.typereg;
 
 import javax.annotation.Nullable;
 
+import org.apache.brooklyn.api.catalog.BrooklynCatalog;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
@@ -34,37 +35,37 @@ import com.google.common.base.Predicates;
 
 public class RegisteredTypePredicates {
 
-//    public static Predicate<RegisteredType> deprecated(final boolean 
deprecated) {
-//        return new DeprecatedEqualTo(deprecated);
-//    }
-//
-//    private static class DeprecatedEqualTo implements 
Predicate<RegisteredType> {
-//        private final boolean deprecated;
-//        
-//        public DeprecatedEqualTo(boolean deprecated) {
-//            this.deprecated = deprecated;
-//        }
-//        @Override
-//        public boolean apply(@Nullable RegisteredType item) {
-//            return (item != null) && item.isDeprecated() == deprecated;
-//        }
-//    }
-//
-//    public static Predicate<RegisteredType> disabled(boolean disabled) {
-//        return new DisabledEqualTo(disabled);
-//    }
-//
-//    private static class DisabledEqualTo implements 
Predicate<RegisteredType> {
-//        private final boolean disabled;
-//        
-//        public DisabledEqualTo(boolean disabled) {
-//            this.disabled = disabled;
-//        }
-//        @Override
-//        public boolean apply(@Nullable RegisteredType item) {
-//            return (item != null) && item.isDisabled() == disabled;
-//        }
-//    }
+    public static Predicate<RegisteredType> deprecated(final boolean 
deprecated) {
+        return new DeprecatedEqualTo(deprecated);
+    }
+
+    private static class DeprecatedEqualTo implements 
Predicate<RegisteredType> {
+        private final boolean deprecated;
+        
+        public DeprecatedEqualTo(boolean deprecated) {
+            this.deprecated = deprecated;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return (item != null) && item.isDeprecated() == deprecated;
+        }
+    }
+
+    public static Predicate<RegisteredType> disabled(boolean disabled) {
+        return new DisabledEqualTo(disabled);
+    }
+
+    private static class DisabledEqualTo implements Predicate<RegisteredType> {
+        private final boolean disabled;
+        
+        public DisabledEqualTo(boolean disabled) {
+            this.disabled = disabled;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return (item != null) && item.isDisabled() == disabled;
+        }
+    }
 
     @SuppressWarnings("unused")
     private static final Function<RegisteredType,String> 
ID_OF_ITEM_TRANSFORMER_ANONYMOUS = new Function<RegisteredType, String>() {
@@ -140,6 +141,10 @@ public class RegisteredTypePredicates {
     }
 
     public static final Predicate<RegisteredType> IS_APPLICATION = 
javaTypeAssignableFrom(Application.class);
+    // TODO do we need this?  introduced already deprecated in 0.9.0 so can be 
removed, or enabled
+    @Deprecated
+    public static final Predicate<RegisteredType> IS_TEMPLATE = IS_APPLICATION;
+    
     public static final Predicate<RegisteredType> IS_ENTITY = 
javaTypeAssignableFrom(Entity.class);
     public static final Predicate<RegisteredType> IS_LOCATION = 
javaTypeAssignableFrom(Location.class);
     public static final Predicate<RegisteredType> IS_POLICY = 
javaTypeAssignableFrom(Policy.class);
@@ -161,20 +166,26 @@ public class RegisteredTypePredicates {
         }
     }
  
-//    public static Predicate<RegisteredType> isBestVersion(final 
ManagementContext mgmt) {
-//        return new IsBestVersion(mgmt);
-//    }
-//    
-//    private static class IsBestVersion implements Predicate<RegisteredType> {
-//        private final ManagementContext mgmt;
-//        
-//        public IsBestVersion(ManagementContext mgmt) {
-//            this.mgmt = mgmt;
-//        }
-//        @Override
-//        public boolean apply(@Nullable RegisteredType item) {
-//            return CatalogUtils.isBestVersion(mgmt, item);
-//        }
-//    }
-    
+    public static Predicate<RegisteredType> isBestVersion(final 
ManagementContext mgmt) {
+        return new IsBestVersion(mgmt);
+    }
+
+    private static class IsBestVersion implements Predicate<RegisteredType> {
+        private final ManagementContext mgmt;
+
+        public IsBestVersion(ManagementContext mgmt) {
+            this.mgmt = mgmt;
+        }
+        @Override
+        public boolean apply(@Nullable RegisteredType item) {
+            return isBestVersion(mgmt, item);
+        }
+    }
+ 
+    public static boolean isBestVersion(ManagementContext mgmt, RegisteredType 
item) {
+        RegisteredType bestVersion = 
mgmt.getTypeRegistry().get(item.getSymbolicName(), 
BrooklynCatalog.DEFAULT_VERSION);
+        if (bestVersion==null) return false;
+        return (bestVersion.getVersion().equals(item.getVersion()));
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java 
b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
index 0668d0a..6013f6d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java
@@ -21,15 +21,56 @@ package org.apache.brooklyn.core.typereg;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.core.plan.PlanToSpecTransformer;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.javalang.JavaClassNames;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
 
 public class RegisteredTypes {
 
+    /** @deprecated since it was introduced in 0.9.0; for backwards 
compatibility only, may be removed at any point */
+    @Deprecated
+    static final Function<CatalogItem<?,?>,RegisteredType> CI_TO_RT = new 
Function<CatalogItem<?,?>, RegisteredType>() {
+        @Override
+        public RegisteredType apply(CatalogItem<?, ?> item) {
+            return of(item);
+        }
+    };
+    
+    /** @deprecated since it was introduced in 0.9.0; for backwards 
compatibility only, may be removed at any point */
+    @Deprecated
+    public static RegisteredType of(CatalogItem<?, ?> item) {
+        if (item==null) return null;
+        TypeImplementation impl = null;
+        if (item.getPlanYaml()!=null) {
+            impl = new TypeImplementation(null, item.getPlanYaml());
+        } else if (item.getJavaType()!=null) {
+            impl = new JavaTypeImplementation(item.getJavaType());
+        } else {
+            throw new IllegalStateException("Unsupported catalog item "+item+" 
when trying to create RegisteredType");
+        }
+        
+        RegisteredSpecType type = new 
RegisteredSpecType(item.getSymbolicName(), item.getVersion(),
+            item.getCatalogItemJavaType(), impl);
+        type.bundles = 
MutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries());
+        type.displayName = item.getDisplayName();
+        type.description = item.getDescription();
+        type.iconUrl = item.getIconUrl();
+        type.disabled = item.isDisabled();
+        type.deprecated = item.isDeprecated();
+
+        // TODO
+        // javaType, specType, registeredTypeName ...
+        // tags ?
+        return type;
+    }
+
     /** Visitor adapter which can be used to ensure all kinds are supported */
     public static abstract class RegisteredTypeKindVisitor<T> {
         public T visit(RegisteredType type) {
@@ -60,6 +101,8 @@ public class RegisteredTypes {
         String displayName;
         String description;
         String iconUrl;
+        boolean deprecated;
+        boolean disabled;
 
         // TODO ensure this is re-populated on rebind
         transient Class<?> javaType;
@@ -106,9 +149,27 @@ public class RegisteredTypes {
         }
         
         @Override
+        public boolean isDisabled() {
+            return disabled;
+        }
+        
+        @Override
+        public boolean isDeprecated() {
+            return deprecated;
+        }
+        
+        @Override
         public Class<?> getJavaType() {
             return javaType;
         }
+        
+        @Override
+        public String toString() {
+            return JavaClassNames.simpleClassName(this)+"["+getId()+
+                (isDisabled() ? ";DISABLED" : "")+
+                (isDeprecated() ? ";deprecated" : "")+
+                "]";
+        }
     }
 
     // TODO
@@ -131,12 +192,12 @@ public class RegisteredTypes {
     }
 
     public static class TypeImplementation {
-        final String kind;
+        final String format;
         final Object data;
         
         public TypeImplementation(String kind, Object data) {
             super();
-            this.kind = kind;
+            this.format = kind;
             this.data = data;
         }
 
@@ -145,8 +206,8 @@ public class RegisteredTypes {
          * but in general we should look to determine the kind as early as 
possible and use that
          * to retrieve the appropriate such transformer.
          */
-        public String getKind() {
-            return kind;
+        public String getFormat() {
+            return format;
         }
         
         public Object getData() {
@@ -155,18 +216,18 @@ public class RegisteredTypes {
     }
     
     public static class JavaTypeImplementation extends TypeImplementation {
-        public static final String KIND = "java";
+        public static final String FORMAT = "java";
         public JavaTypeImplementation(String javaType) {
-            super(KIND, javaType);
+            super(FORMAT, javaType);
         }
         public String getJavaType() { return (String)getData(); }
     }
     
 //    // TODO remove, unless we want it
 //    public static class CampYamlTypeImplementation extends 
TypeImplementation {
-//        public static final String KIND = "camp";
+//        public static final String FORMAT = "camp";
 //        public CampYamlTypeImplementation(String javaType) {
-//            super(KIND, javaType);
+//            super(FORMAT, javaType);
 //        }
 //        public String getCampYaml() { return (String)getData(); }
 //    }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java
 
b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java
deleted file mode 100644
index a448418..0000000
--- 
a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java
+++ /dev/null
@@ -1,47 +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.catalog.internal;
-
-import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
-import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
-
-import com.google.common.annotations.Beta;
-
-public class CatalogTestUtils {
-
-    /** creates entity spec with the java type of a catalog item;
-     * would be nice to have this in {@link CatalogUtils},
-     * but the logic for parsing the yaml is buried in camp code,
-     * so it's a little bit hard to make this a first class method.
-     * <p>
-     * (this impl ignores many things, including config and location.)
-     */
-    @Beta
-    public static EntitySpec<?> createEssentialEntitySpec(ManagementContext 
mgmt, CatalogItem<?, ?> catalogItem) {
-        BrooklynClassLoadingContext loader = 
CatalogUtils.newClassLoadingContext(mgmt, catalogItem);
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        EntitySpec<?> spec = EntitySpec.create( 
(Class)loader.loadClass(catalogItem.getJavaType()) );
-        spec.catalogItemId(catalogItem.getId());
-        return spec;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
index b434aa1..118ca39 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java
@@ -18,34 +18,24 @@
  */
 package org.apache.brooklyn.core.mgmt.osgi;
 
-import org.apache.brooklyn.util.osgi.OsgiTestResources;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
 import java.util.List;
 
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.launch.Framework;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.BrooklynObject;
 import org.apache.brooklyn.api.policy.PolicySpec;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.catalog.internal.CatalogEntityItemDto;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemDtoAbstract;
-import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
 import org.apache.brooklyn.core.effector.Effectors;
 import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.objs.proxy.InternalEntityFactory;
@@ -53,14 +43,23 @@ import 
org.apache.brooklyn.core.objs.proxy.InternalPolicyFactory;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.test.support.TestResourceUnavailableException;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.core.osgi.OsgiTestBase;
 import org.apache.brooklyn.util.core.osgi.Osgis;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.os.Os;
+import org.apache.brooklyn.util.osgi.OsgiTestResources;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.launch.Framework;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
-import org.apache.brooklyn.util.core.osgi.OsgiTestBase;
 
 
 /** 
@@ -135,18 +134,18 @@ public class OsgiVersionMoreEntityTest {
         }
     }
     
-    protected CatalogItem<?, ?> addCatalogItemWithTypeAsName(String type, 
String version, String ...libraries) {
+    protected RegisteredType addCatalogItemWithTypeAsName(String type, String 
version, String ...libraries) {
         return addCatalogItemWithNameAndType(type, version, type, libraries);
     }
-    protected CatalogItem<?, ?> addCatalogItemWithNameAndType(String symName, 
String version, String type, String ...libraries) {
+    protected RegisteredType addCatalogItemWithNameAndType(String symName, 
String version, String type, String ...libraries) {
         return addCatalogItemWithNameAndType(mgmt, symName, version, type, 
libraries);
     }
 
     @SuppressWarnings("deprecation")
-    static CatalogItem<?, ?> addCatalogItemWithNameAndType(ManagementContext 
mgmt, String symName, String version, String type, String ...libraries) {
+    static RegisteredType addCatalogItemWithNameAndType(ManagementContext 
mgmt, String symName, String version, String type, String ...libraries) {
         CatalogEntityItemDto c1 = newCatalogItemWithNameAndType(symName, 
version, type, libraries);
         mgmt.getCatalog().addItem(c1);
-        CatalogItem<?, ?> c2 = mgmt.getCatalog().getCatalogItem(symName, 
version);
+        RegisteredType c2 = mgmt.getTypeRegistry().get(symName, version);
         Preconditions.checkNotNull(c2, "Item "+type+":"+version+" was not 
found after adding it");
         return c2;
     }
@@ -163,12 +162,13 @@ public class OsgiVersionMoreEntityTest {
         return c1;
     }
 
-    protected Entity addItemFromCatalog(CatalogItem<?, ?> c2) {
+    protected Entity addItemFromCatalog(RegisteredType c2) {
         return addItemFromCatalog(mgmt, app, c2);
     }
     
-    public static Entity addItemFromCatalog(ManagementContext mgmt, 
TestApplication parent, CatalogItem<?, ?> c2) {
-        return parent.createAndManageChild( 
CatalogTestUtils.createEssentialEntitySpec(mgmt, c2) );
+    @SuppressWarnings("unchecked")
+    public static Entity addItemFromCatalog(ManagementContext mgmt, 
TestApplication parent, RegisteredType c2) {
+        return parent.createAndManageChild( 
mgmt.getTypeRegistry().createSpec(c2, null, EntitySpec.class) );
     }
 
     public static void assertV1MethodCall(Entity me) throws 
IllegalAccessException, InvocationTargetException, NoSuchMethodException {
@@ -199,7 +199,7 @@ public class OsgiVersionMoreEntityTest {
         return me.invoke(Effectors.effector(String.class, 
"sayHI").buildAbstract(), ImmutableMap.of("name", "brooklyn")).getUnchecked();
     }
 
-    public static CatalogItem<?, ?> addMoreEntityV1(ManagementContext mgmt, 
String versionToRegister) {
+    public static RegisteredType addMoreEntityV1(ManagementContext mgmt, 
String versionToRegister) {
         
TestResourceUnavailableException.throwIfResourceUnavailable(OsgiVersionMoreEntityTest.class,
 BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         return addCatalogItemWithNameAndType(mgmt,
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
@@ -207,7 +207,7 @@ public class OsgiVersionMoreEntityTest {
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
             BROOKLYN_TEST_MORE_ENTITIES_V1_URL);
     }
-    public static CatalogItem<?, ?> addMoreEntityV2(ManagementContext mgmt, 
String versionToRegister) {
+    public static RegisteredType addMoreEntityV2(ManagementContext mgmt, 
String versionToRegister) {
         
TestResourceUnavailableException.throwIfResourceUnavailable(OsgiVersionMoreEntityTest.class,
 BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         return addCatalogItemWithNameAndType(mgmt,
             OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
@@ -221,7 +221,7 @@ public class OsgiVersionMoreEntityTest {
     public void testMoreEntitiesV1() throws Exception {
         
TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), 
BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
 
-        CatalogItem<?, ?> c2 = addMoreEntityV1(mgmt, TEST_VERSION);
+        RegisteredType c2 = addMoreEntityV1(mgmt, TEST_VERSION);
         
         // test load and instantiate
         Entity me = addItemFromCatalog(c2);
@@ -231,18 +231,13 @@ public class OsgiVersionMoreEntityTest {
         assertV1EffectorCall(me);
         
         // test adding a child gets the right type; this time by entity parent 
hierarchy
-        BrooklynClassLoadingContext loader = 
CatalogUtils.newClassLoadingContext(mgmt, c2);
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        Entity me2 = me.addChild(EntitySpec.create( 
(Class)loader.loadClass(c2.getJavaType()) ));
+        @SuppressWarnings({ "unchecked" })
+        Entity me2 = me.addChild( mgmt.getTypeRegistry().createSpec(c2, null, 
EntitySpec.class) );
         Assert.assertEquals(me2.getCatalogItemId(), 
CatalogUtils.getVersionedId(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
 TEST_VERSION));
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    protected PolicySpec<?> getPolicySpec(CatalogItem<?, ?> cp) {
-        BrooklynClassLoadingContext loader = 
CatalogUtils.newClassLoadingContext(mgmt, cp);
-        PolicySpec spec = PolicySpec.create( 
(Class)loader.loadClass(cp.getJavaType()) );
-        spec.catalogItemId(cp.getId());
-        return spec;
+    protected PolicySpec<?> getPolicySpec(RegisteredType cp) {
+        return mgmt.getTypeRegistry().createSpec(cp, null, PolicySpec.class);
     }
 
     @Test
@@ -250,7 +245,7 @@ public class OsgiVersionMoreEntityTest {
         
TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), 
BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         
TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), 
BROOKLYN_TEST_OSGI_ENTITIES_PATH);
 
-        CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName(
+        RegisteredType c2 = addCatalogItemWithTypeAsName(
                 OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
                 TEST_VERSION,
                 BROOKLYN_TEST_MORE_ENTITIES_V1_URL);
@@ -258,13 +253,13 @@ public class OsgiVersionMoreEntityTest {
         // test load and instantiate
         Entity me = addItemFromCatalog(c2);
 
-        CatalogItem<?, ?> cp = addCatalogItemWithTypeAsName(
+        RegisteredType cp = addCatalogItemWithTypeAsName(
                 OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_SIMPLE_POLICY,
                 TEST_VERSION,
                 BROOKLYN_TEST_OSGI_ENTITIES_URL);
         me.policies().add(getPolicySpec(cp));
         
-        Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of 
policies: "+me.getPolicies());
+        Assert.assertEquals(me.policies().size(), 1, "Wrong number of 
policies: "+MutableList.copyOf(me.policies()));
         
         String catalogItemId = Iterables.getOnlyElement( me.policies() 
).getCatalogItemId();
         Assert.assertNotNull(catalogItemId);
@@ -277,7 +272,7 @@ public class OsgiVersionMoreEntityTest {
     public void testMoreEntitiesV2FailsWithoutBasicTestOsgiEntitiesBundle() 
throws Exception {
         
TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), 
BROOKLYN_TEST_MORE_ENTITIES_V2_PATH);
 
-        CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName(
+        RegisteredType c2 = addCatalogItemWithTypeAsName(
                 OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
                 TEST_VERSION,
                 BROOKLYN_TEST_MORE_ENTITIES_V2_URL);
@@ -299,7 +294,7 @@ public class OsgiVersionMoreEntityTest {
     public void testMoreEntitiesV2() throws Exception {
         
TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), 
BROOKLYN_TEST_MORE_ENTITIES_V2_PATH);
 
-        CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName(
+        RegisteredType c2 = addCatalogItemWithTypeAsName(
                 OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
                 TEST_VERSION,
                 BROOKLYN_TEST_MORE_ENTITIES_V2_URL,
@@ -311,7 +306,7 @@ public class OsgiVersionMoreEntityTest {
         
         assertV2MethodCall(me);
         assertV2EffectorCall(me);
-        Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of 
policies: "+me.getPolicies());
+        Assert.assertEquals(me.policies().size(), 1, "Wrong number of 
policies: "+MutableList.copyOf(me.policies()));
         
         String catalogItemId = Iterables.getOnlyElement( me.policies() 
).getCatalogItemId();
         Assert.assertNotNull(catalogItemId);
@@ -334,11 +329,11 @@ public class OsgiVersionMoreEntityTest {
                 BROOKLYN_TEST_MORE_ENTITIES_V2_URL, 
BROOKLYN_TEST_OSGI_ENTITIES_URL);
         
         // test load and instantiate
-        Entity me = addItemFromCatalog( 
mgmt.getCatalog().getCatalogItem(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
 TEST_VERSION) );
+        Entity me = addItemFromCatalog( 
mgmt.getTypeRegistry().get(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
 TEST_VERSION) );
         
         assertV2MethodCall(me);
         assertV2EffectorCall(me);
-        Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of 
policies: "+me.getPolicies());
+        Assert.assertEquals(me.policies().size(), 1, "Wrong number of 
policies: "+MutableList.copyOf(me.policies()));
     }
 
     @Test
@@ -356,7 +351,7 @@ public class OsgiVersionMoreEntityTest {
                 BROOKLYN_TEST_MORE_ENTITIES_V1_URL);
         
         // test load and instantiate
-        Entity me = addItemFromCatalog( 
mgmt.getCatalog().getCatalogItem(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
 TEST_VERSION) );
+        Entity me = addItemFromCatalog( 
mgmt.getTypeRegistry().get(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY,
 TEST_VERSION) );
         /*
          * WARNING - Weird maven-bundle-plugin and OSGi behaviour.  Some 
caveats:
          * <p>
@@ -383,7 +378,7 @@ public class OsgiVersionMoreEntityTest {
          */
         assertV1MethodCall(me);
         assertV1EffectorCall(me);
-        Assert.assertEquals(me.getPolicies().size(), 0, "Wrong number of 
policies: "+me.getPolicies());
+        Assert.assertEquals(me.policies().size(), 0, "Wrong number of 
policies: "+MutableList.copyOf(me.policies()));
     }
 
     @Test
@@ -438,20 +433,20 @@ public class OsgiVersionMoreEntityTest {
 
         // test entity resolution
         
-        Entity v2 = addItemFromCatalog( mgmt.getCatalog().getCatalogItem("v2", 
TEST_VERSION) );
+        Entity v2 = addItemFromCatalog( mgmt.getTypeRegistry().get("v2", 
TEST_VERSION) );
         assertV2MethodCall(v2);
         assertV2EffectorCall(v2);
-        Assert.assertEquals(v2.getPolicies().size(), 1, "Wrong number of 
policies: "+v2.getPolicies());
+        Assert.assertEquals(v2.policies().size(), 1, "Wrong number of 
policies: "+MutableList.copyOf(v2.policies()));
 
-        Entity v2_evil = addItemFromCatalog( 
mgmt.getCatalog().getCatalogItem("v2-evil", TEST_VERSION) );
+        Entity v2_evil = addItemFromCatalog( 
mgmt.getTypeRegistry().get("v2-evil", TEST_VERSION) );
         assertV2EvilTwinMethodCall(v2_evil);
         assertV2EvilTwinEffectorCall(v2_evil);
-        Assert.assertEquals(v2_evil.getPolicies().size(), 1, "Wrong number of 
policies: "+v2_evil.getPolicies());
+        Assert.assertEquals(v2_evil.policies().size(), 1, "Wrong number of 
policies: "+MutableList.copyOf(v2_evil.policies()));
 
-        Entity v1 = addItemFromCatalog( mgmt.getCatalog().getCatalogItem("v1", 
TEST_VERSION) );
+        Entity v1 = addItemFromCatalog( mgmt.getTypeRegistry().get("v1", 
TEST_VERSION) );
         assertV1MethodCall(v1);
         assertV1EffectorCall(v1);
-        Assert.assertEquals(v1.getPolicies().size(), 0, "Wrong number of 
policies: "+v1.getPolicies());
+        Assert.assertEquals(v1.policies().size(), 0, "Wrong number of 
policies: "+MutableList.copyOf(v1.policies()));
     }
 
     // TODO versioning (WIP until #92), install both V1 and V2 with version 
number, and test that both work

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
index 6bd850a..662e78d 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
@@ -43,9 +43,9 @@ import org.apache.brooklyn.api.objs.BrooklynObjectType;
 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.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemDtoAbstract;
-import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.location.SimulatedLocation;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest;
@@ -304,11 +304,11 @@ public class XmlMementoSerializerTest {
         
TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), 
OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_V1_PATH);
         ManagementContext mgmt = 
LocalManagementContextForTests.builder(true).disableOsgi(false).build();
         try {
-            CatalogItem<?, ?> ci = 
OsgiVersionMoreEntityTest.addMoreEntityV1(mgmt, "1.0");
+            RegisteredType ci = 
OsgiVersionMoreEntityTest.addMoreEntityV1(mgmt, "1.0");
             
             EntitySpec<DynamicCluster> spec = 
EntitySpec.create(DynamicCluster.class)
                 .configure(DynamicCluster.INITIAL_SIZE, 1)
-                .configure(DynamicCluster.MEMBER_SPEC, 
CatalogTestUtils.createEssentialEntitySpec(mgmt, ci));
+                .configure(DynamicCluster.MEMBER_SPEC, 
mgmt.getTypeRegistry().createSpec(ci, null, EntitySpec.class));
     
             serializer.setLookupContext(new LookupContextImpl(mgmt,
                 ImmutableList.<Entity>of(), ImmutableList.<Location>of(), 
ImmutableList.<Policy>of(),

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
index f420b43..7781b9b 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java
@@ -18,20 +18,18 @@
  */
 package org.apache.brooklyn.core.mgmt.rebind;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest;
-import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl;
 import org.apache.brooklyn.core.mgmt.rebind.transformer.CompoundTransformer;
 import org.apache.brooklyn.entity.group.DynamicCluster;
 import org.apache.brooklyn.util.collections.MutableList;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
 
 public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp {
 
@@ -54,13 +52,13 @@ public class ActivePartialRebindVersionTest extends 
RebindTestFixtureWithApp {
     
     @Test
     public void testSwitchingVersions() throws Exception {
-        CatalogItem<?, ?> catV1 = 
OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0");
+        RegisteredType catV1 = 
OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0");
         Entity childV1 = 
OsgiVersionMoreEntityTest.addItemFromCatalog(origManagementContext, origApp, 
catV1);
         
         OsgiVersionMoreEntityTest.assertV1EffectorCall(childV1);
         
         // simply adding to catalog doesn't change
-        CatalogItem<?, ?> catV2 = 
OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1");
+        RegisteredType catV2 = 
OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1");
         OsgiVersionMoreEntityTest.assertV1EffectorCall(childV1);
         Entity child2V2 = 
OsgiVersionMoreEntityTest.addItemFromCatalog(origManagementContext, origApp, 
catV2);
         OsgiVersionMoreEntityTest.assertV2EffectorCall(child2V2);
@@ -83,8 +81,8 @@ public class ActivePartialRebindVersionTest extends 
RebindTestFixtureWithApp {
 
     @Test
     public void testSwitchingVersionsInCluster() throws Exception {
-        CatalogItem<?, ?> catV1 = 
OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0");
-        CatalogItem<?, ?> catV2 = 
OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1");
+        RegisteredType catV1 = 
OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0");
+        RegisteredType catV2 = 
OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1");
         
         // could do a yaml test in a downstream project (no camp available 
here)
 //        CreationResult<List<Entity>, List<String>> clusterR = 
EntityManagementUtils.addChildren(origApp, 
@@ -94,7 +92,7 @@ public class ActivePartialRebindVersionTest extends 
RebindTestFixtureWithApp {
 //            + "  entitySpec: { type: "+catV1.getId()+" }\n", true);
         DynamicCluster cluster = 
origApp.createAndManageChild(EntitySpec.create(DynamicCluster.class)
             .configure(DynamicCluster.INITIAL_SIZE, 1)
-            .configure(DynamicCluster.MEMBER_SPEC, 
CatalogTestUtils.createEssentialEntitySpec(origManagementContext, catV1))
+            .configure(DynamicCluster.MEMBER_SPEC, 
origManagementContext.getTypeRegistry().createSpec(catV1, null, 
EntitySpec.class))
             );
         cluster.start(MutableList.of(origApp.newSimulatedLocation()));
         Entity childV1 = MutableList.copyOf(cluster.getChildren()).get(1);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
index 2bea3a2..e336a4f 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
@@ -29,6 +29,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.core.BrooklynFeatureEnablement;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogDto;
@@ -44,6 +45,7 @@ import org.apache.brooklyn.core.test.entity.TestEntity;
 import 
org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -262,14 +264,14 @@ public class RebindCatalogItemTest extends 
RebindTestFixtureWithApp {
         item.setDeprecated(true);
         catalog.persist(item);
         rebindAndAssertCatalogsAreEqual();
-        CatalogItem<?, ?> catalogItemAfterRebind = 
newManagementContext.getCatalog().getCatalogItem("rebind-yaml-catalog-item-test",
 TEST_VERSION);
+        RegisteredType catalogItemAfterRebind = 
newManagementContext.getTypeRegistry().get("rebind-yaml-catalog-item-test", 
TEST_VERSION);
         assertTrue(catalogItemAfterRebind.isDeprecated(), "Expected item to be 
deprecated");
     }
 
     protected void deleteItem(ManagementContext mgmt, String symbolicName, 
String version) {
         mgmt.getCatalog().deleteCatalogItem(symbolicName, version);
         LOG.info("Deleted item from catalog: {}:{}", symbolicName, version);
-        assertCatalogDoesNotContain(mgmt.getCatalog(), symbolicName, version);
+        Assert.assertNull( mgmt.getTypeRegistry().get(symbolicName, version) );
     }
     
     private void rebindAndAssertCatalogsAreEqual() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
index 921ea9e..0135229 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java
@@ -317,14 +317,14 @@ public abstract class RebindTestFixture<T extends 
StartableApplication> {
         assertEquals(actual.getLibraries(), expected.getLibraries());
     }
     
-    protected void assertCatalogContains(BrooklynCatalog catalog, 
CatalogItem<?, ?> item) {
-        CatalogItem<?, ?> found = 
catalog.getCatalogItem(item.getSymbolicName(), item.getVersion());
-        assertNotNull(found);
-        assertCatalogItemsEqual(found, item);
-    }
-    
-    protected void assertCatalogDoesNotContain(BrooklynCatalog catalog, String 
symbolicName, String version) {
-        CatalogItem<?, ?> found = catalog.getCatalogItem(symbolicName, 
version);
-        assertNull(found);
-    }
+//    protected void assertCatalogContains(BrooklynCatalog catalog, 
CatalogItem<?, ?> item) {
+//        CatalogItem<?, ?> found = 
catalog.getCatalogItem(item.getSymbolicName(), item.getVersion());
+//        assertNotNull(found);
+//        assertCatalogItemsEqual(found, item);
+//    }
+//    
+//    protected void assertCatalogDoesNotContain(BrooklynCatalog catalog, 
String symbolicName, String version) {
+//        CatalogItem<?, ?> found = catalog.getCatalogItem(symbolicName, 
version);
+//        assertNull(found);
+//    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java
new file mode 100644
index 0000000..145c056
--- /dev/null
+++ 
b/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java
@@ -0,0 +1,172 @@
+/*
+ * 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.typereg;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+import org.apache.brooklyn.api.catalog.CatalogItem;
+import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
+import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicates;
+
+
+public class RegisteredTypePredicatesTest {
+    private LocalManagementContext mgmt;
+    
+    @BeforeMethod(alwaysRun = true)
+    public void setUp() throws Exception {
+        mgmt = LocalManagementContextForTests.newInstance();
+    }
+    
+    @AfterMethod(alwaysRun = true)
+    public void tearDown() throws Exception {
+        if (mgmt != null) Entities.destroyAll(mgmt);
+    }
+
+    @Test
+    public void testDisplayName() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", 
"1.0")
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .displayName("myname")
+                .build());
+
+        
assertTrue(RegisteredTypePredicates.displayName(Predicates.equalTo("myname")).apply(item));
+        
assertFalse(RegisteredTypePredicates.displayName(Predicates.equalTo("wrongname")).apply(item));
+    }
+    
+    @Test
+    public void testDeprecated() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", 
"1.0")
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.deprecated(false).apply(item));
+        assertFalse(RegisteredTypePredicates.deprecated(true).apply(item));
+        
+        item = deprecateItem(item);
+        
+        assertFalse(RegisteredTypePredicates.deprecated(false).apply(item));
+        assertTrue(RegisteredTypePredicates.deprecated(true).apply(item));
+    }
+    
+    @Test
+    public void testDisabled() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", 
"1.0")
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.disabled(false).apply(item));
+        assertFalse(RegisteredTypePredicates.disabled(true).apply(item));
+        
+        item = disableItem(item);
+        
+        assertFalse(RegisteredTypePredicates.disabled(false).apply(item));
+        assertTrue(RegisteredTypePredicates.disabled(true).apply(item));
+    }
+    
+    @Test
+    public void testIsCatalogItemType() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", 
"1.0")
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.IS_ENTITY.apply(item));
+        assertFalse(RegisteredTypePredicates.IS_LOCATION.apply(item));
+    }
+    
+    @Test
+    public void testSymbolicName() {
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", 
"1.0")
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        
assertTrue(RegisteredTypePredicates.symbolicName(Predicates.equalTo("foo")).apply(item));
+        
assertFalse(RegisteredTypePredicates.symbolicName(Predicates.equalTo("wrongname")).apply(item));
+    }
+
+    @Test
+    public void testIsBestVersion() {
+        RegisteredType itemV1 = createItem(CatalogItemBuilder.newEntity("foo", 
"1.0")
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+        RegisteredType itemV2 = createItem(CatalogItemBuilder.newEntity("foo", 
"2.0")
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+        RegisteredType itemV3Disabled = 
createItem(CatalogItemBuilder.newEntity("foo", "3.0")
+                .disabled(true)
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV2));
+        
assertFalse(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV1));
+        
assertFalse(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV3Disabled));
+    }
+
+    @Test
+    public void testEntitledToSee() {
+        // TODO No entitlements configured, so everything allowed - therefore 
test not thorough enough!
+        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", 
"1.0")
+                .plan("services:\n- type: 
org.apache.brooklyn.entity.stock.BasicEntity")
+                .build());
+
+        assertTrue(RegisteredTypePredicates.entitledToSee(mgmt).apply(item));
+    }
+
+    // TODO do we need this predicate?
+//    @SuppressWarnings("deprecation")
+//    @Test
+//    public void testJavaType() {
+//        RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", 
"1.0")
+//                .javaType("org.apache.brooklyn.entity.stock.BasicEntity")
+//                .build());
+//
+//        
assertTrue(RegisteredTypePredicates.javaType(Predicates.equalTo("org.apache.brooklyn.entity.stock.BasicEntity")).apply(item));
+//        
assertFalse(RegisteredTypePredicates.javaType(Predicates.equalTo("wrongtype")).apply(item));
+//    }
+
+    @SuppressWarnings("deprecation")
+    protected RegisteredType createItem(CatalogItem<?,?> item) {
+        mgmt.getCatalog().addItem(item);
+        return RegisteredTypes.of(item);
+    }
+    
+    @SuppressWarnings({ "deprecation" })
+    protected <T, SpecT> RegisteredType deprecateItem(RegisteredType orig) {
+        CatalogItem<?,?> item = (CatalogItem<?,?>) 
mgmt.getCatalog().getCatalogItem(orig.getSymbolicName(), orig.getVersion());
+        item.setDeprecated(true);
+        mgmt.getCatalog().persist(item);
+        return RegisteredTypes.of(item);
+    }
+    
+    @SuppressWarnings({ "deprecation" })
+    protected RegisteredType disableItem(RegisteredType orig) {
+        CatalogItem<?,?> item = (CatalogItem<?,?>) 
mgmt.getCatalog().getCatalogItem(orig.getSymbolicName(), orig.getVersion());
+        item.setDisabled(true);
+        mgmt.getCatalog().persist(item);
+        return RegisteredTypes.of(item);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index b1044ee..a273c50 100644
--- 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -145,20 +145,20 @@ public class BrooklynComponentTemplateResolver {
         return serviceSpecResolver.accepts(type, loader);
     }
 
-    public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> 
encounteredRegisteredTypeIds) {
+    public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> 
encounteredRegisteredTypeSymbolicNames) {
         if (alreadyBuilt.getAndSet(true))
             throw new IllegalStateException("Spec can only be used once: 
"+this);
 
-        EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, 
encounteredRegisteredTypeIds);
+        EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, 
encounteredRegisteredTypeSymbolicNames);
 
         if (spec == null) {
             // Try to provide some troubleshooting details
             final String msgDetails;
-            RegisteredType item = 
mgmt.getTypeRegistry().get(Strings.removeFromStart(type, "catalog:"), null, 
null);
+            RegisteredType item = 
mgmt.getTypeRegistry().get(Strings.removeFromStart(type, "catalog:"));
             String proto = Urls.getProtocol(type);
-            if (item != null && 
encounteredRegisteredTypeIds.contains(item.getSymbolicName())) {
+            if (item != null && 
encounteredRegisteredTypeSymbolicNames.contains(item.getSymbolicName())) {
                 msgDetails = "Cycle between catalog items detected, starting 
from " + type +
-                        ". Other catalog items being resolved up the stack are 
" + encounteredRegisteredTypeIds +
+                        ". Other catalog items being resolved up the stack are 
" + encounteredRegisteredTypeSymbolicNames +
                         ". Tried loading it as a Java class instead but 
failed.";
             } else if (proto != null) {
                 msgDetails = "The reference " + type + " looks like a URL 
(running the CAMP Brooklyn assembly-template instantiator) but the protocol " +
@@ -170,7 +170,7 @@ public class BrooklynComponentTemplateResolver {
             throw new IllegalStateException("Unable to create spec for type " 
+ type + ". " + msgDetails);
         }
 
-        populateSpec(spec, encounteredRegisteredTypeIds);
+        populateSpec(spec, encounteredRegisteredTypeSymbolicNames);
 
         @SuppressWarnings("unchecked")
         EntitySpec<T> typedSpec = (EntitySpec<T>) spec;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
index 181265d..b1d5dce 100644
--- 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
@@ -32,6 +32,7 @@ import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import 
org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator.InstantiatorFromKey;
+import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 
@@ -108,9 +109,9 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
             String policyType = decoLoader.getTypeName().get();
             ManagementContext mgmt = 
instantiator.loader.getManagementContext();
             
-            RegisteredType item = mgmt.getTypeRegistry().get(policyType, 
BrooklynTypeRegistry.RegisteredTypeKind.SPEC, Policy.class);
+            RegisteredType item = mgmt.getTypeRegistry().get(policyType, 
RegisteredTypeConstraints.spec(Policy.class));
             PolicySpec<? extends Policy> spec;
-            if (item!=null) spec = mgmt.getTypeRegistry().createSpec(item, 
PolicySpec.class);
+            if (item!=null) spec = mgmt.getTypeRegistry().createSpec(item, 
null, PolicySpec.class);
             else spec = PolicySpec.create(decoLoader.getType(Policy.class));
             spec.configure( decoLoader.getConfigMap() );
             decorations.add(spec);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
index cacd201..35feb65 100644
--- 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
+++ 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java
@@ -87,7 +87,7 @@ public class CampToSpecTransformer implements 
PlanToSpecTransformer {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> 
SpecT createCatalogSpec(CatalogItem<T, SpecT> item, Set<String> 
encounteredTypes) {
-        // Ignore old-style java type catalog items
+        // Ignore old-style java type catalog items - there is a different 
(deprecated) transformer for that
         if (item.getPlanYaml() == null) {
             throw new PlanNotRecognizedException("Old style catalog item " + 
item + " not supported.");
         }
@@ -99,17 +99,6 @@ public class CampToSpecTransformer implements 
PlanToSpecTransformer {
         return (SpecT) CampCatalogUtils.createSpec(mgmt, (CatalogItem)item, 
encounteredTypes);
     }
 
-    // TODO
-//    @SuppressWarnings({ "unchecked", "rawtypes" })
-//    public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> 
SpecT createCatalogSpec(RegisteredType type, Set<String> encounteredTypes) {
-//        if (encounteredTypes.contains(type.getSymbolicName())) {
-//            throw new IllegalStateException("Already encountered types " + 
encounteredTypes + " must not contain catalog item being resolver " + 
type.getSymbolicName());
-//        }
-//
-//        // Not really clear what should happen to the top-level attributes, 
ignored until a good use case appears.
-//        return (SpecT) CampCatalogUtils.createSpec(mgmt, type, 
encounteredTypes);
-//    }
-
     @Override
     public void injectManagementContext(ManagementContext mgmt) {
         this.mgmt = mgmt;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
index f3050c5..6390425 100644
--- 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
+++ 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java
@@ -26,7 +26,6 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.policy.Policy;
@@ -40,16 +39,15 @@ import org.apache.brooklyn.camp.spi.pdp.DeploymentPlan;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import 
org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
 import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext;
-import 
org.apache.brooklyn.core.objs.BrooklynObjectInternal.ConfigurationSupportInternal;
 import org.apache.brooklyn.core.resolve.ResolveUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.yaml.Yamls;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 
+//TODO-type-registry
 public class CampUtils {
 
     public static List<EntitySpec<?>> createServiceSpecs(String plan, 
BrooklynClassLoadingContext loader, Set<String> encounteredTypes) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
index f65abb1..f038e0f 100644
--- 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
+++ 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
@@ -18,16 +18,16 @@
  */
 package org.apache.brooklyn.camp.brooklyn.spi.lookup;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.spi.AbstractResource;
 import org.apache.brooklyn.camp.spi.PlatformRootSummary;
 import org.apache.brooklyn.camp.spi.collection.ResolvableLink;
-import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class AbstractTemplateBrooklynLookup<T extends 
AbstractResource>  extends AbstractBrooklynResourceLookup<T> {
 
@@ -39,7 +39,7 @@ public abstract class AbstractTemplateBrooklynLookup<T 
extends AbstractResource>
 
     @Override
     public T get(String id) {
-        CatalogItem<?,?> item = getCatalogItem(id);
+        RegisteredType item = bmc.getTypeRegistry().get(id);
         if (item==null) {
             log.warn("Could not find item '"+id+"' in Brooklyn catalog; 
returning null");
             return null;
@@ -47,11 +47,7 @@ public abstract class AbstractTemplateBrooklynLookup<T 
extends AbstractResource>
         return adapt(item);
     }
 
-    private CatalogItem<?, ?> getCatalogItem(String versionedId) {
-        return CatalogUtils.getCatalogItemOptionalVersion(bmc, versionedId);
-    }
-
-    public abstract T adapt(CatalogItem<?,?> item);
+    public abstract T adapt(RegisteredType item);
 
     protected ResolvableLink<T> newLink(CatalogItem<? extends 
Entity,EntitySpec<?>> li) {
         return newLink(li.getId(), li.getDisplayName());

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
index af0b596..e30d9c6 100644
--- 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
+++ 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
@@ -26,6 +26,7 @@ import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import 
org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator;
 import org.apache.brooklyn.camp.spi.AssemblyTemplate;
 import org.apache.brooklyn.camp.spi.PlatformRootSummary;
@@ -39,7 +40,7 @@ public class AssemblyTemplateBrooklynLookup extends 
AbstractTemplateBrooklynLook
     }
 
     @Override
-    public AssemblyTemplate adapt(CatalogItem<?,?> item) {
+    public AssemblyTemplate adapt(RegisteredType item) {
         return AssemblyTemplate.builder().
                 name(item.getDisplayName()).
                 id(item.getId()).

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
index 19f5917..d70129a 100644
--- 
a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
+++ 
b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
@@ -25,6 +25,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.camp.spi.PlatformComponentTemplate;
 import org.apache.brooklyn.camp.spi.PlatformRootSummary;
 import org.apache.brooklyn.camp.spi.collection.ResolvableLink;
@@ -37,7 +38,7 @@ public class PlatformComponentTemplateBrooklynLookup extends 
AbstractTemplateBro
     }
 
     @Override
-    public PlatformComponentTemplate adapt(CatalogItem<?,?> item) {
+    public PlatformComponentTemplate adapt(RegisteredType item) {
         return PlatformComponentTemplate.builder().
                 name(item.getDisplayName()).
                 id(item.getId()).

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
 
b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
index 6e9e39c..3d991db 100644
--- 
a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
+++ 
b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java
@@ -231,7 +231,7 @@ public class JavaWebAppsIntegrationTest {
             Entity cluster = 
brooklynMgmt.getEntityManager().getEntity(clusterComponent.getId());
             log.info("pc1 - "+clusterComponent+" - "+cluster);
             
-            Assert.assertEquals(cluster.getPolicies().size(), 1);
+            Assert.assertEquals(cluster.policies().size(), 1);
             Policy policy = cluster.policies().iterator().next();
             Assert.assertNotNull(policy);
             Assert.assertTrue(policy instanceof AutoScalerPolicy, 
"policy="+policy);

Reply via email to