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

[2/4] brooklyn-server git commit: Delete deprecated ApplicationBuilder

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/core/src/test/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocationRebindTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocationRebindTest.java b/core/src/test/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocationRebindTest.java
index caef64e..f8d8440 100644
--- a/core/src/test/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocationRebindTest.java
+++ b/core/src/test/java/org/apache/brooklyn/location/byon/FixedListMachineProvisioningLocationRebindTest.java
@@ -20,23 +20,16 @@ package org.apache.brooklyn.location.byon;
 
 import static org.testng.Assert.assertEquals;
 
-import java.io.File;
 import java.util.Set;
 
 import javax.annotation.Nullable;
 
 import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.location.LocationConfigKeys;
-import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils;
+import org.apache.brooklyn.core.mgmt.rebind.RebindTestFixtureWithApp;
 import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.location.byon.FixedListMachineProvisioningLocation;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.os.Os;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -44,19 +37,13 @@ import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
-public class FixedListMachineProvisioningLocationRebindTest {
+public class FixedListMachineProvisioningLocationRebindTest extends RebindTestFixtureWithApp {
 
     private FixedListMachineProvisioningLocation<SshMachineLocation> origLoc;
-    private ClassLoader classLoader = getClass().getClassLoader();
-    private ManagementContext origManagementContext;
-    private TestApplication origApp;
-    private TestApplication newApp;
-    private File mementoDir;
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
-        mementoDir = Os.newTempDir(getClass());
-        origManagementContext = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader, 1);
+        super.setUp();
         
         origLoc = new FixedListMachineProvisioningLocation.Builder(origManagementContext.getLocationManager())
                 .addAddresses("localhost", "127.0.0.1")
@@ -65,17 +52,9 @@ public class FixedListMachineProvisioningLocationRebindTest {
                 .keyData("myKeyData")
                 .keyPassphrase("myKeyPassphrase")
                 .build();
-        origApp = ApplicationBuilder.newManagedApp(TestApplication.class, origManagementContext);
         origApp.start(ImmutableList.of(origLoc));
     }
 
-    @AfterMethod(alwaysRun = true)
-    public void tearDown() throws Exception {
-        if (origManagementContext != null) Entities.destroyAll(origManagementContext);
-        if (newApp != null) Entities.destroyAll(newApp.getManagementContext());
-        if (mementoDir != null) RebindTestUtils.deleteMementoDir(mementoDir);
-    }
-    
     @Test
     public void testRebindPreservesConfig() throws Exception {
         newApp = rebind();
@@ -112,11 +91,6 @@ public class FixedListMachineProvisioningLocationRebindTest {
         assertLocationIdsEqual(newLoc.getAvailable(), origLoc.getAvailable());
     }
 
-    private TestApplication rebind() throws Exception {
-        RebindTestUtils.stopPersistence(origApp);
-        return (TestApplication) RebindTestUtils.rebind(mementoDir, getClass().getClassLoader());
-    }
-    
     private void assertLocationIdsEqual(Iterable<? extends Location> actual, Iterable<? extends Location> expected) {
         Function<Location, String> locationIdFunction = new Function<Location, String>() {
             @Override public String apply(@Nullable Location input) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/core/src/test/java/org/apache/brooklyn/location/multi/MultiLocationRebindTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/location/multi/MultiLocationRebindTest.java b/core/src/test/java/org/apache/brooklyn/location/multi/MultiLocationRebindTest.java
index e26b210..6ebd492 100644
--- a/core/src/test/java/org/apache/brooklyn/location/multi/MultiLocationRebindTest.java
+++ b/core/src/test/java/org/apache/brooklyn/location/multi/MultiLocationRebindTest.java
@@ -18,27 +18,17 @@
  */
 package org.apache.brooklyn.location.multi;
 
-import java.io.File;
 import java.util.List;
 
-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.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.location.cloud.AvailabilityZoneExtension;
-import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.mgmt.rebind.RebindTestFixtureWithApp;
 import org.apache.brooklyn.location.byon.FixedListMachineProvisioningLocation;
-import org.apache.brooklyn.location.multi.MultiLocation;
 import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.net.Networking;
-import org.apache.brooklyn.util.os.Os;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
@@ -46,36 +36,14 @@ import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
-public class MultiLocationRebindTest {
+public class MultiLocationRebindTest extends RebindTestFixtureWithApp {
 
-    private ClassLoader classLoader = getClass().getClassLoader();
-    private ManagementContext origManagementContext;
-    private ManagementContext newManagementContext;
-    private File mementoDir;
-    
-    private TestApplication origApp;
-    private TestApplication newApp;
     private SshMachineLocation mac1a;
     private SshMachineLocation mac2a;
     private FixedListMachineProvisioningLocation<SshMachineLocation> loc1;
     private FixedListMachineProvisioningLocation<SshMachineLocation> loc2;
     private MultiLocation<SshMachineLocation> multiLoc;
     
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        mementoDir = Os.newTempDir(getClass());
-        origManagementContext = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader, 1);
-        origApp = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class), origManagementContext);
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (origManagementContext != null) Entities.destroyAll(origManagementContext);
-        if (newApp != null) Entities.destroyAll(newApp.getManagementContext());
-        if (newManagementContext != null) Entities.destroyAll(newManagementContext);
-        if (mementoDir != null) RebindTestUtils.deleteMementoDir(mementoDir);
-    }
-
     @SuppressWarnings("unchecked")
     @Test
     public void testRebindsMultiLocation() throws Exception {
@@ -98,7 +66,7 @@ public class MultiLocationRebindTest {
         newApp = rebind();
         newManagementContext = newApp.getManagementContext();
         
-        MultiLocation newMultiLoc = (MultiLocation) Iterables.find(newManagementContext.getLocationManager().getLocations(), Predicates.instanceOf(MultiLocation.class));
+        MultiLocation<?> newMultiLoc = (MultiLocation<?>) Iterables.find(newManagementContext.getLocationManager().getLocations(), Predicates.instanceOf(MultiLocation.class));
         AvailabilityZoneExtension azExtension = newMultiLoc.getExtension(AvailabilityZoneExtension.class);
         List<Location> newSublLocs = azExtension.getAllSubLocations();
         Iterable<String> newSubLocNames = Iterables.transform(newSublLocs, new Function<Location, String>() {
@@ -107,16 +75,4 @@ public class MultiLocationRebindTest {
             }});
         Asserts.assertEqualsIgnoringOrder(newSubLocNames, ImmutableList.of("loc1", "loc2"));
     }
-    
-    private TestApplication rebind() throws Exception {
-        return rebind(true);
-    }
-    
-    private TestApplication rebind(boolean checkSerializable) throws Exception {
-        RebindTestUtils.stopPersistence(origApp);
-        if (checkSerializable) {
-            RebindTestUtils.checkCurrentMementoSerializable(origApp);
-        }
-        return (TestApplication) RebindTestUtils.rebind(mementoDir, getClass().getClassLoader());
-    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java
----------------------------------------------------------------------
diff --git a/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java b/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java
index 12f6833..03efc5d 100644
--- a/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java
+++ b/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java
@@ -45,7 +45,6 @@ import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.catalog.internal.CatalogInitialization;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.StartableApplication;
 import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
@@ -105,8 +104,7 @@ public class BasicLauncher<T extends BasicLauncher<T>> {
     private final List<String> locationSpecs = new ArrayList<String>();
     private final List<Location> locations = new ArrayList<Location>();
 
-    @SuppressWarnings("deprecation") // TODO convert to EntitySpec; should be easy when users not allowed to pass in a builder
-    private final List<org.apache.brooklyn.core.entity.factory.ApplicationBuilder> appBuildersToManage = new ArrayList<org.apache.brooklyn.core.entity.factory.ApplicationBuilder>();
+    private final List<EntitySpec<? extends Application>> appSpecsToManage = new ArrayList<>();
     private final List<String> yamlAppsToManage = new ArrayList<String>();
     private final List<Application> apps = new ArrayList<Application>();
     
@@ -143,36 +141,13 @@ public class BasicLauncher<T extends BasicLauncher<T>> {
     }
 
     /** 
-     * Specifies that the launcher should build and manage the given Brooklyn application.
-     * The application must not yet be managed. 
-     * The application will not be started as part of this call (callers can
-     * subsequently call {@link #start()} or {@link #getApplications()}.
-     * 
-     * @see #application(EntitySpec)
-     * 
-     * @deprecated since 0.9.0; instead use {@link #application(String)} for YAML apps, or {@link #application(EntitySpec)}.
-     *             Note that apps are now auto-managed on construction through EntitySpec/YAML.
-     */
-    @Deprecated
-    public T application(org.apache.brooklyn.core.entity.factory.ApplicationBuilder appBuilder) {
-        LOG.warn("Caller supplied ApplicationBuilder; convert to EntitySpec as this style builder may not be supported in future.");
-        appBuildersToManage.add(checkNotNull(appBuilder, "appBuilder"));
-        return self();
-    }
-
-    /** 
      * Specifies that the launcher should build and manage the Brooklyn application
      * described by the given spec.
      * The application will not be started as part of this call (callers can
      * subsequently call {@link #start()} or {@link #getApplications()}.
-     * 
-     * @see #application(Application)
      */
-    @SuppressWarnings("deprecation")  // when appsToManage is EntitySpec this will no longer be needed
-    public T application(EntitySpec<? extends StartableApplication> appSpec) {
-        appBuildersToManage.add(new org.apache.brooklyn.core.entity.factory.ApplicationBuilder(checkNotNull(appSpec, "appSpec")) {
-                @Override protected void doBuild() {
-                }});
+    public T application(EntitySpec<? extends Application> appSpec) {
+        appSpecsToManage.add(appSpec);
         return self();
     }
 
@@ -652,10 +627,9 @@ public class BasicLauncher<T extends BasicLauncher<T>> {
         rebindManager.startPersistence();
     }
 
-    @SuppressWarnings("deprecation")
     protected void createApps() {
-        for (org.apache.brooklyn.core.entity.factory.ApplicationBuilder appBuilder : appBuildersToManage) {
-            StartableApplication app = appBuilder.manage(managementContext);
+        for (EntitySpec<? extends Application> spec : appSpecsToManage) {
+            Application app = managementContext.getEntityManager().createEntity(spec);
             apps.add(app);
         }
         for (String blueprint : yamlAppsToManage) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java
----------------------------------------------------------------------
diff --git a/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java b/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java
index e013884..3c874f8 100644
--- a/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java
+++ b/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java
@@ -37,7 +37,6 @@ import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityInternal;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.launcher.BrooklynWebServer;
@@ -90,7 +89,7 @@ public class BrooklynEntityMirrorIntegrationTest {
             server.start();
             
             serverMgmt.getHighAvailabilityManager().disabled();
-            serverApp = ApplicationBuilder.newManagedApp(TestApplication.class, serverMgmt);
+            serverApp = TestApplication.Factory.newManagedInstanceForTests(serverMgmt);
             
             ((LocalManagementContextForTests)serverMgmt).noteStartupComplete();
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeRestTest.java
----------------------------------------------------------------------
diff --git a/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeRestTest.java b/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeRestTest.java
index ca8f699..b54fe3c 100644
--- a/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeRestTest.java
+++ b/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeRestTest.java
@@ -45,7 +45,6 @@ import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityInternal;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.launcher.SimpleYamlLauncherForTests;
@@ -67,7 +66,7 @@ public class BrooklynNodeRestTest {
     public void testBrooklynNodeRestDeployAndMirror() {
         final SimpleYamlLauncher l = new SimpleYamlLauncherForTests();
         try {
-            TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class, l.getManagementContext());
+            TestApplication app = TestApplication.Factory.newManagedInstanceForTests(l.getManagementContext());
 
             BrooklynNode bn = app.createAndManageChild(EntitySpec.create(BrooklynNode.class, SameBrooklynNodeImpl.class));
             bn.start(MutableSet.<Location>of());

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java
----------------------------------------------------------------------
diff --git a/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java b/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java
index 8e89352..f2fb412 100644
--- a/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java
+++ b/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java
@@ -172,19 +172,6 @@ public class BrooklynLauncherTest {
     }
     
     @Test
-    @SuppressWarnings("deprecation")
-    public void testStartsAppFromBuilder() throws Exception {
-        launcher = newLauncherForTests(true)
-                .webconsole(false)
-                .application(new org.apache.brooklyn.core.entity.factory.ApplicationBuilder(EntitySpec.create(TestApplication.class)) {
-                        @Override protected void doBuild() {
-                        }})
-                .start();
-        
-        assertOnlyApp(launcher, TestApplication.class);
-    }
-
-    @Test
     public void testStartsAppFromYAML() throws Exception {
         String yaml = "name: example-app\n" +
                 "services:\n" +

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/policy/src/test/java/org/apache/brooklyn/policy/ha/ConnectionFailureDetectorTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/ha/ConnectionFailureDetectorTest.java b/policy/src/test/java/org/apache/brooklyn/policy/ha/ConnectionFailureDetectorTest.java
index 0ef1ac8..e8ea2a1 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/ha/ConnectionFailureDetectorTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/ha/ConnectionFailureDetectorTest.java
@@ -28,15 +28,11 @@ import java.net.ServerSocket;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.policy.PolicySpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
-import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableMap;
@@ -55,26 +51,23 @@ import com.google.common.net.HostAndPort;
 // at least one report of *test* failures, as in no events coming in;
 // log unavailable but the test has been passing everywhere else so we
 // suspect some environments don't support this test
-public class ConnectionFailureDetectorTest {
+public class ConnectionFailureDetectorTest extends BrooklynAppUnitTestSupport {
 
     private static final int TIMEOUT_MS = 30*1000;
     private static final int OVERHEAD = 250;
     private static final int POLL_PERIOD = 100;
 
-    private ManagementContext managementContext;
-    private TestApplication app;
-    
     private List<SensorEvent<FailureDescriptor>> events;
     
     private ServerSocket serverSocket;
     private HostAndPort serverSocketAddress;
     
     @BeforeMethod(alwaysRun=true)
+    @Override
     public void setUp() throws Exception {
-        events = new CopyOnWriteArrayList<SensorEvent<FailureDescriptor>>();
+        super.setUp();
         
-        managementContext = new LocalManagementContextForTests();
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext);
+        events = new CopyOnWriteArrayList<SensorEvent<FailureDescriptor>>();
         
         app.getManagementContext().getSubscriptionManager().subscribe(
                 app, 
@@ -98,8 +91,11 @@ public class ConnectionFailureDetectorTest {
     
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
-        stopServerSocket();
-        if (managementContext != null) Entities.destroyAll(managementContext);
+        try {
+            stopServerSocket();
+        } finally {
+            super.tearDown();
+        }
     }
     
     private HostAndPort startServerSocket() throws Exception {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorStabilizationTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorStabilizationTest.java b/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorStabilizationTest.java
index 8c67489..faeeba8 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorStabilizationTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorStabilizationTest.java
@@ -25,53 +25,47 @@ import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogicTest;
-import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
-import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
 
 /** also see more primitive tests in {@link ServiceStateLogicTest} */
-public class ServiceFailureDetectorStabilizationTest {
+public class ServiceFailureDetectorStabilizationTest extends BrooklynAppUnitTestSupport {
 
     private static final Logger LOG = LoggerFactory.getLogger(ServiceFailureDetectorStabilizationTest.class);
 
     private static final int TIMEOUT_MS = 10*1000;
     private static final int OVERHEAD = 250;
 
-    private ManagementContext managementContext;
-    private TestApplication app;
     private TestEntity e1;
     
     private List<SensorEvent<FailureDescriptor>> events;
     
     @BeforeMethod(alwaysRun=true)
+    @Override
     public void setUp() throws Exception {
+        super.setUp();
+        
         events = new CopyOnWriteArrayList<SensorEvent<FailureDescriptor>>();
         
-        managementContext = new LocalManagementContextForTests();
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext);
         e1 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         e1.sensors().set(TestEntity.SERVICE_UP, true);
         ServiceStateLogic.setExpectedState(e1, Lifecycle.RUNNING);
@@ -94,11 +88,6 @@ public class ServiceFailureDetectorStabilizationTest {
                 });
     }
     
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (managementContext != null) Entities.destroyAll(managementContext);
-    }
-    
     @Test(groups="Integration") // Because slow
     public void testNotNotifiedOfTemporaryFailuresDuringStabilisationDelay() throws Exception {
         e1.enrichers().add(EnricherSpec.create(ServiceFailureDetector.class)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorTest.java b/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorTest.java
index 8f15e99..6df79bb 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceFailureDetectorTest.java
@@ -26,50 +26,46 @@ import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.sensor.EnricherSpec;
 import org.apache.brooklyn.api.sensor.Sensor;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
 import org.apache.brooklyn.core.entity.Attributes;
-import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityAsserts;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ServiceProblemsLogic;
-import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableMap;
 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.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
-import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
 
-public class ServiceFailureDetectorTest {
+public class ServiceFailureDetectorTest extends BrooklynAppUnitTestSupport {
     private static final Logger log = LoggerFactory.getLogger(ServiceFailureDetectorTest.class);
 
     private static final int TIMEOUT_MS = 10*1000;
 
-    private ManagementContext managementContext;
-    private TestApplication app;
     private TestEntity e1;
     
     private List<SensorEvent<FailureDescriptor>> events;
     private SensorEventListener<FailureDescriptor> eventListener;
     
     @BeforeMethod(alwaysRun=true)
+    @Override
     public void setUp() throws Exception {
+        super.setUp();
+        
         events = new CopyOnWriteArrayList<SensorEvent<FailureDescriptor>>();
         eventListener = new SensorEventListener<FailureDescriptor>() {
             @Override public void onEvent(SensorEvent<FailureDescriptor> event) {
@@ -77,8 +73,6 @@ public class ServiceFailureDetectorTest {
             }
         };
         
-        managementContext = new LocalManagementContextForTests();
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext);
         e1 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         e1.enrichers().add(ServiceStateLogic.newEnricherForServiceStateFromProblemsAndUp());
         
@@ -86,11 +80,6 @@ public class ServiceFailureDetectorTest {
         app.getManagementContext().getSubscriptionManager().subscribe(e1, HASensors.ENTITY_RECOVERED, eventListener);
     }
     
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (managementContext != null) Entities.destroyAll(managementContext);
-    }
-    
     @Test(groups="Integration") // Has a 1 second wait
     public void testNotNotifiedOfFailuresForHealthy() throws Exception {
         // Create members before and after the policy is registered, to test both scenarios

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceReplacerTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceReplacerTest.java b/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceReplacerTest.java
index 5faf289..392a50c 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceReplacerTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/ha/ServiceReplacerTest.java
@@ -31,7 +31,6 @@ import org.apache.brooklyn.api.entity.Entity;
 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.PolicySpec;
 import org.apache.brooklyn.api.sensor.SensorEvent;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
@@ -39,15 +38,14 @@ import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityAsserts;
 import org.apache.brooklyn.core.entity.EntityInternal;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ComputeServiceIndicatorsFromChildrenAndMembers;
 import org.apache.brooklyn.core.entity.trait.FailingEntity;
 import org.apache.brooklyn.core.location.SimulatedLocation;
-import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.entity.group.DynamicCluster;
+import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.QuorumCheck;
 import org.apache.brooklyn.util.core.config.ConfigBag;
@@ -55,10 +53,8 @@ import org.apache.brooklyn.util.javalang.JavaClassNames;
 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;
-import org.apache.brooklyn.policy.ha.HASensors.FailureDescriptor;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
@@ -68,21 +64,19 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-public class ServiceReplacerTest {
+public class ServiceReplacerTest extends BrooklynAppUnitTestSupport {
 
     private static final Logger log = LoggerFactory.getLogger(ServiceReplacerTest.class);
     
-    private ManagementContext managementContext;
-    private TestApplication app;
     private SimulatedLocation loc;
     private SensorEventListener<Object> eventListener;
     private List<SensorEvent<?>> events;
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
-        managementContext = new LocalManagementContextForTests();
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext);
-        loc = managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class));
+        super.setUp();
+        
+        loc = app.newSimulatedLocation();
         events = Lists.newCopyOnWriteArrayList();
         eventListener = new SensorEventListener<Object>() {
             @Override public void onEvent(SensorEvent<Object> event) {
@@ -91,11 +85,6 @@ public class ServiceReplacerTest {
         };
     }
     
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (managementContext != null) Entities.destroyAll(managementContext);
-    }
-    
     @Test
     public void testReplacesFailedMember() throws Exception {
         final DynamicCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class)
@@ -165,7 +154,7 @@ public class ServiceReplacerTest {
 
         // Expect to have the second failed entity still kicking around as proof (in quarantine)
         // The cluster should NOT go on fire until after the 2nd failure
-        Iterable<Entity> members = Iterables.filter(managementContext.getEntityManager().getEntities(), Predicates.instanceOf(FailingEntity.class));
+        Iterable<Entity> members = Iterables.filter(mgmt.getEntityManager().getEntities(), Predicates.instanceOf(FailingEntity.class));
         assertEquals(Iterables.size(members), 2);
 
         // e2 failed to start, so it won't have called stop on e1
@@ -300,7 +289,7 @@ public class ServiceReplacerTest {
             if (i <= 3) {
                 Asserts.succeedsEventually(new Runnable() {
                     @Override public void run() {
-                        Set<FailingEntity> all = ImmutableSet.copyOf(Iterables.filter(managementContext.getEntityManager().getEntities(), FailingEntity.class));
+                        Set<FailingEntity> all = ImmutableSet.copyOf(Iterables.filter(mgmt.getEntityManager().getEntities(), FailingEntity.class));
                         Set<FailingEntity> replacements = Sets.difference(all, initialMembers);
                         Set<?> replacementMembers = Sets.intersection(ImmutableSet.of(cluster.getMembers()), replacements);
                         assertTrue(replacementMembers.isEmpty());
@@ -309,7 +298,7 @@ public class ServiceReplacerTest {
             } else {
                 Asserts.succeedsContinually(new Runnable() {
                     @Override public void run() {
-                        Set<FailingEntity> all = ImmutableSet.copyOf(Iterables.filter(managementContext.getEntityManager().getEntities(), FailingEntity.class));
+                        Set<FailingEntity> all = ImmutableSet.copyOf(Iterables.filter(mgmt.getEntityManager().getEntities(), FailingEntity.class));
                         Set<FailingEntity> replacements = Sets.difference(all, initialMembers);
                         assertEquals(replacements.size(), 4);
                     }});

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/BalanceableWorkerPoolTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/BalanceableWorkerPoolTest.java b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/BalanceableWorkerPoolTest.java
index 770e3f5..52f99b4 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/BalanceableWorkerPoolTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/BalanceableWorkerPoolTest.java
@@ -24,45 +24,39 @@ import static org.testng.Assert.fail;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.entity.Group;
 import org.apache.brooklyn.api.entity.ImplementedBy;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
+import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.core.entity.trait.Resizable;
 import org.apache.brooklyn.core.location.SimulatedLocation;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.entity.group.AbstractGroup;
 import org.apache.brooklyn.entity.group.AbstractGroupImpl;
 import org.apache.brooklyn.entity.group.DynamicGroup;
-import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 
-public class BalanceableWorkerPoolTest {
+public class BalanceableWorkerPoolTest extends BrooklynAppUnitTestSupport {
 
-    private static final Logger LOG = LoggerFactory.getLogger(BalanceableWorkerPoolTest.class);
-    
     protected static final long TIMEOUT_MS = 10*1000;
     protected static final long SHORT_WAIT_MS = 250;
     
     protected static final long CONTAINER_STARTUP_DELAY_MS = 100;
     
-    protected TestApplication app;
     protected SimulatedLocation loc;
     protected BalanceableWorkerPool pool;
     protected Group containerGroup;
     protected Group itemGroup;
     
     @BeforeMethod(alwaysRun=true)
-    public void before() {
-        loc = new SimulatedLocation(MutableMap.of("name", "loc"));
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        loc = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)
+                .configure("name", "loc"));
         
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         containerGroup = app.createAndManageChild(EntitySpec.create(DynamicGroup.class)
                 .displayName("containerGroup")
                 .configure(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(MockContainerEntity.class)));
@@ -75,11 +69,6 @@ public class BalanceableWorkerPoolTest {
         app.start(ImmutableList.of(loc));
     }
     
-    @AfterMethod(alwaysRun=true)
-    public void after() {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-    
     @Test
     public void testDefaultResizeFailsIfContainerGroupNotResizable() throws Exception {
         try {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/ItemsInContainersGroupTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/ItemsInContainersGroupTest.java b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/ItemsInContainersGroupTest.java
index 973a1a3..59a9b24 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/ItemsInContainersGroupTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/ItemsInContainersGroupTest.java
@@ -23,14 +23,14 @@ import static org.testng.Assert.assertEquals;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.entity.Group;
+import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.location.SimulatedLocation;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.entity.group.DynamicGroup;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableMap;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -38,21 +38,21 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
-public class ItemsInContainersGroupTest {
+public class ItemsInContainersGroupTest extends BrooklynAppUnitTestSupport {
 
     // all tests are 20ms or less, but use a big timeout just in case very slow machine!
     private static final long TIMEOUT_MS = 15000;
     
-    private TestApplication app;
     private SimulatedLocation loc;
     private Group containerGroup;
     private ItemsInContainersGroup itemGroup;
 
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
-        loc = new SimulatedLocation(MutableMap.of("name", "loc"));
+        super.setUp();
+        loc = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)
+                .configure("name", "loc"));
         
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         containerGroup = app.createAndManageChild(EntitySpec.create(DynamicGroup.class)
                 .displayName("containerGroup")
                 .configure(DynamicGroup.ENTITY_FILTER, new Predicate<Entity>() {
@@ -68,11 +68,6 @@ public class ItemsInContainersGroupTest {
         app.start(ImmutableList.of(loc));
     }
 
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
     @Test
     public void testSimpleMembership() throws Exception {
         MockContainerEntity containerIn = newContainer(app, "A", "ingroup");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
index d9eb7ee..600c90f 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/BrooklynRestResourceUtils.java
@@ -21,7 +21,6 @@ package org.apache.brooklyn.rest.util;
 import static com.google.common.collect.Iterables.transform;
 import static org.apache.brooklyn.rest.util.WebResourceUtils.notFound;
 
-import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashMap;
@@ -300,7 +299,6 @@ public class BrooklynRestResourceUtils {
         }
     }
     
-    @SuppressWarnings({ "deprecation" })
     public Application create(ApplicationSpec spec) {
         log.warn("Using deprecated functionality (as of 0.9.0), ApplicationSpec style (pre CAMP plans). " +
                     "Transition to actively supported spec plans.");
@@ -332,21 +330,7 @@ public class BrooklynRestResourceUtils {
         }
 
         try {
-            if (org.apache.brooklyn.core.entity.factory.ApplicationBuilder.class.isAssignableFrom(itemAndClass.clazz)) {
-                // warning only added in 0.9.0
-                log.warn("Using deprecated ApplicationBuilder "+itemAndClass.clazz+"; callers must migrate to use of Application");
-                Constructor<?> constructor = itemAndClass.clazz.getConstructor();
-                org.apache.brooklyn.core.entity.factory.ApplicationBuilder appBuilder = (org.apache.brooklyn.core.entity.factory.ApplicationBuilder) constructor.newInstance();
-                if (!Strings.isEmpty(name)) appBuilder.appDisplayName(name);
-                if (entities.size() > 0)
-                    log.warn("Cannot supply additional entities when using an ApplicationBuilder; ignoring in spec {}", spec);
-
-                log.info("REST placing '{}' under management", spec.getName());
-                appBuilder.configure(convertFlagsToKeys(appBuilder.getType(), configO));
-                configureRenderingMetadata(spec, appBuilder);
-                instance = appBuilder.manage(mgmt);
-
-            } else if (Application.class.isAssignableFrom(itemAndClass.clazz)) {
+            if (Application.class.isAssignableFrom(itemAndClass.clazz)) {
                 org.apache.brooklyn.api.entity.EntitySpec<?> coreSpec = toCoreEntitySpec(itemAndClass.clazz, name, configO, itemAndClass.catalogItemId);
                 configureRenderingMetadata(spec, coreSpec);
                 for (EntitySpec entitySpec : entities) {
@@ -432,11 +416,6 @@ public class BrooklynRestResourceUtils {
         return result;
     }
     
-    @SuppressWarnings("deprecation")
-    protected void configureRenderingMetadata(ApplicationSpec spec, org.apache.brooklyn.core.entity.factory.ApplicationBuilder appBuilder) {
-        appBuilder.configure(getRenderingConfigurationFor(spec.getType()));
-    }
-
     protected void configureRenderingMetadata(ApplicationSpec input, org.apache.brooklyn.api.entity.EntitySpec<?> entity) {
         entity.configure(getRenderingConfigurationFor(input.getType()));
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
index 967d72d..277fd32 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
@@ -212,31 +212,6 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
         assertEquals(client().path(appUri).get(ApplicationSummary.class).getSpec().getName(), "simple-app-interface");
     }
 
-    @SuppressWarnings("deprecation")
-    @Test(dependsOnMethods = { "testDeployApplication", "testLocatedLocation" })
-    public void testDeployApplicationFromBuilder() throws Exception {
-        ApplicationSpec spec = ApplicationSpec.builder()
-                .type(org.apache.brooklyn.rest.testing.mocks.RestMockAppBuilder.class.getCanonicalName())
-                .name("simple-app-builder")
-                .locations(ImmutableSet.of("localhost"))
-                .build();
-
-        Response response = clientDeploy(spec);
-        assertTrue(response.getStatus() / 100 == 2, "response is " + response);
-
-        // Expect app to be running
-        URI appUri = response.getLocation();
-        waitForApplicationToBeRunning(response.getLocation(), Duration.TEN_SECONDS);
-        assertEquals(client().path(appUri).get(ApplicationSummary.class).getSpec().getName(), "simple-app-builder");
-
-        // Expect app to have the child-entity
-        Set<EntitySummary> entities = client().path(appUri.toString() + "/entities")
-                .get(new GenericType<Set<EntitySummary>>() {});
-        assertEquals(entities.size(), 1);
-        assertEquals(Iterables.getOnlyElement(entities).getName(), "child1");
-        assertEquals(Iterables.getOnlyElement(entities).getType(), RestMockSimpleEntity.class.getCanonicalName());
-    }
-
     @Test(dependsOnMethods = { "testDeployApplication", "testLocatedLocation" })
     public void testDeployApplicationYaml() throws Exception {
         String yaml = "{ name: simple-app-yaml, location: localhost, services: [ { serviceType: "+BasicApplication.class.getCanonicalName()+" } ] }";

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockAppBuilder.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockAppBuilder.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockAppBuilder.java
deleted file mode 100644
index affb3f3..0000000
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockAppBuilder.java
+++ /dev/null
@@ -1,41 +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.rest.testing.mocks;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.core.entity.StartableApplication;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
-import org.apache.brooklyn.util.javalang.Reflections;
-
-/** @deprecated since 0.9.0 don't use {@link ApplicationBuilder} */
-@Deprecated
-public class RestMockAppBuilder extends ApplicationBuilder {
-
-    public RestMockAppBuilder() {
-        super(EntitySpec.create(StartableApplication.class).impl(RestMockApp.class));
-    }
-    
-    @Override
-    protected void doBuild() {
-        addChild(EntitySpec.create(Entity.class).impl(RestMockSimpleEntity.class)
-            .additionalInterfaces(Reflections.getAllInterfaces(RestMockSimpleEntity.class))
-            .displayName("child1"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java
----------------------------------------------------------------------
diff --git a/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java b/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java
index 41c7e28..f68f142 100644
--- a/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java
+++ b/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java
@@ -59,7 +59,6 @@ import org.apache.brooklyn.core.entity.AbstractApplication;
 import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.StartableApplication;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.mgmt.ShutdownHandler;
 import org.apache.brooklyn.core.mgmt.ha.OsgiManager;
@@ -67,6 +66,7 @@ import org.apache.brooklyn.core.mgmt.persist.BrooklynPersistenceUtils;
 import org.apache.brooklyn.core.mgmt.persist.PersistMode;
 import org.apache.brooklyn.core.mgmt.rebind.transformer.CompoundTransformer;
 import org.apache.brooklyn.core.objs.BrooklynTypes;
+import org.apache.brooklyn.entity.stock.BasicApplication;
 import org.apache.brooklyn.launcher.BrooklynLauncher;
 import org.apache.brooklyn.launcher.BrooklynServerDetails;
 import org.apache.brooklyn.launcher.config.StopWhichAppsOnShutdown;
@@ -78,6 +78,7 @@ import org.apache.brooklyn.util.exceptions.FatalRuntimeException;
 import org.apache.brooklyn.util.exceptions.UserFacingException;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.Enums;
+import org.apache.brooklyn.util.javalang.Reflections;
 import org.apache.brooklyn.util.net.Networking;
 import org.apache.brooklyn.util.text.Identifiers;
 import org.apache.brooklyn.util.text.StringEscapes.JavaStringEscapes;
@@ -683,8 +684,8 @@ public class Main extends AbstractMain {
                     String content = utils.getResourceAsString(app);
                     launcher.application(content);
                 } else {
-                    ApplicationBuilder loadedApp = loadApplicationFromClasspathOrParse(utils, loader, app);
-                    launcher.application(loadedApp);
+                    EntitySpec<? extends Application> appSpec = loadApplicationFromClasspathOrParse(utils, loader, app);
+                    launcher.application(appSpec);
                 }
             }
         }
@@ -731,49 +732,46 @@ public class Main extends AbstractMain {
         }
 
         /**
-         * Helper method that gets an instance of a brooklyn {@link AbstractApplication} or an {@link ApplicationBuilder}.
-         * Guaranteed to be non-null result of one of those types (throwing exception if app not appropriate).
+         * Helper method that gets an instance of a brooklyn {@link EntitySpec}.
+         * Guaranteed to be non-null result (throwing exception if app not appropriate).
+         * 
+         * @throws FatalConfigurationRuntimeException if class is not an {@link Application} or {@link Entity}
          */
         @SuppressWarnings("unchecked")
-        protected ApplicationBuilder loadApplicationFromClasspathOrParse(ResourceUtils utils, GroovyClassLoader loader, String app)
+        protected EntitySpec<? extends Application> loadApplicationFromClasspathOrParse(ResourceUtils utils, GroovyClassLoader loader, String app)
                 throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
             
-            Class<?> tempclazz;
+            Class<?> clazz;
             log.debug("Loading application as class on classpath: {}", app);
             try {
-                tempclazz = loader.loadClass(app, true, false);
+                clazz = loader.loadClass(app, true, false);
             } catch (ClassNotFoundException cnfe) { // Not a class on the classpath
                 throw new IllegalStateException("Unable to load app class '"+app+"'", cnfe);
             }
-            final Class<?> clazz = tempclazz;
             
-            // Instantiate an app builder (wrapping app/entity class in ApplicationBuilder)
-            // TODO Should change to use EntitySpec
-            if (ApplicationBuilder.class.isAssignableFrom(clazz)) {
-                Constructor<?> constructor = clazz.getConstructor();
-                return (ApplicationBuilder) constructor.newInstance();
-            } else if (StartableApplication.class.isAssignableFrom(clazz)) {
-                EntitySpec<? extends StartableApplication> appSpec;
-                if (tempclazz.isInterface())
-                    appSpec = EntitySpec.create((Class<? extends StartableApplication>) clazz);
-                else
-                    appSpec = EntitySpec.create(StartableApplication.class, (Class<? extends StartableApplication>) clazz);
-                return new ApplicationBuilder(appSpec) {
-                    @Override protected void doBuild() {
-                    }};
-            } else if (AbstractEntity.class.isAssignableFrom(clazz)) {
-                // TODO Should we really accept any entity type, and just wrap it in an app? That's not documented!
-                return new ApplicationBuilder() {
-                    @Override protected void doBuild() {
-                        addChild(EntitySpec.create(Entity.class).impl((Class<? extends AbstractEntity>)clazz).additionalInterfaces(clazz.getInterfaces()));
-                    }};
+            if (Application.class.isAssignableFrom(clazz)) {
+                if (clazz.isInterface()) {
+                    return EntitySpec.create((Class<? extends Application>)clazz);
+                } else {
+                    return EntitySpec.create(Application.class)
+                            .impl((Class<? extends Application>) clazz)
+                            .additionalInterfaces(Reflections.getAllInterfaces(clazz));
+                }
+                
             } else if (Entity.class.isAssignableFrom(clazz)) {
-                return new ApplicationBuilder() {
-                    @Override protected void doBuild() {
-                        addChild(EntitySpec.create((Class<? extends Entity>)clazz));
-                    }};
+                // TODO Should we really accept any entity type, and just wrap it in an app? That's not documented!
+                EntitySpec<?> childSpec;
+                if (clazz.isInterface()) {
+                    childSpec = EntitySpec.create((Class<? extends Entity>)clazz);
+                } else {
+                    childSpec = EntitySpec.create(Entity.class)
+                            .impl((Class<? extends Application>) clazz)
+                            .additionalInterfaces(Reflections.getAllInterfaces(clazz));
+                }
+                return EntitySpec.create(BasicApplication.class).child(childSpec);
+                
             } else {
-                throw new FatalConfigurationRuntimeException("Application class "+clazz+" must extend one of ApplicationBuilder or AbstractApplication");
+                throw new FatalConfigurationRuntimeException("Application class "+clazz+" must be an Application or Entity");
             }
         }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java
----------------------------------------------------------------------
diff --git a/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java b/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java
index c3fbf28..2751d00 100644
--- a/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java
+++ b/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java
@@ -40,6 +40,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Pattern;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
+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.entity.ImplementedBy;
@@ -58,7 +59,6 @@ import org.apache.brooklyn.core.entity.AbstractApplication;
 import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.StartableApplication;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.location.SimulatedLocation;
 import org.apache.brooklyn.core.objs.proxy.EntityProxy;
@@ -100,7 +100,8 @@ public class CliTest {
     public static final AtomicBoolean GROOVY_INVOKED = new AtomicBoolean(false);
 
     private ExecutorService executor;
-    private StartableApplication app;
+    private Application app;
+    private ManagementContext mgmt;
     private List<File> filesToDelete;
 
     private static volatile ExampleEntity exampleEntity;
@@ -123,6 +124,7 @@ public class CliTest {
     public void tearDown() throws Exception {
         if (executor != null) executor.shutdownNow();
         if (app != null) Entities.destroyAll(app.getManagementContext());
+        if (mgmt != null && mgmt.isRunning()) Entities.destroyAll(mgmt);
         if (exampleEntity != null && exampleEntity.getApplication() != null) Entities.destroyAll(exampleEntity.getApplication().getManagementContext());
         if (filesToDelete != null) {
             for (File file : filesToDelete) {
@@ -135,25 +137,21 @@ public class CliTest {
     @Test
     public void testLoadApplicationFromClasspath() throws Exception {
         String appName = ExampleApp.class.getName();
-        Object appBuilder = loadApplicationFromClasspathOrParse(appName);
-        assertTrue(appBuilder instanceof ApplicationBuilder, "app="+appBuilder);
-        assertAppWrappedInBuilder((ApplicationBuilder)appBuilder, ExampleApp.class.getCanonicalName());
-    }
-
-    @Test
-    public void testLoadApplicationBuilderFromClasspath() throws Exception {
-        String appName = ExampleAppBuilder.class.getName();
-        Object appBuilder = loadApplicationFromClasspathOrParse(appName);
-        assertTrue(appBuilder instanceof ExampleAppBuilder, "app="+appBuilder);
+        Object appSpec = loadApplicationFromClasspathOrParse(appName);
+        assertTrue(appSpec instanceof EntitySpec, "app="+appSpec);
+        
+        assertEquals(((EntitySpec<?>)appSpec).getImplementation(), ExampleApp.class);
     }
 
     @Test
     public void testLoadEntityFromClasspath() throws Exception {
         String entityName = ExampleEntity.class.getName();
-        Object appBuilder = loadApplicationFromClasspathOrParse(entityName);
-        assertTrue(appBuilder instanceof ApplicationBuilder, "app="+appBuilder);
+        Object appSpec = loadApplicationFromClasspathOrParse(entityName);
+        assertTrue(appSpec instanceof EntitySpec, "app="+appSpec);
         
-        app = ((ApplicationBuilder)appBuilder).manage();
+        mgmt = LocalManagementContextForTests.newInstance();
+        app = (Application) mgmt.getEntityManager().createEntity((EntitySpec<?>)appSpec);
+
         Collection<Entity> entities = app.getChildren();
         assertEquals(entities.size(), 1, "entities="+entities);
         assertTrue(Iterables.getOnlyElement(entities) instanceof ExampleEntity, "entities="+entities+"; ifs="+Iterables.getOnlyElement(entities).getClass().getInterfaces());
@@ -164,10 +162,12 @@ public class CliTest {
     @Test
     public void testLoadEntityImplFromClasspath() throws Exception {
         String entityName = ExampleEntityImpl.class.getName();
-        Object appBuilder = loadApplicationFromClasspathOrParse(entityName);
-        assertTrue(appBuilder instanceof ApplicationBuilder, "app="+appBuilder);
+        Object appSpec = loadApplicationFromClasspathOrParse(entityName);
+        assertTrue(appSpec instanceof EntitySpec, "app="+appSpec);
+        
+        mgmt = LocalManagementContextForTests.newInstance();
+        app = (Application) mgmt.getEntityManager().createEntity((EntitySpec<?>)appSpec);
         
-        app = ((ApplicationBuilder)appBuilder).manage();
         Collection<Entity> entities = app.getChildren();
         assertEquals(entities.size(), 1, "entities="+entities);
         assertEquals(Iterables.getOnlyElement(entities).getEntityType().getName(), ExampleEntity.class.getCanonicalName(), "entities="+entities);
@@ -181,16 +181,6 @@ public class CliTest {
         return launchCommand.loadApplicationFromClasspathOrParse(resourceUtils, loader, appName);
     }
     
-    private void assertAppWrappedInBuilder(ApplicationBuilder builder, String expectedAppTypeName) {
-        StartableApplication app = builder.manage();
-        try {
-            String typeName = app.getEntityType().getName();
-            assertEquals(typeName, expectedAppTypeName, "app="+app+"; typeName="+typeName);
-        } finally {
-            Entities.destroyAll(app.getManagementContext());
-        }
-    }
-    
     @Test
     public void testInvokeGroovyScript() throws Exception {
         File groovyFile = File.createTempFile("testinvokegroovy", "groovy");
@@ -756,11 +746,4 @@ public class CliTest {
         @Override public void restart() {
         }
     }
-
-    // An empty app builder to be used for testing
-    public static class ExampleAppBuilder extends ApplicationBuilder {
-        @Override protected void doBuild() {
-            // no-op
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/software/base/src/test/java/org/apache/brooklyn/entity/AbstractGoogleComputeLiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/AbstractGoogleComputeLiveTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/AbstractGoogleComputeLiveTest.java
index e2c0dcc..7d70dd0 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/AbstractGoogleComputeLiveTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/AbstractGoogleComputeLiveTest.java
@@ -22,15 +22,9 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
-import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport;
 import org.apache.brooklyn.util.collections.MutableMap;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.base.CaseFormat;
@@ -40,7 +34,7 @@ import com.google.common.collect.ImmutableMap;
 /**
  * Runs a test with many different distros and versions.
  */
-public abstract class AbstractGoogleComputeLiveTest {
+public abstract class AbstractGoogleComputeLiveTest extends BrooklynAppLiveTestSupport {
     
     // TODO See todos in AbstractEc2LiveTest
     
@@ -50,39 +44,28 @@ public abstract class AbstractGoogleComputeLiveTest {
     public static final String STANDARD_HARDWARE_ID = "us-central1-b/n1-standard-1-d";
     private static final int MAX_TAG_LENGTH = 63;
 
-    protected BrooklynProperties brooklynProperties;
-    protected ManagementContext ctx;
-    
-    protected TestApplication app;
     protected Location jcloudsLocation;
     
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
+    @Override
+    protected BrooklynProperties getBrooklynProperties() {
+        // Don't let any defaults from brooklyn.properties (except credentials) interfere with test
         List<String> propsToRemove = ImmutableList.of("imageId", "imageDescriptionRegex", "imageNameRegex", "inboundPorts", "hardwareId", "minRam");
-        
-     // Don't let any defaults from brooklyn.properties (except credentials) interfere with test
-        brooklynProperties = BrooklynProperties.Factory.newDefault();
+        BrooklynProperties result = BrooklynProperties.Factory.newDefault();
         for (String propToRemove : propsToRemove) {
             for (String propVariant : ImmutableList.of(propToRemove, CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, propToRemove))) {
-                brooklynProperties.remove("brooklyn.locations.jclouds."+PROVIDER+"."+propVariant);
-                brooklynProperties.remove("brooklyn.locations."+propVariant);
-                brooklynProperties.remove("brooklyn.jclouds."+PROVIDER+"."+propVariant);
-                brooklynProperties.remove("brooklyn.jclouds."+propVariant);
+                result.remove("brooklyn.locations.jclouds."+PROVIDER+"."+propVariant);
+                result.remove("brooklyn.locations."+propVariant);
+                result.remove("brooklyn.jclouds."+PROVIDER+"."+propVariant);
+                result.remove("brooklyn.jclouds."+propVariant);
             }
         }
 
         // Also removes scriptHeader (e.g. if doing `. ~/.bashrc` and `. ~/.profile`, then that can cause "stdin: is not a tty")
-        brooklynProperties.remove("brooklyn.ssh.config.scriptHeader");
+        result.remove("brooklyn.ssh.config.scriptHeader");
         
-        ctx = new LocalManagementContext(brooklynProperties);
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, ctx);
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAllCatching(app.getManagementContext());
+        return result;
     }
-
+    
     @Test(groups = {"Live"})
     public void test_DefaultImage() throws Exception {
         runTest(ImmutableMap.<String,String>of());
@@ -128,7 +111,7 @@ public abstract class AbstractGoogleComputeLiveTest {
                 .put("tags", ImmutableList.of(tag))
                 .putAll(flags)
                 .build();
-        jcloudsLocation = ctx.getLocationRegistry().getLocationManaged(LOCATION_SPEC, allFlags);
+        jcloudsLocation = mgmt.getLocationRegistry().getLocationManaged(LOCATION_SPEC, allFlags);
 
         doTest(jcloudsLocation);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/software/base/src/test/java/org/apache/brooklyn/entity/AbstractSoftlayerLiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/AbstractSoftlayerLiveTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/AbstractSoftlayerLiveTest.java
index 5ef83ab..f7e7e07 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/AbstractSoftlayerLiveTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/AbstractSoftlayerLiveTest.java
@@ -22,17 +22,11 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
-import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.text.StringShortener;
 import org.apache.brooklyn.util.text.Strings;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.base.CaseFormat;
@@ -42,45 +36,35 @@ import com.google.common.collect.ImmutableMap;
 /**
  * Runs a test with many different distros and versions.
  */
-public abstract class AbstractSoftlayerLiveTest {
+public abstract class AbstractSoftlayerLiveTest extends BrooklynAppLiveTestSupport {
     
     public static final String PROVIDER = "softlayer";
     public static final int MAX_TAG_LENGTH = 20;
     public static final int MAX_VM_NAME_LENGTH = 30;
 
-    protected BrooklynProperties brooklynProperties;
-    protected ManagementContext ctx;
-    
-    protected TestApplication app;
     protected Location jcloudsLocation;
     
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
+    @Override
+    protected BrooklynProperties getBrooklynProperties() {
         List<String> propsToRemove = ImmutableList.of("imageId", "imageDescriptionRegex", "imageNameRegex", "inboundPorts", "hardwareId", "minRam");
 
         // Don't let any defaults from brooklyn.properties (except credentials) interfere with test
-        brooklynProperties = BrooklynProperties.Factory.newDefault();
+        BrooklynProperties result = BrooklynProperties.Factory.newDefault();
         for (String propToRemove : propsToRemove) {
             for (String propVariant : ImmutableList.of(propToRemove, CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, propToRemove))) {
-                brooklynProperties.remove("brooklyn.locations.jclouds."+PROVIDER+"."+propVariant);
-                brooklynProperties.remove("brooklyn.locations."+propVariant);
-                brooklynProperties.remove("brooklyn.jclouds."+PROVIDER+"."+propVariant);
-                brooklynProperties.remove("brooklyn.jclouds."+propVariant);
+                result.remove("brooklyn.locations.jclouds."+PROVIDER+"."+propVariant);
+                result.remove("brooklyn.locations."+propVariant);
+                result.remove("brooklyn.jclouds."+PROVIDER+"."+propVariant);
+                result.remove("brooklyn.jclouds."+propVariant);
             }
         }
 
         // Also removes scriptHeader (e.g. if doing `. ~/.bashrc` and `. ~/.profile`, then that can cause "stdin: is not a tty")
-        brooklynProperties.remove("brooklyn.ssh.config.scriptHeader");
+        result.remove("brooklyn.ssh.config.scriptHeader");
         
-        ctx = new LocalManagementContext(brooklynProperties);
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, ctx);
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
+        return result;
     }
-
+    
     @Test(groups = {"Live"})
     public void test_Default() throws Exception {
         runTest(ImmutableMap.<String,Object>of());
@@ -106,7 +90,7 @@ public abstract class AbstractSoftlayerLiveTest {
                 .put("vmNameMaxLength", MAX_VM_NAME_LENGTH)
                 .putAll(flags)
                 .build();
-        jcloudsLocation = ctx.getLocationRegistry().getLocationManaged(PROVIDER, allFlags);
+        jcloudsLocation = mgmt.getLocationRegistry().getLocationManaged(PROVIDER, allFlags);
 
         doTest(jcloudsLocation);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefConfigsTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefConfigsTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefConfigsTest.java
index de77a64..dfdb85f 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefConfigsTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefConfigsTest.java
@@ -20,28 +20,16 @@ package org.apache.brooklyn.entity.chef;
 
 import java.util.Set;
 
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.entity.chef.ChefConfig;
 import org.apache.brooklyn.entity.chef.ChefConfigs;
 import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.Test;
 
-public class ChefConfigsTest {
+public class ChefConfigsTest extends BrooklynAppUnitTestSupport {
 
-    private TestApplication app = null;
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() {
-        if (app!=null) Entities.destroyAll(app.getManagementContext());
-        app = null;
-    }
-    
     @Test
     public void testAddToRunList() {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         ChefConfigs.addToLaunchRunList(app, "a", "b");
         Set<? extends String> runs = app.getConfig(ChefConfig.CHEF_LAUNCH_RUN_LIST);
         Assert.assertEquals(runs.size(), 2, "runs="+runs);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefServerTasksIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefServerTasksIntegrationTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefServerTasksIntegrationTest.java
index ff5441e..a7b5803 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefServerTasksIntegrationTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/chef/ChefServerTasksIntegrationTest.java
@@ -21,10 +21,8 @@ package org.apache.brooklyn.entity.chef;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
-import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport;
 import org.apache.brooklyn.entity.chef.ChefConfig;
 import org.apache.brooklyn.entity.chef.ChefServerTasks;
 import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
@@ -34,8 +32,6 @@ import org.apache.brooklyn.util.time.Time;
 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;
 
 /** Many tests expect knife on the path, but none require any configuration beyond that.
@@ -65,25 +61,12 @@ import org.testng.annotations.Test;
  * Note also that some tests require a location  named:ChefLive  to be set up in your brooklyn.properties.
  * This can be a cloud (but will require frequent chef-node pruning) or a permanently set-up machine.
  **/
-public class ChefServerTasksIntegrationTest {
+// TODO Does it really need to be a live test? When converting from ApplicationBuilder, preserved
+// existing behaviour of using the live BrooklynProperties.
+public class ChefServerTasksIntegrationTest extends BrooklynAppLiveTestSupport {
 
     private static final Logger log = LoggerFactory.getLogger(ChefServerTasksIntegrationTest.class);
     
-    protected TestApplication app;
-    protected ManagementContext mgmt;
-
-    @BeforeMethod(alwaysRun=true)
-    public void setup() throws Exception {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
-        mgmt = app.getManagementContext();
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (mgmt != null) Entities.destroyAll(mgmt);
-        mgmt = null;
-    }
-
     /** @deprecated use {@link ChefLiveTestSupport} */
     @Deprecated
     public synchronized static String installBrooklynChefHostedConfig() {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/software/base/src/test/java/org/apache/brooklyn/entity/software/base/AbstractDockerLiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/AbstractDockerLiveTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/AbstractDockerLiveTest.java
index f7602c0..c2f626d 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/AbstractDockerLiveTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/AbstractDockerLiveTest.java
@@ -23,15 +23,9 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
-import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
-import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport;
 import org.apache.brooklyn.util.collections.MutableMap;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import java.util.List;
@@ -40,44 +34,34 @@ import java.util.Map;
 /**
  * Runs a test with many different distros and versions.
  */
-public abstract class AbstractDockerLiveTest {
+public abstract class AbstractDockerLiveTest extends BrooklynAppLiveTestSupport {
     
     public static final String PROVIDER = "docker";
 
-    protected BrooklynProperties brooklynProperties;
-    protected ManagementContext ctx;
-    
-    protected TestApplication app;
     protected Location jcloudsLocation;
     
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
+    @Override
+    protected BrooklynProperties getBrooklynProperties() {
+        // Don't let any defaults from brooklyn.properties (except credentials) interfere with test
         List<String> propsToRemove = ImmutableList.of("imageDescriptionRegex", "imageNameRegex", "inboundPorts",
                 "hardwareId", "minRam");
-        
-     // Don't let any defaults from brooklyn.properties (except credentials) interfere with test
-        brooklynProperties = BrooklynProperties.Factory.newDefault();
+
+        BrooklynProperties result = BrooklynProperties.Factory.newDefault();
         for (String propToRemove : propsToRemove) {
             for (String propVariant : ImmutableList.of(propToRemove, CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, propToRemove))) {
-                brooklynProperties.remove("brooklyn.locations.jclouds."+PROVIDER+"."+propVariant);
-                brooklynProperties.remove("brooklyn.locations."+propVariant);
-                brooklynProperties.remove("brooklyn.jclouds."+PROVIDER+"."+propVariant);
-                brooklynProperties.remove("brooklyn.jclouds."+propVariant);
+                result.remove("brooklyn.locations.jclouds."+PROVIDER+"."+propVariant);
+                result.remove("brooklyn.locations."+propVariant);
+                result.remove("brooklyn.jclouds."+PROVIDER+"."+propVariant);
+                result.remove("brooklyn.jclouds."+propVariant);
             }
         }
 
         // Also removes scriptHeader (e.g. if doing `. ~/.bashrc` and `. ~/.profile`, then that can cause "stdin: is not a tty")
-        brooklynProperties.remove("brooklyn.ssh.config.scriptHeader");
-        
-        ctx = new LocalManagementContext(brooklynProperties);
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, ctx);
-    }
+        result.remove("brooklyn.ssh.config.scriptHeader");
 
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAllCatching(app.getManagementContext());
+        return result;
     }
-
+    
     @Test(groups={"Live", "WIP"})
     public void test_Ubuntu_13_10() throws Exception {
           runTest(ImmutableMap.of("imageId", "7fe2ec2ff748c411cf0d6833120741778c00e1b07a83c4104296b6258b5331c4",
@@ -91,7 +75,7 @@ public abstract class AbstractDockerLiveTest {
                 .put("tags", ImmutableList.of(tag))
                 .putAll(flags)
                 .build();
-        jcloudsLocation = ctx.getLocationRegistry().getLocationManaged(PROVIDER, allFlags);
+        jcloudsLocation = mgmt.getLocationRegistry().getLocationManaged(PROVIDER, allFlags);
         doTest(jcloudsLocation);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/52f9ebdd/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessOpenIptablesStreamsLiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessOpenIptablesStreamsLiveTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessOpenIptablesStreamsLiveTest.java
index 990556f..81b58fd 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessOpenIptablesStreamsLiveTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessOpenIptablesStreamsLiveTest.java
@@ -26,12 +26,8 @@ import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.mgmt.HasTaskChildren;
 import org.apache.brooklyn.api.mgmt.Task;
-import org.apache.brooklyn.core.entity.factory.ApplicationBuilder;
-import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
 import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport;
-import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
-import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.util.core.task.TaskPredicates;
 import org.apache.brooklyn.util.text.StringPredicates;
 import org.slf4j.Logger;
@@ -47,25 +43,18 @@ public class SoftwareProcessOpenIptablesStreamsLiveTest extends BrooklynAppLiveT
 
     private static final Logger LOG = LoggerFactory.getLogger(SoftwareProcessOpenIptablesStreamsLiveTest.class);
 
-    protected BrooklynProperties brooklynProperties;
-
     protected Location jcloudsLocation;
 
-    protected TestApplication app;
-
     @Override
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
-
-        mgmt = new LocalManagementContextForTests(BrooklynProperties.Factory.newDefault());
+        super.setUp();
 
         jcloudsLocation = mgmt.getLocationRegistry().getLocationManaged("jclouds:aws-ec2:us-west-1", ImmutableMap.<String, Object>builder()
                 .put("osFamily", "centos")
                 .put("osVersionRegex", "6\\..*")
                 .put("inboundPorts", ImmutableList.of(22, 31880, 31001, 8080, 8443, 1099))
                 .build());
-
-        app = ApplicationBuilder.newManagedApp(newAppSpec(), mgmt);
     }
 
     @Test(groups = "Live")