diff --git a/deploymentadmin/itest/pom.xml b/deploymentadmin/itest/pom.xml
index 05e42d9..87f8c02 100644
--- a/deploymentadmin/itest/pom.xml
+++ b/deploymentadmin/itest/pom.xml
@@ -20,8 +20,8 @@
 	</parent>
 	<properties>
 		<osgi.version>4.2.0</osgi.version>
-		<pax.exam.version>3.1.0</pax.exam.version>
-		<pax.url.version>1.5.2</pax.url.version>
+		<pax.exam.version>3.4.0</pax.exam.version>
+		<pax.url.version>1.6.0</pax.url.version>
 	</properties>
 	<name>Apache Felix DeploymentAdmin Integration Tests</name>
 	<version>0.1.1-SNAPSHOT</version>
@@ -52,7 +52,7 @@
 		<dependency>
 			<groupId>org.apache.felix</groupId>
 			<artifactId>org.apache.felix.deploymentadmin</artifactId>
-			<version>0.9.6-SNAPSHOT</version>
+			<version>0.9.8-SNAPSHOT</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
@@ -64,7 +64,7 @@
 		<dependency>
 			<groupId>org.apache.felix</groupId>
 			<artifactId>org.apache.felix.configadmin</artifactId>
-			<version>1.6.0</version>
+			<version>1.8.0</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
diff --git a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/BaseIntegrationTest.java b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/BaseIntegrationTest.java
index eaa2796..8791f70 100644
--- a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/BaseIntegrationTest.java
+++ b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/BaseIntegrationTest.java
@@ -18,14 +18,11 @@
  */
 package org.apache.felix.deploymentadmin.itest;
 
-import static org.ops4j.pax.exam.CoreOptions.bootDelegationPackage;
-import static org.ops4j.pax.exam.CoreOptions.cleanCaches;
-import static org.ops4j.pax.exam.CoreOptions.junitBundles;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
 import static org.ops4j.pax.exam.CoreOptions.*;
 
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -53,6 +50,7 @@
 import org.osgi.framework.wiring.FrameworkWiring;
 import org.osgi.service.deploymentadmin.DeploymentAdmin;
 import org.osgi.service.deploymentadmin.DeploymentException;
