diff --git a/NOTICE b/NOTICE
index ee9424a..c2f8899 100644
--- a/NOTICE
+++ b/NOTICE
@@ -69,9 +69,9 @@
     Developed by: QOS.ch (http://www.qos.ch)
     License name: Eclipse Public License, version 1.0
   
-  com.fasterxml.jackson:2.9.7: 
+  com.fasterxml.jackson:2.9.8: 
     Project:      Jackson FasterXML
-    Version:      2.9.7
+    Version:      2.9.8
     Available at: 
       - http://github.com/FasterXML/jackson
       - https://github.com/FasterXML/jackson-core
@@ -189,11 +189,11 @@
     License name: Apache License, version 2.0
     Notice:       Copyright (c) Square, Inc.
   
-  com.thoughtworks.xstream:1.4.8: 
+  com.thoughtworks.xstream:1.4.11.1: 
     Project:      XStream Core
-    Version:      1.4.8
+    Version:      1.4.11.1
     Available at: http://x-stream.github.io/
-    Developed by: XStream (http://xstream.codehaus.org)
+    Developed by: XStream (http://x-stream.github.io)
     License name: BSD 3-Clause (New BSD) License
   
   commons-beanutils:1.9.3: 
@@ -231,11 +231,11 @@
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
-  io.cloudsoft.windows:0.6.1: 
+  io.cloudsoft.windows:0.7.0: 
     Project: 
       - Java WinRM library
       - WinRM Client
-    Version:      0.6.1
+    Version:      0.7.0
     Available at: http://github.com/cloudsoft/winrm4j
     License name: Apache License, version 2.0
   
@@ -292,11 +292,11 @@
     Developed by: Chemouni Uriel (http://www.minidev.net/)
     License name: Apache License, version 2.0
   
-  org.apache.commons.commons-compress:1.4: 
-    Project:      Commons Compress
-    Version:      1.4
-    Available at: http://commons.apache.org/compress/
-    Developed by: The Apache Software Foundation (http://www.apache.org/)
+  org.apache.commons.commons-compress:1.18: 
+    Project:      Apache Commons Compress
+    Version:      1.18
+    Available at: https://commons.apache.org/proper/commons-compress/
+    Developed by: The Apache Software Foundation (https://www.apache.org/)
     License name: Apache License, version 2.0
   
   org.apache.commons.commons-lang3:3.3.2: 
@@ -306,16 +306,16 @@
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
-  org.apache.cxf:3.2.7: 
+  org.apache.cxf:3.2.8: 
     Project:      Apache CXF
-    Version:      3.2.7
+    Version:      3.2.8
     Available at: http://cxf.apache.org
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
-  org.apache.felix.org.apache.felix.framework:5.6.10: 
+  org.apache.felix.org.apache.felix.framework:5.6.12: 
     Project:      Apache Felix Framework
-    Version:      5.6.10
+    Version:      5.6.12
     Available at: http://felix.apache.org/
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
@@ -362,16 +362,16 @@
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
-  org.apache.karaf.jaas.org.apache.karaf.jaas.boot:4.2.2: 
+  org.apache.karaf.jaas.org.apache.karaf.jaas.boot:4.2.7: 
     Project:      Apache Karaf :: JAAS :: Boot
-    Version:      4.2.2
+    Version:      4.2.7
     Available at: https://www.apache.org/
     Developed by: The Apache Software Foundation (https://www.apache.org/)
     License name: Apache License, version 2.0
   
-  org.apache.karaf.shell.org.apache.karaf.shell.core:4.2.2: 
+  org.apache.karaf.shell.org.apache.karaf.shell.core:4.2.7: 
     Project:      Apache Karaf :: Shell :: Core
-    Version:      4.2.2
+    Version:      4.2.7
     Available at: https://www.apache.org/
     Developed by: The Apache Software Foundation (https://www.apache.org/)
     License name: Apache License, version 2.0
@@ -390,9 +390,9 @@
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
-  org.apache.ws.xmlschema.xmlschema-core:2.2.3: 
+  org.apache.ws.xmlschema.xmlschema-core:2.2.4: 
     Project:      XmlSchema Core
-    Version:      2.2.3
+    Version:      2.2.4
     Available at: http://ws.apache.org/commons/xmlschema20/
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
@@ -446,9 +446,9 @@
     License name: Apache License, version 2.0
     Notice:       Copyright (c) Shigeru Chiba
   
-  org.jline:3.9.0: 
+  org.jline:3.12.1: 
     Project:      JLine Bundle
-    Version:      3.9.0
+    Version:      3.12.1
     Available at: http://nexus.sonatype.org/oss-repository-hosting.html
     License name: BSD 3-Clause (New BSD) License
     Notice: 
@@ -483,12 +483,6 @@
     Developed by: QOS.ch (http://www.qos.ch)
     License name: MIT License
   
-  org.tukaani.xz:1.0: 
-    Project:      XZ for Java
-    Version:      1.0
-    Available at: http://tukaani.org/xz/java.html
-    License name: Public Domain
-  
   org.xmlunit:2.3.0: 
     Project: 
       - org.xmlunit:xmlunit-core
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index b4233a1..a193165 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -60,6 +60,7 @@
 import org.apache.brooklyn.core.mgmt.ManagementContextInjectable;
 import org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContext;
 import org.apache.brooklyn.core.resolve.entity.EntitySpecResolver;
+import org.apache.brooklyn.core.typereg.RegisteredTypeLoadingContexts;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.collections.MutableSet;
@@ -68,11 +69,13 @@
 import org.apache.brooklyn.util.core.flags.FlagUtils.FlagConfigKeyAndValueRecord;
 import org.apache.brooklyn.util.core.task.DeferredSupplier;
 import org.apache.brooklyn.util.core.task.Tasks;
+import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.net.Urls;
 import org.apache.brooklyn.util.text.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
 
 import com.google.common.base.Function;
 import com.google.common.base.Functions;
@@ -505,6 +508,7 @@
 
         private class EntitySpecSupplier implements DeferredSupplier<EntitySpec<?>> {
             EntitySpecConfiguration flag;
+            transient EntitySpec<?> cached = null;
             public EntitySpecSupplier(EntitySpecConfiguration flag) {
                 this.flag = flag;
             }
@@ -513,9 +517,59 @@
                 // And have transformSpecialFlags(Object flag, ManagementContext mgmt) drill into the Object flag if it's a map or iterable?
                 @SuppressWarnings("unchecked")
                 Map<String, Object> resolvedConfig = (Map<String, Object>)transformSpecialFlags(flag.getSpecConfiguration());
-                EntitySpec<?> entitySpec = Factory.newInstance(getLoader(), resolvedConfig).resolveSpec(encounteredRegisteredTypeIds);
-
-                return EntityManagementUtils.unwrapEntity(entitySpec);
+                EntitySpec<?> entitySpec;
+                try {
+                    // first parse as a CAMP entity
+                    entitySpec = Factory.newInstance(getLoader(), resolvedConfig).resolveSpec(encounteredRegisteredTypeIds);
+                } catch (Exception e1) {
+                    Exceptions.propagateIfFatal(e1);
+                    
+                    // if that doesn't work, try full multi-format plan parsing 
+                    String yamlPlan = null;
+                    try {
+                        yamlPlan = new Yaml().dump(resolvedConfig);
+                        entitySpec = mgmt.getTypeRegistry().createSpecFromPlan(null, yamlPlan, 
+                            RegisteredTypeLoadingContexts.alreadyEncountered(encounteredRegisteredTypeIds), EntitySpec.class);
+                    } catch (Exception e2) {
+                        String errorMessage = "entitySpec plan parse error";
+                        if (Thread.currentThread().isInterrupted()) {
+                            // plans which read/write to a file might not work in interrupted state
+                            if (cached!=null) {
+                                log.debug("EntitySpecSupplier returning cached spec "+cached+" because being invoked in a context which must return immediately");
+                                return cached;
+                            } else {
+                                errorMessage += " (note, it is being invoked in a context which must return immediately and there is no cache)";
+                            }
+                        }
+                        Exceptions.propagateIfFatal(e2);
+                        
+                        Exception exceptionToInclude;
+                        // heuristic
+                        if (resolvedConfig.containsKey("type")) {
+                            // if it has a key 'type' then it is likely a CAMP entity, abbreviated syntax (giving a type), so just give e1
+                            exceptionToInclude = e1;
+                        } else if (resolvedConfig.containsKey("brooklyn.services")) {
+                            // seems like a CAMP app, just give e2
+                            exceptionToInclude = e2;
+                        } else {
+                            // can't tell if it was short form eg `entitySpec: { type: x, ... }`
+                            // or long form (camp or something else), eg `entitySpec: { brooklyn.services: [ ... ] }`.
+                            // the error from the latter is a bit nicer so return it, but log the former.
+                            errorMessage += "; consult log for more information";
+                            log.debug("Suppressed error in entity spec where unclear whether abbreviated or full syntax, is (from abbreviated form parse, where error parsing full form will be reported subsequently): "+e1);
+                            exceptionToInclude = e2;
+                            // don't use the list as that causes unhelpful "2 errors including"...
+                        }
+                        // first exception might include the plan, so we don't need to here
+                        boolean yamlPlanAlreadyIncluded = exceptionToInclude.toString().contains(yamlPlan);
+                        if (!yamlPlanAlreadyIncluded) {
+                            errorMessage += ":\n"+yamlPlan;
+                        }
+                        throw Exceptions.propagateAnnotated(errorMessage, exceptionToInclude);
+                    }
+                }
+                cached = EntityManagementUtils.unwrapEntity(entitySpec);
+                return cached;
             }
         }
         
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
index aa1dfe9..d63ff7a 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
@@ -92,7 +92,7 @@
 
         @Override
         public Maybe<String> getTypeName() {
-            Maybe<Object> result = data.getStringKeyMaybe(getPreferredKeyName());
+            Maybe<Object> result = data.getStringKeyMaybe(getTypedKeyName());
             if (result.isAbsent() && typeKeyPrefix!=null) {
                 // try alternatives if a prefix was specified
                 result = data.getStringKeyMaybe(typeKeyPrefix+"Type");
@@ -100,15 +100,15 @@
             }
             
             if (result.isAbsent() || result.get()==null) 
-                return Maybe.absent("Missing key '"+getPreferredKeyName()+"'");
+                return Maybe.absent("Missing key 'type'"+(typeKeyPrefix!=null ? " (or '"+getTypedKeyName()+"')" : ""));
             
             if (result.get() instanceof String) return Maybe.of((String)result.get());
             
-            throw new IllegalArgumentException("Invalid value "+result.get().getClass()+" for "+getPreferredKeyName()+"; "
+            throw new IllegalArgumentException("Invalid value "+result.get().getClass()+" for "+getTypedKeyName()+"; "
                 + "expected String, got "+result.get());
         }
         
-        protected String getPreferredKeyName() {
+        protected String getTypedKeyName() {
             if (typeKeyPrefix!=null) return typeKeyPrefix+"_type";
             return "type";
         }
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
index eaa68b8..0ba74d8 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java
@@ -20,16 +20,18 @@
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.BiFunction;
 
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
+import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.RegisteredType.TypeImplementationPlan;
 import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
-import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind;
 import org.apache.brooklyn.core.typereg.AbstractFormatSpecificTypeImplementationPlan;
 import org.apache.brooklyn.core.typereg.AbstractTypePlanTransformer;
 import org.apache.brooklyn.core.typereg.BasicTypeImplementationPlan;
 import org.apache.brooklyn.core.typereg.RegisteredTypes;
+import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
 
 import com.google.common.collect.ImmutableList;
@@ -64,13 +66,27 @@
         }
         
         Maybe<Map<?,?>> plan = RegisteredTypes.getAsYamlMap(planData);
-        if (plan.isAbsent()) return 0;
-        if (plan.get().containsKey("services")) return weight*0.8;
-        if (plan.get().containsKey("type")) return weight*0.4;
-        // TODO these should become legacy
-        if (plan.get().containsKey("brooklyn.locations")) return weight*0.7;
-        if (plan.get().containsKey("brooklyn.policies")) return weight*0.7;
-        if (plan.get().containsKey("brooklyn.enrichers")) return weight*0.7;
+        if (plan.isPresent()) {
+            return weight * scoreObject(plan.get(), (map,s) -> map.containsKey(s));
+        }
+        if (planData==null) {
+            return 0;
+        }
+        double unparseableScore = scoreObject(planData.toString(), (p,s) -> p.contains(s));
+        if (unparseableScore>0) {
+            return 0.5 + 0.25 * unparseableScore;
+        }
+        return 0;
+    }
+    
+    protected <T> double scoreObject(T plan, BiFunction<T, String, Boolean> contains) {
+        if (contains.apply(plan, "services")) return 0.8;
+        if (contains.apply(plan, "type")) return 0.4;
+        if (contains.apply(plan, "brooklyn.locations")) return 0.7;
+        if (contains.apply(plan, "brooklyn.policies")) return 0.7;
+        if (contains.apply(plan, "brooklyn.enrichers")) return 0.7;
+        // score low so we can say it's the wrong place
+        if (contains.apply(plan, "catalog.bom")) return 0.2;
         return 0;
     }
 
@@ -84,8 +100,31 @@
 
     @Override
     protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception {
-        // TODO cache
-        return new CampResolver(mgmt, type, context).createSpec();
+        try {
+            return new CampResolver(mgmt, type, context).createSpec();
+        } catch (Exception e) {
+            Exceptions.propagateIfFatal(e);
+            String message = null;
+            // check a few common errors, annotate if so
+            if (type==null || type.getPlan()==null || type.getPlan().getPlanData()==null) {
+                // shouldn't happen
+                message = "Type/plan/data is null when resolving CAMP blueprint";
+            } else {
+                Object planData = type.getPlan().getPlanData();
+                if (RegisteredTypes.getAsYamlMap(planData).isAbsent()) {
+                    message = "Type or plan is invalid YAML when resolving CAMP blueprint";
+                } else if (planData.toString().contains("brooklyn.catalog")) {
+                    message = "CAMP blueprint for type definition looks like a catalog file";
+                } else {
+                    // leave null, don't annotate
+                }
+            }
+            if (message!=null) {
+                throw Exceptions.propagateAnnotated(message, e);
+            } else {
+                throw e;
+            }
+        }
     }
 
     @Override
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslInterpreter.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslInterpreter.java
index 4105e19..77fa385 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslInterpreter.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslInterpreter.java
@@ -79,6 +79,8 @@
                 node.setNewValue( evaluate(parsedNode, true) );
             }
         } catch (Exception e) {
+            // we could try parsing it as yaml and if it comes back as a map or a list, reapply the interpreter;
+            // useful in some contexts where strings are required by the source (eg CFN, TOSCA)
             log.warn("Error evaluating node (rethrowing) '"+expression+"': "+e);
             Exceptions.propagateIfFatal(e);
             throw new IllegalArgumentException("Error evaluating node '"+expression+"'", e);
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslUtils.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslUtils.java
index 9789c86..7cf5c88 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslUtils.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslUtils.java
@@ -19,8 +19,25 @@
 package org.apache.brooklyn.camp.brooklyn.spi.dsl;
 
 import java.util.Arrays;
+import java.util.Map;
 
+import javax.annotation.Nullable;
+
+import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.camp.brooklyn.BrooklynCampPlatform;
+import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver;
+import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
+import org.apache.brooklyn.util.collections.MutableSet;
+import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.core.task.DeferredSupplier;
+import org.apache.brooklyn.util.yaml.Yamls;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.reflect.TypeToken;
 
 public class DslUtils {
 
@@ -42,4 +59,64 @@
         }
         return allResolved;
     }
+    
+    private static Object transformSpecialFlags(ManagementContext mgmt, AbstractBrooklynObjectSpec<?,?> spec, Object v) {
+        return new BrooklynComponentTemplateResolver.SpecialFlagsTransformer(
+            CatalogUtils.newClassLoadingContext(mgmt, spec.getCatalogItemId(), ImmutableList.of()),
+            MutableSet.of()).apply(v);
+    }
+
+    /** resolve an object which might be (or contain in a map or list) a $brooklyn DSL string expression */
+    private static Optional<Object> resolveBrooklynDslValueInternal(Object originalValue, @Nullable TypeToken<?> desiredType, @Nullable ManagementContext mgmt, @Nullable AbstractBrooklynObjectSpec<?,?> specForCatalogItemIdContext, boolean requireType) {
+        if (originalValue == null) {
+            return Optional.absent();
+        }
+        Object value = originalValue;
+        if (mgmt!=null) {
+            if (value instanceof String && ((String)value).matches("\\$brooklyn:[A-Za-z_]+:\\s(?s).*")) {
+                // input is a map as a string, parse it as yaml first
+                value = Iterables.getOnlyElement( Yamls.parseAll((String)value) );
+            }
+            
+            // The 'dsl' key is arbitrary, but the interpreter requires a map
+            ImmutableMap<String, Object> inputToPdpParse = ImmutableMap.of("dsl", value);
+            Map<String, Object> resolvedConfigMap = BrooklynCampPlatform.findPlatform(mgmt)
+                    .pdp()
+                    .applyInterpreters(inputToPdpParse);
+            value = resolvedConfigMap.get("dsl");
+            // TODO if it fails log a warning -- eg entitySpec with root.war that doesn't exist
+
+            if (specForCatalogItemIdContext!=null) {
+                value = transformSpecialFlags(mgmt, specForCatalogItemIdContext, value);
+            }
+        }
+        
+        if (requireType && value instanceof DeferredSupplier) {
+            // Don't cast - let Brooklyn evaluate it later (the value is a resolved DSL expression).
+            return Optional.of(value);
+        }
+        
+        if (desiredType!=null) {
+            // coerce to _raw_ type as per other config-setting coercion; config _retrieval_ does type correctness
+            return Optional.of(TypeCoercions.coerce(value, desiredType.getRawType()));
+
+        } else {
+            return Optional.of(value);
+        }
+    }
+
+    /** Resolve an object which might be (or contain in a map or list) a $brooklyn DSL string expression,
+     * attempting to coerce if a type is supplied (unless it is a {@link DeferredSupplier}) */
+    public static Optional<Object> resolveBrooklynDslValue(Object originalValue, @Nullable TypeToken<?> desiredType, @Nullable ManagementContext mgmt, @Nullable AbstractBrooklynObjectSpec<?,?> specForCatalogItemIdContext) {
+        return resolveBrooklynDslValueInternal(originalValue, desiredType, mgmt, specForCatalogItemIdContext, false);
+        
+    }
+    
+    /** As {@link #resolveBrooklynDslValue(Object, TypeToken, ManagementContext, AbstractBrooklynObjectSpec)}
+     * but returning absent if the object is DeferredSupplier, ensuring type correctness.
+     * This is particularly useful for maps and other objects which might contain deferred suppliers but won't be one. */
+    @SuppressWarnings("unchecked")
+    public static <T> Optional<T> resolveNonDeferredBrooklynDslValue(Object originalValue, @Nullable TypeToken<T> desiredType, @Nullable ManagementContext mgmt, @Nullable AbstractBrooklynObjectSpec<?,?> specForCatalogItemIdContext) {
+        return (Optional<T>) resolveBrooklynDslValueInternal(originalValue, desiredType, mgmt, specForCatalogItemIdContext, true);
+    }
 }
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index 518b501..20efc95 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -287,6 +287,8 @@
 
     // Build complex things
 
+    // TODO allow entitySpec to take string, parsed as YAML, and if just a string that's taken as the type
+    
     @DslAccessible
     public static EntitySpecConfiguration entitySpec(Map<String, Object> arguments) {
         return new EntitySpecConfiguration(arguments);
@@ -368,10 +370,10 @@
      * are not yet fully resolved.
      */
     @DslAccessible
-    public static Object formatString(final String pattern, final Object...args) {
-        if (resolved(args)) {
+    public static Object formatString(final Object pattern, final Object...args) {
+        if (resolved(Lists.asList(pattern, args))) {
             // if all args are resolved, apply the format string now
-            return String.format(pattern, args);
+            return String.format(String.valueOf(pattern), args);
         } else {
             return new DslFormatString(pattern, args);
         }
@@ -433,16 +435,16 @@
     /**
      * Deferred execution of String formatting.
      *
-     * @see DependentConfiguration#formatString(String, Object...)
+     * @see DependentConfiguration#formatString(Object, Object...)
      */
     protected static class DslFormatString extends BrooklynDslDeferredSupplier<String> {
 
         private static final long serialVersionUID = -4849297712650560863L;
 
-        private final String pattern;
+        private final Object pattern;
         private final Object[] args;
 
-        public DslFormatString(String pattern, Object ...args) {
+        public DslFormatString(Object pattern, Object ...args) {
             this.pattern = pattern;
             this.args = args;
         }
@@ -526,7 +528,7 @@
     @SuppressWarnings({ "serial", "unused" })
     @Deprecated
     private static class FormatString extends DslFormatString {
-        public FormatString(String pattern, Object[] args) {
+        public FormatString(Object pattern, Object[] args) {
             super(pattern, args);
         }
     }
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/parse/DslParser.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/parse/DslParser.java
index 7b0f359..2b88d7f 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/parse/DslParser.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/parse/DslParser.java
@@ -85,7 +85,7 @@
         } while (true);
         String fn = expression.substring(fnStart, index);
         if (fn.length()==0)
-            throw new IllegalStateException("Expected a function name at position "+start);
+            throw new IllegalStateException("Expected a function name or double-quoted string at position "+start);
         skipWhitespace();
         
         if (index < expression.length() && expression.charAt(index)=='(') {
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ValidationMissingTypeYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ValidationMissingTypeYamlTest.java
index d71f381..2a62d45 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ValidationMissingTypeYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ValidationMissingTypeYamlTest.java
@@ -57,14 +57,14 @@
                     "  itemType: entity",
                     "  item:",
                     "    foo: " + TestEntity.class.getName());
+            Asserts.shouldHaveFailedPreviously();
         } catch (Exception e) {
             Asserts.expectedFailureContains(e, "must declare a type");
         }
     }
 
     @Test
-    public void testNoEntityTypeInTopLevelCatalogApp() throws Exception {
-        try {
+    public void testNoEntityTypeInTopLevelCatalogAppAsTemplateErrorIsAllowed() throws Exception {
             addCatalogItems(
                     "brooklyn.catalog:",
                     "  id: " + Identifiers.makeRandomId(8),
@@ -73,9 +73,6 @@
                     "  item:",
                     "    services:",
                     "    - foo: " + TestEntity.class.getName());
-        } catch (Exception e) {
-            Asserts.expectedFailureContains(e, "must declare a type");
-        }
     }
 
     @Test
@@ -140,13 +137,22 @@
                     "        foo: " + TestEntityImpl.class.getName());
             Asserts.shouldHaveFailedPreviously();
         } catch (Exception e) {
-            Asserts.expectedFailureContains(e, "No type defined");
+//            org.apache.brooklyn.util.exceptions.PropagatedRuntimeException: brooklyn-camp plan creation error: 
+//                entitySpec plan parse error; consult log for more information: 
+//                UnsupportedTypePlanException: Invalid plan; format could not be recognized, 
+//                none of the available transformers 
+//                  [brooklyn-camp:CampTypePlanTransformer, 
+//                  java-type-name:JavaClassNameTypePlanTransformer]
+//                support plan:
+//            {foo: org.apache.brooklyn.core.test.entity.TestEntityImpl}
+
+            Asserts.expectedFailureContains(e, "entitySpec plan parse error");
+            Asserts.expectedFailureContains(e, "format could not be recognized");
         }
     }
     
     @Test
-    public void testNoEntityTypeInEntitySpecInCatalogEntity() throws Exception {
-        try {
+    public void testNoEntityTypeInEntitySpecInCatalogEntityIsAllowed() throws Exception {
             addCatalogItems(
                     "brooklyn.catalog:",
                     "  id: " + Identifiers.makeRandomId(8),
@@ -159,14 +165,10 @@
                     "      memberSpec: ",
                     "        $brooklyn:entitySpec:",
                     "          foo: " + TestEntityImpl.class.getName());
-        } catch (Exception e) {
-            Asserts.expectedFailureContains(e, "No type defined");
-        }
     }
 
     @Test
-    public void testNoEntityTypeInEntitySpecInCatalogApp() throws Exception {
-        try {
+    public void testNoEntityTypeInEntitySpecInCatalogAppIsAllowed() throws Exception {
             addCatalogItems(
                     "brooklyn.catalog:",
                     "  id: " + Identifiers.makeRandomId(8),
@@ -180,15 +182,26 @@
                     "        memberSpec: ",
                     "          $brooklyn:entitySpec:",
                     "            foo: " + TestEntityImpl.class.getName());
-        } catch (Exception e) {
-            Asserts.expectedFailureContains(e, "No type defined");
-        }
     }
 
-    // TODO Preferred name should not be 'policy_type'; it should be 'type'!
     @Test
     public void testNoPolicyTypeSpecified() throws Exception {
+        // preferred syntax, okay
+        createAndStartApplication(
+            "services:",
+            "- type: " + TestApplication.class.getName(),
+            "  brooklyn.policies:",
+            "  - type: " + TestPolicy.class.getName());
+        
+        // legacy syntax okay
+        createAndStartApplication(
+            "services:",
+            "- type: " + TestApplication.class.getName(),
+            "  brooklyn.policies:",
+            "  - policy_type: " + TestPolicy.class.getName());
+        
         try {
+            // no type not okay
             createAndStartApplication(
                     "services:",
                     "- type: " + TestApplication.class.getName(),
@@ -196,13 +209,31 @@
                     "  - foo: " + TestPolicy.class.getName());
             Asserts.shouldHaveFailedPreviously();
         } catch (Exception e) {
-            Asserts.expectedFailureContains(e, "Missing key 'policy_type'");
+            Asserts.expectedFailureContains(e, "Missing key", "'type'", "'policy_type'");
         }
+        
+        try {
+            // invalid type not okay
+            createAndStartApplication(
+                    "services:",
+                    "- type: " + TestApplication.class.getName(),
+                    "  brooklyn.policies:",
+                    "  - type: does_not_exist");
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Exception e) {
+            Asserts.expectedFailureContains(e, "does_not_exist");
+        }
+
     }
     
-    // TODO Preferred name should not be 'enricher_type'; it should be 'type'!
     @Test
     public void testNoEnricherTypeSpecified() throws Exception {
+        createAndStartApplication(
+            "services:",
+            "- type: " + TestApplication.class.getName(),
+            "  brooklyn.enrichers:",
+            "  - type: " + TestEnricher.class.getName());
+
         try {
             createAndStartApplication(
                     "services:",
@@ -211,7 +242,7 @@
                     "  - foo: " + TestEnricher.class.getName());
             Asserts.shouldHaveFailedPreviously();
         } catch (Exception e) {
-            Asserts.expectedFailureContains(e, "Missing key 'enricher_type'");
+            Asserts.expectedFailureContains(e, "Missing key", "'type'", "'enricher_type'");
         }
     }
     
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslParseComponentsTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslParseComponentsTest.java
index 1e8ccb8..ddd8a1f 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslParseComponentsTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslParseComponentsTest.java
@@ -57,6 +57,7 @@
                     "  brooklyn.config:",
                     "    dest: 1",
                     "    dest2: 1",
+                    "    pattern: '%s-%s'",
                     "  brooklyn.children:",
                     "  - type: "+BasicEntity.class.getName(),
                     "    id: two",
@@ -133,6 +134,17 @@
     }
 
     @Test
+    public void testFormatStringWithDslPatternEvaluation() throws Exception {
+        app();
+
+        Object y1 = parseDslExpression("$brooklyn:formatString($brooklyn:config(\"pattern\"), $brooklyn:config(\"dest\"), $brooklyn:config(\"dest2\"))");
+        Assert.assertEquals(y1.toString(), "$brooklyn:formatString(config(\"pattern\"), config(\"dest\"), config(\"dest2\"))");
+
+        String y2 = Tasks.resolveValue(y1, String.class, ((EntityInternal) find("one")).getExecutionContext());
+        Assert.assertEquals(y2.toString(), "1-1");
+    }
+
+    @Test
     public void testEntityReferenceAndAttributeWhenReady() throws Exception {
         app();
         find("one").sensors().set(Attributes.ADDRESS, "1");
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
index 57fee74..a2922a1 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
@@ -45,7 +45,6 @@
 import org.apache.brooklyn.entity.stock.BasicStartable;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.exceptions.CompoundRuntimeException;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.testng.annotations.Test;
 
@@ -551,7 +550,7 @@
                     "  brooklyn.config:",
                     "    dest: $brooklyn:self().invalidMethod()");
             Asserts.shouldHaveFailedPreviously("Non-existing non-deferred method should fail deployment");
-        } catch (CompoundRuntimeException e) {
+        } catch (Exception e) {
             Asserts.expectedFailureContains(e, "No such function 'invalidMethod'");
         }
     }
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/TagsYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/TagsYamlTest.java
index f6d06d3..70895dc 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/TagsYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/TagsYamlTest.java
@@ -15,20 +15,19 @@
  */
 package org.apache.brooklyn.camp.brooklyn.spi.dsl;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
+import static org.testng.Assert.assertTrue;
+
+import javax.annotation.Nullable;
+
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
 import org.apache.brooklyn.entity.stock.BasicApplication;
 import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.util.exceptions.CompoundRuntimeException;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.testng.annotations.Test;
 
-import javax.annotation.Nullable;
-
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 
 public class TagsYamlTest extends AbstractYamlTest {
     @Test
@@ -64,9 +63,11 @@
                     "  brooklyn.tags:",
                     "    tag1: true",
                     "    tag2: 2");
-            fail("Should throw IllegalArgumentException exception; instead got: "+app);
-        } catch (CompoundRuntimeException e) {
-            Asserts.assertStringContainsAtLeastOne(Exceptions.getFirstInteresting(e).getMessage(),"brooklyn.tags must be a list, is: ");
+            Asserts.shouldHaveFailedPreviously("Should throw IllegalArgumentException exception; instead got: "+app);
+        } catch (Exception e) {
+            Asserts.expectedFailureContainsIgnoreCase(e, "brooklyn.tags must be a list");
+            Asserts.assertStringContainsAtLeastOne(Exceptions.getFirstInteresting(e).getMessage(),
+                "brooklyn.tags must be a list, is: ");
         }
     }
 
@@ -112,9 +113,13 @@
                     "      type: "+TagsTestObject.class.getName(),
                     "      constructor.args:",
                     "      - $brooklyn:attributeWhenReady(\"host.name\")");
-            fail("Should throw IllegalArgumentException exception; instead got "+app);
-        } catch (CompoundRuntimeException e) {
-            Asserts.assertStringContainsAtLeastOne(Exceptions.getFirstInteresting(e).getMessage(),"brooklyn.tags should not contain DeferredSupplier. A DeferredSupplier is made when using $brooklyn:attributeWhenReady");
+            Asserts.shouldHaveFailedPreviously("Should throw IllegalArgumentException exception; instead got "+app);
+        } catch (Exception e) {
+            Asserts.expectedFailureContainsIgnoreCase(e, 
+                "brooklyn.tags should not contain DeferredSupplier",
+                "A DeferredSupplier is made when using $brooklyn:attributeWhenReady");
+            Asserts.assertStringContainsAtLeastOne(Exceptions.getFirstInteresting(e).getMessage(),
+                "brooklyn.tags should not contain DeferredSupplier");
         }
     }
 
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java
index 4a5c23b..b13f384 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java
@@ -30,11 +30,12 @@
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.SubscriptionContext;
 import org.apache.brooklyn.api.mgmt.entitlement.EntitlementManager;
+import org.apache.brooklyn.api.objs.EntityAdjunct;
 import org.apache.brooklyn.api.policy.Policy;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.AttributeSensor.SensorPersistenceMode;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.Feed;
-import org.apache.brooklyn.api.sensor.AttributeSensor.SensorPersistenceMode;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.entity.Entities;
@@ -44,6 +45,7 @@
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.EntityAndItem;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument;
 import org.apache.brooklyn.core.mgmt.internal.NonDeploymentManagementContext.NonDeploymentManagementContextMode;
+import org.apache.brooklyn.core.objs.AbstractEntityAdjunct;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.slf4j.Logger;
@@ -304,11 +306,16 @@
                 nonDeploymentManagementContext.setMode(NonDeploymentManagementContextMode.MANAGEMENT_STOPPING);
             }
         }