+import org.osgi.service.deploymentadmin.DeploymentPackage;
 import org.osgi.util.tracker.ServiceTracker;
 
 /**
@@ -68,7 +66,7 @@
     @Inject
     protected volatile BundleContext m_context;
     @Inject
-    protected volatile DeploymentAdmin m_deploymentAdmin;
+    private volatile DeploymentAdmin m_deploymentAdmin;
 
     protected volatile AtomicInteger m_gate = new AtomicInteger(0);
     protected volatile String m_testBundleBasePath;
@@ -177,6 +175,24 @@
         }
         return result;
     }
+    
+    protected final DeploymentPackage installDeploymentPackage(DeploymentPackageBuilder dpBuilder) throws Exception {
+        InputStream is = dpBuilder.generate();
+        try {
+            return m_deploymentAdmin.installDeploymentPackage(is);
+        } finally {
+            try {
+                is.close();
+            } catch (IOException e) {
+                // Nothing we can do about this, but log it...
+                e.printStackTrace();
+            }
+        }
+    }
+    
+    protected final int countDeploymentPackages() {
+        return m_deploymentAdmin.listDeploymentPackages().length;
+    }
 
     protected DeploymentPackageBuilder createNewDeploymentPackageBuilder(String version) {
         return createDeploymentPackageBuilder(String.format("itest%d", ++cnt), version);
diff --git a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/CustomizerTest.java b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/CustomizerTest.java
index 269b7bf..9d35fde 100644
--- a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/CustomizerTest.java
+++ b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/CustomizerTest.java
@@ -51,7 +51,7 @@
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -60,7 +60,7 @@
         assertBundleExists(getSymbolicName("rp1"), "1.0.0");
         assertBundleExists(getSymbolicName("bundle3"), "1.0.0");
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -76,7 +76,7 @@
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a failing deployment package?!");
         }
         catch (DeploymentException exception) {
@@ -86,7 +86,7 @@
 
         assertTrue("No bundles should be started!", getCurrentBundles().isEmpty());
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
     }
 
     /**
@@ -102,7 +102,7 @@
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a failing deployment package?!");
         }
         catch (DeploymentException exception) {
@@ -112,7 +112,7 @@
 
         assertTrue("No bundles should be started!", getCurrentBundles().isEmpty());
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
     }
 
     /**
@@ -127,14 +127,14 @@
             .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundle("rp1")))
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
 
         assertTrue("One bundle should be started!", getCurrentBundles().size() == 1);
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -151,7 +151,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a failing RP?!");
         }
         catch (DeploymentException exception) {
@@ -159,7 +159,7 @@
             assertDeploymentException(CODE_OTHER_ERROR, exception);
         }
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
         assertTrue("Expected no artifacts to be installed?!", getCurrentBundles().isEmpty());
     }
 
@@ -172,11 +172,11 @@
         dpBuilder
             .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundle("rp1")));
 
-        m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        installDeploymentPackage(dpBuilder);
 
         awaitRefreshPackagesEvent();
         
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
         assertBundleExists(getSymbolicName("rp1"), "1.0.0");
 
         dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
@@ -185,7 +185,7 @@
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a resource with an non-existing RP?!");
         }
         catch (DeploymentException exception) {
@@ -193,7 +193,7 @@
             assertDeploymentException(CODE_FOREIGN_CUSTOMIZER, exception);
         }
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
         assertTrue("Expected no additional artifacts to be installed?!", getCurrentBundles().size() == 1);
     }
 
@@ -208,7 +208,7 @@
             .add(dpBuilder.createResource().setResourceProcessorPID("my.unknown.rp").setUrl(getTestResource("test-config1.xml")));
 
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a resource with an non-existing RP?!");
         }
         catch (DeploymentException exception) {
@@ -216,7 +216,7 @@
             assertDeploymentException(CODE_PROCESSOR_NOT_FOUND, exception);
         }
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
         assertTrue("Expected no artifacts to be installed?!", getCurrentBundles().isEmpty());
     }
 
diff --git a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/DeploymentAdminEventTest.java b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/DeploymentAdminEventTest.java
index 95996a6..8af682d 100644
--- a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/DeploymentAdminEventTest.java
+++ b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/DeploymentAdminEventTest.java
@@ -82,7 +82,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("DeploymentException expected!");
         }
         catch (DeploymentException e)
@@ -146,7 +146,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
 
             assertTrue("Not all events were received in time?!", cdl.await(5, TimeUnit.SECONDS));
             
@@ -198,7 +198,7 @@
             }
         };
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull(dp);
         
         awaitRefreshPackagesEvent();
@@ -263,7 +263,7 @@
             }
         };
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
diff --git a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/DeploymentAdminTest.java b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/DeploymentAdminTest.java
index 0b31972..adfc51a 100644
--- a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/DeploymentAdminTest.java
+++ b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/DeploymentAdminTest.java
@@ -48,7 +48,7 @@
             );
         
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a bundle with a fake symbolic name?!");
         }
         catch (DeploymentException exception) {
@@ -70,7 +70,7 @@
             );
         
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a bundle with a fake version?!");
         }
         catch (DeploymentException exception) {
@@ -92,7 +92,7 @@
             );
         
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a bundle with a fake symbolic name?!");
         }
         catch (DeploymentException exception) {
@@ -114,7 +114,7 @@
             );
         
         try {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a bundle with a fake version?!");
         }
         catch (DeploymentException exception) {
diff --git a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/InstallDeploymentPackageTest.java b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/InstallDeploymentPackageTest.java
index e2d3e09..51f1bf0 100644
--- a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/InstallDeploymentPackageTest.java
+++ b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/InstallDeploymentPackageTest.java
@@ -47,7 +47,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("DeploymentException expected!");
         }
         catch (DeploymentException e)
@@ -72,7 +72,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundleapi1", "bundleapi1", "1.0.0")).setFilename("bundles/bundleapi1.jar"))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundleimpl1", "bundleimpl1", "1.0.0")).setFilename("bundles/bundleimpl1.jar"));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull(dp);
 
         BundleInfo[] bundleInfos = dp.getBundleInfos();
@@ -93,7 +93,7 @@
         // missing bundle1 as dependency...
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -108,7 +108,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
@@ -126,7 +126,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -142,7 +142,7 @@
         // as missing bundle1...
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
@@ -170,7 +170,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -182,7 +182,7 @@
         // the bundle threw an exception during start, so it is not active...
         assertFalse(isBundleActive(dp.getBundle(getSymbolicName("bundle3"))));
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -196,7 +196,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("fragment1")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -207,7 +207,7 @@
         assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle1"))));
         assertFalse(isBundleActive(dp.getBundle(getSymbolicName("fragment1"))));
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -219,7 +219,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -244,7 +244,7 @@
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -253,7 +253,7 @@
         assertBundleExists(getSymbolicName("rp1"), "1.0.0");
         assertBundleExists(getSymbolicName("bundle3"), "1.0.0");
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -265,7 +265,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -287,7 +287,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -312,7 +312,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -326,7 +326,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         assertBundleExists(getSymbolicName("bundle1"), "1.0.0");
@@ -336,7 +336,7 @@
         assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle1"))));
         assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle2"))));
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -350,7 +350,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -365,7 +365,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
-        dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         assertBundleExists(getSymbolicName("bundle1"), "1.0.0");
@@ -376,6 +376,6 @@
         assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle2"))));
         assertTrue(isBundleActive(dp.getBundle(getSymbolicName("bundle3"))));
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
     }
 }
diff --git a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/InstallFixPackageTest.java b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/InstallFixPackageTest.java
index cb9762c..65a9801 100644
--- a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/InstallFixPackageTest.java
+++ b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/InstallFixPackageTest.java
@@ -48,7 +48,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -61,7 +61,7 @@
         dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1");
         dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")).setMissing());
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
@@ -84,7 +84,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -100,7 +100,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing fix package for undefined target package?!");
         }
         catch (DeploymentException exception)
@@ -119,7 +119,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -135,7 +135,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing fix package for undefined target package?!");
         }
         catch (DeploymentException exception)
@@ -156,7 +156,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Should not be able to install fix package without target?!");
         }
         catch (DeploymentException exception)
@@ -175,22 +175,22 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
-        assertEquals("Expected only a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages());
 
         awaitRefreshPackagesEvent();
 
         dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1");
         dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")).setMissing());
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected only a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -203,10 +203,10 @@
         // missed valid-bundle1 as dependency...
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
-        assertEquals("Expected only a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages());
 
         awaitRefreshPackagesEvent();
 
@@ -215,7 +215,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a fix-package with a missing bundle on target?!");
         }
         catch (DeploymentException exception)
@@ -233,10 +233,10 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
-        assertEquals("Expected only a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages());
 
         awaitRefreshPackagesEvent();
 
@@ -246,7 +246,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a fix-package with a missing bundle on target?!");
         }
         catch (DeploymentException exception)
@@ -264,10 +264,10 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
-        assertEquals("Expected only a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages());
 
         awaitRefreshPackagesEvent();
 
@@ -277,7 +277,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a fix-package with a missing bundle on target?!");
         }
         catch (DeploymentException exception)
@@ -295,29 +295,29 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected only a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected only a single deployment package?!", 1, countDeploymentPackages());
 
         dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected only a single deployment package?!", 2, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected only a single deployment package?!", 2, countDeploymentPackages());
 
         dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1");
         dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")).setMissing()).add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Succeeded into installing a fix-package with a missing bundle on target?!");
         }
         catch (DeploymentException exception)
@@ -335,7 +335,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -350,7 +350,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Failed to install missing bundle?!");
         }
         catch (DeploymentException exception)
@@ -369,7 +369,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -383,7 +383,7 @@
         dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1");
         dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")).setMissing());
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
@@ -401,7 +401,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -410,12 +410,12 @@
         dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1");
         dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")).setMissing());
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
 
         assertBundleExists(getSymbolicName("bundle1"), "1.0.0");
         assertBundleExists(getSymbolicName("bundle2"), "1.0.0");
@@ -425,7 +425,7 @@
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
 
         // None of our installed bundles should remain...
         assertBundleNotExists(getSymbolicName("bundle1"), "1.0.0");
@@ -441,7 +441,7 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1"))).add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
@@ -450,12 +450,12 @@
         dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1");
         dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
 
         assertBundleExists(getSymbolicName("bundle1"), "1.0.0");
         assertBundleNotExists(getSymbolicName("bundle2"), "1.0.0");
@@ -465,7 +465,7 @@
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
 
         // None of our installed bundles should remain...
         assertBundleNotExists(getSymbolicName("bundle1"), "1.0.0");
@@ -481,31 +481,31 @@
         DeploymentPackageBuilder dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
 
         dpBuilder = createNewDeploymentPackageBuilder("1.0.0");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")));
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected two deployment packages?!", 2, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected two deployment packages?!", 2, countDeploymentPackages());
 
         // add bundle2 through fix package...
         dpBuilder = createDeploymentPackageBuilder(dpBuilder.getSymbolicName(), "1.0.1");
         dpBuilder.setFixPackage("[1.0,2.0)").add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3"))).add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle2")).setMissing());
 
-        DeploymentPackage dp3 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp3 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp3);
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected two deployment packages?!", 2, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected two deployment packages?!", 2, countDeploymentPackages());
 
         assertBundleExists(getSymbolicName("bundle1"), "1.0.0");
         assertBundleExists(getSymbolicName("bundle2"), "1.0.0");
@@ -516,7 +516,7 @@
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
 
         // None of our installed bundles should remain...
         assertBundleNotExists(getSymbolicName("bundle3"), "1.0.0");
@@ -536,17 +536,17 @@
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundleimpl1", "bundleimpl1", "1.0.0")));
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundleapi1", "bundleapi1", "1.0.0")));
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
 
         // then, install a fix package with implementation and api bundles in version 2.0.0
         dpBuilder = createDeploymentPackageBuilder("a", "2.0.0").setFixPackage("[1.0.0,2.0.0]");
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundleimpl2", "bundleimpl2", "2.0.0")));
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundleapi2", "bundleapi2", "2.0.0")));
 
-        DeploymentPackage dp2 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp2 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp2);
 
         awaitRefreshPackagesEvent();
@@ -573,7 +573,7 @@
         dpBuilder.add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundleapi1", "bundleapi1", "1.0.0")));
 
         // Should succeed, as the DP is correct... 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp1);
 
         // then, install a fix package with implementation and api bundles in version 2.0.0, but *also* containing the original implementation 
@@ -585,7 +585,7 @@
 
         try
         {
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("DeploymentException expected!");
         }
         catch (DeploymentException e)
diff --git a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/ResourceSharingTest.java b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/ResourceSharingTest.java
index 4bcdbfb..68f1612 100644
--- a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/ResourceSharingTest.java
+++ b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/ResourceSharingTest.java
@@ -51,14 +51,14 @@
                 .setUrl(getTestBundle("bundle1"))
             );
 
-        DeploymentPackage dp1 = m_deploymentAdmin.installDeploymentPackage(dpBuilder1.generate());
+        DeploymentPackage dp1 = installDeploymentPackage(dpBuilder1);
         assertNotNull("No deployment package returned?!", dp1);
 
         awaitRefreshPackagesEvent();
 
         try {
             // should fail: valid-bundle1 belongs to another DP...
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder2.generate());
+            installDeploymentPackage(dpBuilder2);
             fail("Expected a DeploymentException with code " + DeploymentException.CODE_BUNDLE_SHARING_VIOLATION);
         }
         catch (DeploymentException exception) {
@@ -86,7 +86,7 @@
 
         try {
             // should fail: valid-bundle1 is installed, but does not belong to any DP...
-            m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+            installDeploymentPackage(dpBuilder);
             fail("Expected a DeploymentException with code " + DeploymentException.CODE_BUNDLE_SHARING_VIOLATION);
         }
         catch (DeploymentException exception) {
@@ -118,7 +118,7 @@
             );
         
         // should succeed: valid-bundle1 is installed, but has a different version than the one in our DP...
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
 
         awaitRefreshPackagesEvent();
 
diff --git a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/UninstallDeploymentPackageTest.java b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/UninstallDeploymentPackageTest.java
index 65a2620..d848a98 100644
--- a/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/UninstallDeploymentPackageTest.java
+++ b/deploymentadmin/itest/src/test/java/org/apache/felix/deploymentadmin/itest/UninstallDeploymentPackageTest.java
@@ -47,7 +47,7 @@
             .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundle("rp1")))
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -59,13 +59,16 @@
 
         assertTrue("One bundle should be started!", getCurrentBundles().size() == 1);
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
 
         assertTrue(dp.uninstallForced());
+
+        // FELIX-4484: after a forced uninstall, the DP should be marked as stale...
+        assertTrue(dp.isStale());
         
         assertTrue("No bundle should be started!", getCurrentBundles().isEmpty());
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
     }
 
     /**
@@ -78,7 +81,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("fragment1")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -92,7 +95,7 @@
         // Should succeed...
         dp.uninstall();
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
 
         // Both bundles should be uninstalled...
         assertBundleNotExists(getSymbolicName("bundle1"), "1.0.0");
@@ -112,7 +115,7 @@
                     .setUrl(getTestResource("test-config1.xml")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -121,12 +124,12 @@
         assertBundleExists(getSymbolicName("rp1"), "1.0.0");
         assertBundleExists(getSymbolicName("bundle3"), "1.0.0");
 
-        assertEquals("Expected a single deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected a single deployment package?!", 1, countDeploymentPackages());
 
         // Should succeed...
         dp.uninstall();
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
 
         assertBundleNotExists(getSymbolicName("rp1"), "1.0.0");
         assertBundleNotExists(getSymbolicName("bundle3"), "1.0.0");
@@ -143,14 +146,14 @@
             .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundle("rp1")))
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
         
         assertTrue("Two bundles should be started!", getCurrentBundles().size() == 2);
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
         
         System.setProperty("rp1", "commit");
 
@@ -158,7 +161,7 @@
 
         assertTrue("No bundles should be started! " + getCurrentBundles(), getCurrentBundles().isEmpty());
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
     }
 
     /**
@@ -172,14 +175,14 @@
             .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundle("rp1")))
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
         
         assertTrue("Two bundles should be started!", getCurrentBundles().size() == 2);
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
         
         System.setProperty("rp1", "dropAllResources");
 
@@ -191,10 +194,13 @@
             // Ok; expected
             assertDeploymentException(CODE_OTHER_ERROR, exception);
         }
+
+        // FELIX-4484: only after a successful uninstall, the DP should be marked as stale...
+        assertFalse(dp.isStale());
         
         assertTrue("Two bundles should be started!", getCurrentBundles().size() == 2);
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -208,14 +214,14 @@
             .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundle("rp1")))
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
         
         assertTrue("Two bundles should be started!", getCurrentBundles().size() == 2);
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
         
         System.setProperty("rp1", "prepare");
 
@@ -230,7 +236,7 @@
         
         assertTrue("Two bundles should be started!", getCurrentBundles().size() == 2);
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
     }
 
     /**
@@ -243,7 +249,7 @@
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle1")))
             .add(dpBuilder.createBundleResource().setUrl(getTestBundle("bundle3")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -252,11 +258,14 @@
 
         System.setProperty("bundle3", "stop");
         
-        dp.uninstall();
+        dp.uninstall(); // should succeed.
+
+        // FELIX-4484: only after a successful uninstall, the DP should be marked as stale...
+        assertTrue(dp.isStale());
 
         awaitRefreshPackagesEvent();
 
-        assertEquals("Expected no deployment package?!", 0, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 0, countDeploymentPackages());
         
         assertTrue("Expected no bundles to remain?!", getCurrentBundles().isEmpty());
     }
@@ -272,7 +281,7 @@
             .add(dpBuilder.createResourceProcessorResource().setUrl(getTestBundle("rp1")))
             .add(dpBuilder.createResource().setResourceProcessorPID(TEST_FAILING_BUNDLE_RP1).setUrl(getTestResource("test-config1.xml")));
 
-        DeploymentPackage dp = m_deploymentAdmin.installDeploymentPackage(dpBuilder.generate());
+        DeploymentPackage dp = installDeploymentPackage(dpBuilder);
         assertNotNull("No deployment package returned?!", dp);
 
         awaitRefreshPackagesEvent();
@@ -284,7 +293,7 @@
 
         assertTrue("One bundle should be started!", getCurrentBundles().size() == 1);
 
-        assertEquals("Expected no deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected no deployment package?!", 1, countDeploymentPackages());
 
         try {
             dp.uninstall();
@@ -297,6 +306,6 @@
         
         assertTrue("One bundle should be started!", getCurrentBundles().size() == 1);
 
-        assertEquals("Expected one deployment package?!", 1, m_deploymentAdmin.listDeploymentPackages().length);
+        assertEquals("Expected one deployment package?!", 1, countDeploymentPackages());
     }
 }