-        // TODO custom stopping activities
-        // TODO framework stopping events - no more sensors, executions, etc
-        // (elaborate or remove ^^^ ? -AH, Sept 2014)
         
         if (!isReadOnly() && info.getMode().isDestroying()) {
+            // ensure adjuncts get a destroy callback
+            // note they don't get any alert if the entity is being locally unmanaged to run somewhere else.
+            // framework should introduce a call for that ideally, but in interim if needed they
+            // can listen to the entity becoming locally unmanaged
+            entity.feeds().forEach(this::destroyAdjunct);
+            entity.enrichers().forEach(this::destroyAdjunct);
+            entity.policies().forEach(this::destroyAdjunct);
+                
             // if we support remote parent of local child, the following call will need to be properly remoted
             if (entity.getParent()!=null) entity.getParent().removeChild(entity.getProxyIfAvailable());
         }
@@ -323,6 +330,18 @@
         }
     }
     
+    protected void destroyAdjunct(EntityAdjunct adjunct) {
+        if (adjunct instanceof AbstractEntityAdjunct) {
+            try {
+                ((AbstractEntityAdjunct)adjunct).destroy();
+            } catch (Exception e) {
+                Exceptions.propagateIfFatal(e);
+                log.error("Error destroying "+adjunct+" (ignoring): "+e);
+                log.trace("Trace for error", e);
+            }
+        }
+    }
+    
     public void onManagementStopped(ManagementTransitionInfo info) {
         synchronized (this) {
             if (managementContext == null && nonDeploymentManagementContext.getMode() == NonDeploymentManagementContextMode.MANAGEMENT_STOPPED) {
diff --git a/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java b/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
index c2a9804..0e1a22a 100644
--- a/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
+++ b/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
@@ -510,27 +510,29 @@
      * </pre>
      */
     @SuppressWarnings("unchecked")
-    public static Task<String> formatString(final String spec, final Object ...args) {
+    public static Task<String> formatString(final Object spec, final Object ...args) {
         List<TaskAdaptable<Object>> taskArgs = Lists.newArrayList();
-        for (Object arg: args) {
+
+        Object[] newArgs = Lists.asList(spec, args).toArray();
+        for (Object arg: newArgs) {
             if (arg instanceof TaskAdaptable) taskArgs.add((TaskAdaptable<Object>)arg);
             else if (arg instanceof TaskFactory) taskArgs.add( ((TaskFactory<TaskAdaptable<Object>>)arg).newTask() );
         }
         
         return transformMultiple(
-            MutableMap.<String,String>of("displayName", "formatting '"+spec+"' with "+taskArgs.size()+" task"+(taskArgs.size()!=1?"s":"")), 
+            MutableMap.<String,String>of("displayName", "formatting '"+spec.toString()+"' with "+taskArgs.size()+" task"+(taskArgs.size()!=1?"s":"")),
             new Function<List<Object>, String>() {
                 @Override public String apply(List<Object> input) {
                     Iterator<?> tri = input.iterator();
-                    Object[] vv = new Object[args.length];
+                    Object[] vv = new Object[newArgs.length];
                     int i=0;
-                    for (Object arg : args) {
+                    for (Object arg : newArgs) {
                         if (arg instanceof TaskAdaptable || arg instanceof TaskFactory) vv[i] = tri.next();
                         else if (arg instanceof DeferredSupplier) vv[i] = ((DeferredSupplier<?>) arg).get();
                         else vv[i] = arg;
                         i++;
                     }
-                    return String.format(spec, vv);
+                    return String.format(vv[0].toString(), Arrays.copyOfRange(vv, 1, vv.length));
                 }},
             taskArgs);
     }
@@ -538,7 +540,13 @@
     /**
      * @throws ImmediateSupplier.ImmediateUnsupportedException if cannot evaluate this in a timely manner
      */
-    public static Maybe<String> formatStringImmediately(final String spec, final Object ...args) {
+    public static Maybe<String> formatStringImmediately(final Object spec, final Object ...args) {
+        String pattern = "";
+        Maybe<?> resolvedSpec = resolveImmediately(spec);
+        if (resolvedSpec.isPresent()) {
+            pattern = resolvedSpec.get().toString();
+        }
+
         List<Object> resolvedArgs = Lists.newArrayList();
         for (Object arg : args) {
             Maybe<?> argVal = resolveImmediately(arg);
@@ -546,7 +554,7 @@
             resolvedArgs.add(argVal.get());
         }
 
-        return Maybe.of(String.format(spec, resolvedArgs.toArray()));
+        return Maybe.of(String.format(pattern, resolvedArgs.toArray()));
     }
 
     /**
diff --git a/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java b/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java
index 4c10f41..1c44011 100644
--- a/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java
+++ b/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java
@@ -70,6 +70,7 @@
         class ResolveValue implements Callable<Maybe<T>> {
             @Override
             public Maybe<T> call() throws Exception {
+                // TODO resolve deep?
                 return Tasks.resolving(value).as(sensor.getTypeToken()).timeout(timeout).getMaybe();
             }
         }
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 7dd24cf..2854598 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
@@ -307,26 +307,28 @@
                 .build();
         }
         try {
-            return (SpecT) BasicBrooklynCatalog.internalCreateSpecLegacy(mgmt, item, constraint.getAlreadyEncounteredTypes(), false);
-        } catch (Exception e) {
-            Exceptions.propagateIfFatal(e);
+            SpecT resultLegacy = (SpecT) BasicBrooklynCatalog.internalCreateSpecLegacy(mgmt, item, constraint.getAlreadyEncounteredTypes(), false);
+            log.warn("Item '"+item+"' was only parseable using legacy transformers; may not be supported in future versions: "+resultLegacy);
+            return resultLegacy;
+        } catch (Exception exceptionFromLegacy) {
+            Exceptions.propagateIfFatal(exceptionFromLegacy);
             // for now, combine this failure with the original
             try {
                 result.get();
                 // above will throw -- so won't come here
                 throw new IllegalStateException("should have failed getting type resolution for "+symbolicName);
-            } catch (Exception e0) {
-                Set<Exception> exceptionsInOrder = MutableSet.of();
-                if (e0.toString().indexOf("none of the available transformers")>=0) {
-                    // put the legacy exception first if none of the new transformers support the type
-                    // (until the new transformer is the primary pathway)
-                    exceptionsInOrder.add(e);
-                    exceptionsInOrder.add(e0);
-                } else {
-                    exceptionsInOrder.add(e0);
-                    exceptionsInOrder.add(e);
+            } catch (Exception exceptionFromPrimary) {
+                // ignore the legacy error. means much nicer errors in the happy case.
+                
+                if (log.isTraceEnabled()) {
+                    log.trace("Unable to instantiate "+(symbolicName==null ? "item" : symbolicName)+", primary error", 
+                        exceptionFromPrimary);
+                    log.trace("Unable to instantiate "+(symbolicName==null ? "item" : symbolicName)+", legacy error", 
+                        exceptionFromLegacy);
                 }
-                throw Exceptions.create("Unable to instantiate "+(symbolicName==null ? "item" : symbolicName), exceptionsInOrder); 
+
+                Throwable exception = Exceptions.collapse(exceptionFromPrimary);
+                throw symbolicName==null ? Exceptions.propagate(exception) : Exceptions.propagateAnnotated("Unable to instantiate "+symbolicName, exception);
             }
         }
     }
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynTypePlanTransformer.java
index 1001268..fb28082 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynTypePlanTransformer.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynTypePlanTransformer.java
@@ -64,8 +64,11 @@
      * 1 means this is clearly the intended transformer and no others need be tried 
      * (for instance because the format is explicitly specified),
      * and values between 0 and 1 indicate how likely a transformer believes it should be used.
+     * <p>
      * Values greater than 0.5 are generally reserved for the presence of marker tags or files
      * which strongly indicate that the format is compatible.
+     * Such a value should be returned even if the plan is not actually parseable, but if it looks like a user error
+     * which prevents parsing (eg mal-formed YAML) and the transformer could likely be the intended target.
      * <p>
      * */
     double scoreForType(@Nonnull RegisteredType type, @Nonnull RegisteredTypeLoadingContext context);
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java b/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java
index cc4845c..3d456c2 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java
@@ -125,10 +125,13 @@
                     (Strings.isNonBlank(e.getMessage()) ? " ("+e.getMessage()+")" : ""));
             } catch (Throwable e) {
                 Exceptions.propagateIfFatal(e);
-                log.debug("Transformer for "+t.getFormatCode()+" gave an error creating this plan (retrying with others): "+e, e);
+                if (log.isTraceEnabled()) {
+                    log.trace("Transformer for "+t.getFormatCode()+" gave an error creating this plan (may retry): "+e, e);
+                }
                 failuresFromTransformers.add(new PropagatedRuntimeException(
-                    (type.getSymbolicName()!=null ? "Error in definition of "+type.getId() : 
-                        "Transformer for "+t.getFormatCode()+" gave an error creating this plan") + ": "+
+                    (type.getSymbolicName()!=null ? 
+                        t.getFormatCode()+" plan creation error in "+type.getId() :
+                        t.getFormatCode()+" plan creation error") + ": "+
                     Exceptions.collapseText(e), e));
             }
         }
@@ -150,7 +153,8 @@
                 Exceptions.create("All plan transformers failed", failuresFromTransformers);
         } else {
             if (transformers.isEmpty()) {
-                result = new UnsupportedTypePlanException("Invalid plan; format could not be recognized, none of the available transformers "+all(mgmt)+" support "+type);
+                result = new UnsupportedTypePlanException("Invalid plan; format could not be recognized, none of the available transformers "+all(mgmt)+" support "+
+                    (type.getId()!=null ? type.getId() : "plan:\n"+type.getPlan().getPlanData()));
             } else {
                 result = new UnsupportedTypePlanException("Invalid plan; potentially applicable transformers "+transformers+" do not support it, and other available transformers "+
 //                    // the removeAll call below won't work until "all" caches it
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/aggregator/DashboardAggregator.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/aggregator/DashboardAggregator.java
index de9964b..8fe05f0 100644
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/aggregator/DashboardAggregator.java
+++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/aggregator/DashboardAggregator.java
@@ -51,7 +51,7 @@
 
     private ScheduledTask task;
 
-    public static BasicAttributeSensorAndConfigKey<Duration> DASHBOARD_COST_PER_MONTH = new BasicAttributeSensorAndConfigKey(Duration.class,
+    public static BasicAttributeSensorAndConfigKey<Duration> DASHBOARD_AGGREGATION_PERIOD = new BasicAttributeSensorAndConfigKey(Duration.class,
             "dashboard.period",
             "The amount of time to wait between aggregation jobs",
             Duration.seconds(1));
@@ -61,7 +61,7 @@
     public void setEntity(EntityLocal entity) {
         super.setEntity(entity);
 
-        Duration duration = config().get(DASHBOARD_COST_PER_MONTH);
+        Duration duration = config().get(DASHBOARD_AGGREGATION_PERIOD);
 
         Callable<Task<?>> taskFactory = () -> Tasks.builder()
                 .dynamic(false)
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
index 3f6381b..91dc577 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/ClassLoaderUtils.java
@@ -347,7 +347,15 @@
         } else {
             Maybe<T> result = dispatcher.tryLoadFrom(classLoader, name);
             if (result.isAbsent()) {
-                log.warn("Request for bundle '"+symbolicName+"' "+(Strings.isNonBlank(version) ? "("+version+") " : "")+"was ignored as no framework available; and failed to find '"+name+"' in plain old classpath");
+                if (name==null || name.startsWith("//") || symbolicName==null || "classpath".equals(symbolicName) || "http".equals(symbolicName) || "https".equals(symbolicName) || "file".equals(symbolicName)) {
+                    // this is called speculatively by BasicBrooklynCatalog.PlanInterpreterGuessingType so can log a lot of warnings where URLs are passed
+                    if (log.isTraceEnabled()) {
+                        log.trace("Request for bundle '"+symbolicName+"' "+(Strings.isNonBlank(version) ? "("+version+") " : "")+"was ignored as no framework available; and failed to find '"+name+"' in plain old classpath");
+                    }
+                } else {
+                    // TODO not sure warning is appropriate, but won't hide that in all cases yet
+                    log.warn("Request for bundle '"+symbolicName+"' "+(Strings.isNonBlank(version) ? "("+version+") " : "")+"was ignored as no framework available; and failed to find '"+name+"' in plain old classpath");
+                }
             }
             return result;
         }
diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
index 8d9a889..7cf9f0d 100644
--- a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
@@ -312,12 +312,21 @@
 
     @Override
     public String toString() {
-        Object identity = getIdentity();
+        String className = getClass().getSimpleName();
         String configDescription = config().getLocalBag().getDescription();
-        if (configDescription!=null && configDescription.startsWith(getClass().getSimpleName()))
+        String displayName = getDisplayName();
+
+        if (configDescription != null && configDescription.startsWith(className))
             return configDescription;
-        return getClass().getSimpleName()+"["+getDisplayName()+":"+(identity != null ? identity : null)+
-                (configDescription!=null ? "/"+configDescription : "") + "@" + getId() + "]";
+
+        if (displayName != null)
+            return className + "['" + displayName + "']";
+
+        return className + "[" +
+                getIdentity() +
+                (configDescription == null ? "" : "/" + configDescription) +
+                "@" + getId() +
+                "]";
     }
 
     @Override
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/action/AbstractScheduledEffectorPolicy.java b/policy/src/main/java/org/apache/brooklyn/policy/action/AbstractScheduledEffectorPolicy.java
index 9350d52..1c49e7e 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/action/AbstractScheduledEffectorPolicy.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/action/AbstractScheduledEffectorPolicy.java
@@ -53,6 +53,7 @@
 import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.Beta;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -137,6 +138,7 @@
         if (executor != null) {
             executor.shutdownNow();
         }
+        // TODO instead of a custom executor it would be nicer to use scheduled tasks
         executor = Executors.newSingleThreadScheduledExecutor();
         running = new AtomicBoolean(false);
     }
@@ -289,4 +291,9 @@
             }
         }
     }
+    
+    @VisibleForTesting
+    public ScheduledExecutorService getExecutor() {
+        return executor;
+    }
 }
diff --git a/policy/src/main/java/org/apache/brooklyn/policy/action/PeriodicEffectorPolicy.java b/policy/src/main/java/org/apache/brooklyn/policy/action/PeriodicEffectorPolicy.java
index dafc69c..a33503e 100644
--- a/policy/src/main/java/org/apache/brooklyn/policy/action/PeriodicEffectorPolicy.java
+++ b/policy/src/main/java/org/apache/brooklyn/policy/action/PeriodicEffectorPolicy.java
@@ -58,6 +58,7 @@
 @Beta
 public class PeriodicEffectorPolicy extends AbstractScheduledEffectorPolicy {
 
+    @SuppressWarnings("unused")
     private static final Logger LOG = LoggerFactory.getLogger(PeriodicEffectorPolicy.class);
 
     public static final ConfigKey<Duration> PERIOD = ConfigKeys.builder(Duration.class)
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/action/PeriodicEffectorPolicyTest.java b/policy/src/test/java/org/apache/brooklyn/policy/action/PeriodicEffectorPolicyTest.java
index a2aa4a6..75b00a0 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/action/PeriodicEffectorPolicyTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/action/PeriodicEffectorPolicyTest.java
@@ -26,6 +26,8 @@
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Predicates;
@@ -34,6 +36,9 @@
 
 public class PeriodicEffectorPolicyTest extends AbstractEffectorPolicyTest {
 
+    @SuppressWarnings("unused")
+    private static final Logger log = LoggerFactory.getLogger(PeriodicEffectorPolicyTest.class);
+    
     @Test
     public void testPeriodicEffectorFires() {
         TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
@@ -52,6 +57,9 @@
         entity.sensors().set(START, Boolean.TRUE);
         assertConfigEqualsEventually(policy, PeriodicEffectorPolicy.RUNNING, true);
         assertCallHistoryEventually(entity, "myEffector", 2);
+        
+        app.stop();
+        Asserts.assertTrue( ((PeriodicEffectorPolicy)policy).getExecutor().isShutdown(), "Executor should have been shut down");
     }
 
     // Integration because of long wait
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java
index 87a95b5..970546c 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java
@@ -68,6 +68,7 @@
             @QueryParam("adjunctType") final String adjunctType);
 
     // TODO support YAML ?
+    // TODO support timeout
     @POST
     @ApiOperation(value = "Create and add an adjunct (e.g. a policy, enricher, or feed) to this entity", notes = "Returns a summary of the added adjunct")
     @ApiResponses(value = {
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AdjunctDetail.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AdjunctDetail.java
index a2f348c..02c14da 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AdjunctDetail.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/AdjunctDetail.java
@@ -57,6 +57,14 @@
         return tags;
     }
     
+    public Map<String, Object> getConfig() {
+        return config;
+    }
+    
+    public Set<ConfigSummary> getParameters() {
+        return parameters;
+    }
+
     public AdjunctDetail parameter(ConfigSummary p) {
         parameters.add(p); return this;
     }
@@ -68,5 +76,5 @@
     public AdjunctDetail config(Map<String,Object> vals) {
         config.putAll(vals); return this;
     }
-
+    
 }
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java
index 9e48d4f..d417a6e 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java
@@ -39,6 +39,7 @@
 import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Feed;
 import org.apache.brooklyn.api.typereg.RegisteredType;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.DslUtils;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigPredicates;
 import org.apache.brooklyn.core.entity.EntityInternal;
@@ -68,11 +69,13 @@
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
+import com.google.common.base.Optional;
 import com.google.common.base.Predicates;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.io.Files;
+import com.google.common.reflect.TypeToken;
 
 @HaHotStateRequired
 public class AdjunctResource extends AbstractBrooklynRestResource implements AdjunctApi {
@@ -148,7 +151,13 @@
             }
         }
 
-        spec.configure(config);
+        try {
+            Optional<Map> configResolved = DslUtils.resolveNonDeferredBrooklynDslValue(config, TypeToken.of(Map.class), mgmt(), spec);
+            spec.configure(configResolved.or(config));
+        } catch (Exception e) {
+            log.debug("Error resolving config (rethrowing) "+config+": "+e, e);
+            throw Exceptions.propagate(e);
+        }
 
         EntityAdjunct instance;
         if (spec instanceof PolicySpec) {
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
index 5e1be91..1a7ef61 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
@@ -513,7 +513,7 @@
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
             legacyFormatException = e;
-            log.debug("Input is not legacy ApplicationSpec JSON (will try others): "+e, e);
+            log.debug("Input is not legacy ApplicationSpec JSON (will try others)");
         }
 
         //TODO infer encoding from request
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/AdjunctResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/AdjunctResourceTest.java
index 2bd9f2d..444a680 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/AdjunctResourceTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/AdjunctResourceTest.java
@@ -25,12 +25,15 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.apache.brooklyn.api.objs.BrooklynObjectType;
 import org.apache.brooklyn.api.objs.HighlightTuple;
+import org.apache.brooklyn.core.test.policy.TestPolicy;
 import org.apache.brooklyn.rest.domain.AdjunctDetail;
 import org.apache.brooklyn.rest.domain.AdjunctSummary;
 import org.apache.brooklyn.rest.domain.ApplicationSpec;
@@ -41,8 +44,11 @@
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimplePolicy;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.cxf.jaxrs.client.WebClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -79,7 +85,6 @@
         AdjunctDetail response = pResponse.readEntity(AdjunctDetail.class);
         assertNotNull(response.getId());
         policyId = response.getId();
-
     }
 
     @Test
@@ -87,11 +92,13 @@
         Set<AdjunctSummary> adjuncts = client().path(ENDPOINT)
                 .get(new GenericType<Set<AdjunctSummary>>() {});
         
-        AdjunctSummary policy = null;
+        AdjunctSummary initialPolicy = null;
         List<AdjunctSummary> others = MutableList.of();
         for (AdjunctSummary adj : adjuncts) {
             if (adj.getId().equals(policyId)) {
-                policy = adj;
+                initialPolicy = adj;
+            } else if (adj.getAdjunctType()==BrooklynObjectType.POLICY){
+                // policy from another test, just skip
             } else {
                 others.add(adj);
             }
@@ -100,7 +107,7 @@
         log.info("Non-policy adjuncts: "+others);
         Asserts.assertSize(others, 4);
 
-        assertEquals(policy.getName(), RestMockSimplePolicy.class.getName());
+        assertEquals(initialPolicy.getName(), RestMockSimplePolicy.class.getName());
     }
     
 
@@ -195,4 +202,39 @@
         assertEquals(highlightTupleNoTask.getTime(), 123L);
         assertEquals(highlightTupleNoTask.getTaskId(), null);
     }
+
+    protected AdjunctDetail doTestAddPolicyExpectX(Function<WebClient,WebClient> mutator, Object postBody) throws Exception {
+        AdjunctDetail result = mutator.apply(
+                client().path(ENDPOINT)
+            ).post(postBody, AdjunctDetail.class);
+        Assert.assertEquals(result.getConfig().get(TestPolicy.CONF_FROM_FUNCTION.getName()), "x");
+        return result;
+    }
+        
+    @Test
+    public void testAddPolicyX() throws Exception {
+        doTestAddPolicyExpectX(x -> x.query("type", TestPolicy.class.getName()), 
+            toJsonEntity(MutableMap.of(
+                TestPolicy.CONF_FROM_FUNCTION.getName(), "x")));
+    }
+    
+    @Test
+    public void testAddPolicyFn() throws Exception {
+        doTestAddPolicyExpectX(x -> x.query("type", TestPolicy.class.getName()), 
+            toJsonEntity(MutableMap.of(
+                TestPolicy.CONF_FROM_FUNCTION.getName(), "$brooklyn:literal(\"x\")")));
+    }
+
+//    // TODO support YAML posts
+//    @Test(groups = "WIP")
+//    public void testAddPolicyYaml() throws Exception {
+//        doTestAddPolicyExpectX(x -> x, 
+//            javax.ws.rs.client.Entity.entity(
+//              "type: "+TestPolicy.class.getName()+"\n"+
+//              "brooklyn.config:\n"+
+//              "  "+TestPolicy.CONF_FROM_FUNCTION.getName()+": "+
+//                  "$brooklyn.literal('x')", 
+//              "application/yaml"));
+//    }
+
 }
diff --git a/server-cli/NOTICE b/server-cli/NOTICE
index 9274c4f..3f419af 100644
--- a/server-cli/NOTICE
+++ b/server-cli/NOTICE
@@ -69,9 +69,9 @@
     Developed by: QOS.ch (http://www.qos.ch)
     License name: Eclipse Public License, version 1.0
   
-  com.fasterxml.jackson:2.9.7: 
+  com.fasterxml.jackson:2.9.8: 
     Project:      Jackson FasterXML
-    Version:      2.9.7
+    Version:      2.9.8
     Available at: 
       - http://github.com/FasterXML/jackson
       - http://wiki.fasterxml.com/JacksonExtensionXmlDataBinding
@@ -196,11 +196,11 @@
     License name: Apache License, version 2.0
     Notice:       Copyright (c) Square, Inc.
   
-  com.thoughtworks.xstream:1.4.8: 
+  com.thoughtworks.xstream:1.4.11.1: 
     Project:      XStream Core
-    Version:      1.4.8
+    Version:      1.4.11.1
     Available at: http://x-stream.github.io/
-    Developed by: XStream (http://xstream.codehaus.org)
+    Developed by: XStream (http://x-stream.github.io)
     License name: BSD 3-Clause (New BSD) License
   
   commons-beanutils:1.9.3: 
@@ -251,11 +251,11 @@
     Available at: https://github.com/airlift/airline
     License name: Apache License, version 2.0
   
-  io.cloudsoft.windows:0.6.1: 
+  io.cloudsoft.windows:0.7.0: 
     Project: 
       - Java WinRM library
       - WinRM Client
-    Version:      0.6.1
+    Version:      0.7.0
     Available at: http://github.com/cloudsoft/winrm4j
     License name: Apache License, version 2.0
   
@@ -269,12 +269,6 @@
     Available at: https://github.com/swagger-api/swagger-core
     License name: Apache License, version 2.0
   
-  javax.activation:1.1.1: 
-    Project:      JavaBeans(TM) Activation Framework
-    Version:      1.1.1
-    Available at: http://java.sun.com/javase/technologies/desktop/javabeans/jaf/index.jsp
-    License name: Common Development and Distribution License, version 1.0
-  
   javax.annotation.javax.annotation-api:1.3: 
     Project:      javax.annotation API
     Version:      1.3
@@ -314,13 +308,6 @@
     Developed by: Eclipse Foundation (https://www.eclipse.org/org/foundation/)
     License name: Common Development and Distribution License, version 1.1
   
-  javax.xml.bind.jaxb-api:2.2.11: 
-    Project:      Java Architecture for XML Binding
-    Version:      2.2.11
-    Available at: http://jaxb.java.net/
-    Developed by: Oracle Corporation (http://www.oracle.com/)
-    License name: Common Development and Distribution License, version 1.1
-  
   joda-time:2.7: 
     Project:      Joda-Time
     Version:      2.7
@@ -362,11 +349,11 @@
     Developed by: Chemouni Uriel (http://www.minidev.net/)
     License name: Apache License, version 2.0
   
-  org.apache.commons.commons-compress:1.4: 
-    Project:      Commons Compress
-    Version:      1.4
-    Available at: http://commons.apache.org/compress/
-    Developed by: The Apache Software Foundation (http://www.apache.org/)
+  org.apache.commons.commons-compress:1.18: 
+    Project:      Apache Commons Compress
+    Version:      1.18
+    Available at: https://commons.apache.org/proper/commons-compress/
+    Developed by: The Apache Software Foundation (https://www.apache.org/)
     License name: Apache License, version 2.0
   
   org.apache.commons.commons-lang3:3.3.2: 
@@ -376,20 +363,34 @@
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
-  org.apache.cxf:3.2.7: 
+  org.apache.cxf:3.2.8: 
     Project:      Apache CXF
-    Version:      3.2.7
+    Version:      3.2.8
     Available at: http://cxf.apache.org
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
-  org.apache.felix.org.apache.felix.framework:5.6.10: 
+  org.apache.felix.org.apache.felix.framework:5.6.12: 
     Project:      Apache Felix Framework
-    Version:      5.6.10
+    Version:      5.6.12
     Available at: http://felix.apache.org/
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
+  org.apache.geronimo.specs.geronimo-activation_1.1_spec:1.1: 
+    Project:      Activation 1.1
+    Version:      1.1
+    Available at: http://geronimo.apache.org/maven/specs/geronimo-activation_1.1_spec/1.1
+    Developed by: The Apache Software Foundation (http://www.apache.org)
+    License name: Apache License, version 2.0
+  
+  org.apache.geronimo.specs.geronimo-stax-api_1.0_spec:1.0.1: 
+    Project:      Streaming API for XML (STAX API 1.0)
+    Version:      1.0.1
+    Available at: http://geronimo.apache.org/specs/geronimo-stax-api_1.0_spec
+    Developed by: Apache Software Foundation (http://www.apache.org)
+    License name: Apache License, version 2.0
+  
   org.apache.geronimo.specs.geronimo-ws-metadata_2.0_spec:1.1.3: 
     Project:      Web Services Metadata 2.0
     Version:      1.1.3
@@ -439,9 +440,20 @@
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
   
-  org.apache.ws.xmlschema.xmlschema-core:2.2.3: 
+  org.apache.servicemix.specs:2.9.0: 
+    Project: 
+      - Apache ServiceMix :: Specs :: Activation API 1.4
+      - Apache ServiceMix :: Specs :: Activator
+      - Apache ServiceMix :: Specs :: JAXB API 2.2
+      - Apache ServiceMix :: Specs :: Stax API 1.0
+    Version:      2.9.0
+    Available at: http://servicemix.apache.org/
+    Developed by: The Apache Software Foundation (http://www.apache.org/)
+    License name: Apache License, version 2.0
+  
+  org.apache.ws.xmlschema.xmlschema-core:2.2.4: 
     Project:      XmlSchema Core
-    Version:      2.2.3
+    Version:      2.2.4
     Available at: http://ws.apache.org/commons/xmlschema20/
     Developed by: The Apache Software Foundation (http://www.apache.org/)
     License name: Apache License, version 2.0
@@ -469,28 +481,18 @@
     Developed by: fasterxml.com (http://fasterxml.com)
     License name: BSD 2-Clause (Simplified or FreeBSD) License
   
-  org.eclipse.jetty.toolchain.jetty-schemas:3.1.M0: 
-    Project:      Jetty :: Schemas
-    Version:      3.1.M0
-    Available at: http://www.eclipse.org/jetty
-    Developed by: Mort Bay Consulting (http://www.mortbay.com)
-    License name: Apache License, version 2.0
-  
-  org.eclipse.jetty:9.4.12.v20180830: 
+  org.eclipse.jetty:9.4.20.v20190813: 
     Project: 
       - Jetty :: Http Utility
       - Jetty :: IO Utility
-      - Jetty :: JAAS
       - Jetty :: Security
       - Jetty :: Server Core
       - Jetty :: Servlet Handling
       - Jetty :: Utilities
       - Jetty :: Webapp Application Support
       - Jetty :: XML utilities
-    Version:      9.4.12.v20180830
-    Available at: 
-      - http://www.eclipse.org/jetty
-      - https://eclipse.org/jetty
+    Version:      9.4.20.v20190813
+    Available at: http://www.eclipse.org/jetty
     Developed by: Webtide (https://webtide.com)
     License name: Apache License, version 2.0
   
@@ -548,12 +550,6 @@
     Developed by: QOS.ch (http://www.qos.ch)
     License name: MIT License
   
-  org.tukaani.xz:1.0: 
-    Project:      XZ for Java
-    Version:      1.0
-    Available at: http://tukaani.org/xz/java.html
-    License name: Public Domain
-  
   org.xmlunit:2.3.0: 
     Project: 
       - org.xmlunit:xmlunit-core
