diff --git a/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/BundleDeployer.java b/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/BundleDeployer.java
index 08fcc94..68d83be 100644
--- a/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/BundleDeployer.java
+++ b/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/BundleDeployer.java
@@ -45,8 +45,6 @@
 
     private static final char SLASH = '/';
 
-    private static final String UNKNOWN = "unknown";
-
     private static final String FRAGMEN_HOST_HEADER = "Fragment-Host";
 
     private final EventLogger eventLogger;
@@ -137,7 +135,7 @@
         try {
             URI location = BundleLocationUtil.getRelativisedURI(this.kernelHomeFile, stagedFile);
             if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
-                registerToBundlesInfo(bundle, location.toString(), isFragment);
+                BundleInfosUpdater.registerToBundlesInfo(bundle, location.toString(), isFragment);
             }
         } catch (Exception ex) {
             this.eventLogger.log(NanoDeployerLogEvents.NANO_PERSIST_ERROR, ex, bundle.getSymbolicName(), bundle.getVersion());
@@ -254,7 +252,7 @@
         try {
             if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
                 String bundlesInfoLocation = BundleLocationUtil.getRelativisedURI(kernelHomeFile, stagedFile).toString();
-                registerToBundlesInfo(installed, bundlesInfoLocation, hostHolder != null && hostHolder.getBundleSymbolicName() != null);
+                BundleInfosUpdater.registerToBundlesInfo(installed, bundlesInfoLocation, hostHolder != null && hostHolder.getBundleSymbolicName() != null);
             }
         } catch (Exception e) {
             this.eventLogger.log(NanoDeployerLogEvents.NANO_PERSIST_ERROR, e, installed.getSymbolicName(), installed.getVersion());
@@ -321,7 +319,7 @@
                 }
                 if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
                     String bundlesInfoLocation = BundleLocationUtil.getRelativisedURI(kernelHomeFile, stagingFileToDelete).toString();
-                    unregisterToBundlesInfo(bundle, bundlesInfoLocation, hostHolder != null && hostHolder.getBundleSymbolicName() != null);
+                    BundleInfosUpdater.unregisterToBundlesInfo(bundle, bundlesInfoLocation, hostHolder != null && hostHolder.getBundleSymbolicName() != null);
                     this.logger.info("Successfully removed bundle '" + bundle.getSymbolicName() + "' version '" + bundle.getVersion()
                         + "' from bundles.info.");
                 } else {
@@ -414,20 +412,6 @@
         return isWritable;
     }
 
-    private final void registerToBundlesInfo(Bundle bundle, String stagedRelativeLocation, boolean isFragment) throws URISyntaxException, IOException, BundleException {
-        String symbolicName = bundle.getSymbolicName();
-        this.bundleInfosUpdater.addBundleToBundlesInfo(symbolicName == null ? UNKNOWN : symbolicName, new URI(stagedRelativeLocation),
-            bundle.getVersion().toString(), SimpleDeployer.HOT_DEPLOYED_ARTIFACTS_START_LEVEL, !isFragment);
-        this.bundleInfosUpdater.updateBundleInfosRepository();
-    }    
-
-    private final void unregisterToBundlesInfo(Bundle bundle, String stagedRelativeLocation, boolean isFragment) throws IOException, BundleException, URISyntaxException {
-        String symbolicName = bundle.getSymbolicName();
-        this.bundleInfosUpdater.removeBundleFromBundlesInfo(symbolicName == null ? UNKNOWN : symbolicName, new URI(stagedRelativeLocation),
-            bundle.getVersion().toString(), SimpleDeployer.HOT_DEPLOYED_ARTIFACTS_START_LEVEL, !isFragment);
-        this.bundleInfosUpdater.updateBundleInfosRepository();
-    }
-
     private String extractJarFileNameFromString(String path) {
         final String jarName = path.substring(path.lastIndexOf(SLASH) + 1);
         return jarName;
diff --git a/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleInfosUpdater.java b/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleInfosUpdater.java
index f4b099d..519485f 100644
--- a/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleInfosUpdater.java
+++ b/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleInfosUpdater.java
@@ -16,31 +16,56 @@
 import org.eclipse.equinox.internal.simpleconfigurator.utils.BundleInfo;
 import org.eclipse.equinox.internal.simpleconfigurator.utils.SimpleConfiguratorUtils;
 import org.eclipse.osgi.util.ManifestElement;
+import org.eclipse.virgo.nano.deployer.SimpleDeployer;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
 
+/**
+ * 
+ * Utility class that updates a bundles.info file.
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
 public class BundleInfosUpdater {
 
-    private final File bundlesInfoFile;
+    private static final String UNKNOWN = "unknown";
+    
+    private static File bundlesInfoFile;
 
-    private final File baseDir;
+    private static File baseDir;
 
-    private final HashMap<String, BundleInfo> toBeAddedInBundlesInfo;
+    private static HashMap<String, BundleInfo> toBeAddedInBundlesInfo;
 
-    private final HashMap<String, BundleInfo> toBeRemovedFromBundlesInfo;
+    private static HashMap<String, BundleInfo> toBeRemovedFromBundlesInfo;
 
     public BundleInfosUpdater(URL bundlesInfoURL, File base) {
-        this.bundlesInfoFile = new File(bundlesInfoURL.getFile());
-        this.toBeAddedInBundlesInfo = new HashMap<String, BundleInfo>();
-        this.toBeRemovedFromBundlesInfo = new HashMap<String, BundleInfo>();
-        this.baseDir = base;
+        bundlesInfoFile = new File(bundlesInfoURL.getFile());
+        toBeAddedInBundlesInfo = new HashMap<String, BundleInfo>();
+        toBeRemovedFromBundlesInfo = new HashMap<String, BundleInfo>();
+        baseDir = base;
     }
 
     public BundleInfosUpdater(File bundlesInfo, File base) {
-        this.bundlesInfoFile = bundlesInfo;
-        this.toBeAddedInBundlesInfo = new HashMap<String, BundleInfo>();
-        this.toBeRemovedFromBundlesInfo = new HashMap<String, BundleInfo>();
-        this.baseDir = base;
+        bundlesInfoFile = bundlesInfo;
+        toBeAddedInBundlesInfo = new HashMap<String, BundleInfo>();
+        toBeRemovedFromBundlesInfo = new HashMap<String, BundleInfo>();
+        baseDir = base;
+    }
+    
+    public static void registerToBundlesInfo(Bundle bundle, String stagedRelativeLocation, boolean isFragment) throws URISyntaxException, IOException, BundleException {
+        String symbolicName = bundle.getSymbolicName();
+        addBundleToBundlesInfo(symbolicName == null ? UNKNOWN : symbolicName, new URI(stagedRelativeLocation),
+            bundle.getVersion().toString(), SimpleDeployer.HOT_DEPLOYED_ARTIFACTS_START_LEVEL, !isFragment);
+        updateBundleInfosRepository();
+    }    
+
+    public static void unregisterToBundlesInfo(Bundle bundle, String stagedRelativeLocation, boolean isFragment) throws IOException, BundleException, URISyntaxException {
+        String symbolicName = bundle.getSymbolicName();
+        removeBundleFromBundlesInfo(symbolicName == null ? UNKNOWN : symbolicName, new URI(stagedRelativeLocation),
+            bundle.getVersion().toString(), SimpleDeployer.HOT_DEPLOYED_ARTIFACTS_START_LEVEL, !isFragment);
+        updateBundleInfosRepository();
     }
 
     // writes an array to a bundles.info file
@@ -48,12 +73,12 @@
         for (File currFile : files) {
             BundleInfo currBundleInfo = bundleFile2BundleInfo(currFile, 4, true);
             if (currBundleInfo != null) {
-                this.toBeAddedInBundlesInfo.put(getIdentifier(currBundleInfo), currBundleInfo);
+                toBeAddedInBundlesInfo.put(getIdentifier(currBundleInfo), currBundleInfo);
             }
         }
     }
 
-    private String getIdentifier(BundleInfo bundleInfo) {
+    private static String getIdentifier(BundleInfo bundleInfo) {
         return bundleInfo.getSymbolicName() + "=" + bundleInfo.getVersion();
     }
 
@@ -61,28 +86,28 @@
     public void addBundleToBundlesInfo(File file, int startLevel, boolean autoStartFlag) throws IOException, BundleException {
         BundleInfo bundleInfo = bundleFile2BundleInfo(file, startLevel, autoStartFlag);
         if (bundleInfo != null) {
-            this.toBeAddedInBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
+            toBeAddedInBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
         }
     }
 
-    public void addBundleToBundlesInfo(String bundleSymbolicName, URI url, String bundleVersion, int startLevel, boolean autoStartFlag)
+    private static void addBundleToBundlesInfo(String bundleSymbolicName, URI url, String bundleVersion, int startLevel, boolean autoStartFlag)
         throws IOException, BundleException {
         try {
             BundleInfo bundleInfo = createBundleInfo(bundleSymbolicName, bundleVersion, url, startLevel, autoStartFlag);
             if (bundleInfo != null) {
-                this.toBeAddedInBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
+                toBeAddedInBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
             }
         } catch (URISyntaxException ex) {
             throw new IOException(ex.getCause());
         }
     }
 
-    public void removeBundleFromBundlesInfo(String bundleSymbolicName, URI url, String bundleVersion, int startLevel, boolean autoStartFlag)
+    private static void removeBundleFromBundlesInfo(String bundleSymbolicName, URI url, String bundleVersion, int startLevel, boolean autoStartFlag)
         throws IOException, BundleException {
         try {
             BundleInfo bundleInfo = createBundleInfo(bundleSymbolicName, bundleVersion, url, startLevel, autoStartFlag);
             if (bundleInfo != null) {
-                this.toBeRemovedFromBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
+                toBeRemovedFromBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
             }
         } catch (URISyntaxException ex) {
             throw new IOException(ex.getCause());
@@ -90,10 +115,10 @@
     }
 
     public boolean isAvailable() {
-        return this.bundlesInfoFile.exists();
+        return bundlesInfoFile.exists();
     }
 
-    private HashMap<String, BundleInfo> readBundleInfosInMap(List<BundleInfo> bundleInfos) {
+    private static HashMap<String, BundleInfo> readBundleInfosInMap(List<BundleInfo> bundleInfos) {
         HashMap<String, BundleInfo> infos = new HashMap<String, BundleInfo>();
         for (BundleInfo bundleInfo : bundleInfos) {
             infos.put(getIdentifier(bundleInfo), bundleInfo);
@@ -102,28 +127,28 @@
     }
 
     @SuppressWarnings("unchecked")
-	public void updateBundleInfosRepository() throws IOException {
-        List<BundleInfo> readConfiguration = SimpleConfiguratorUtils.readConfiguration(this.bundlesInfoFile.toURI().toURL(), this.baseDir == null ? null : this.baseDir.toURI());
+	private static void updateBundleInfosRepository() throws IOException {
+        List<BundleInfo> readConfiguration = SimpleConfiguratorUtils.readConfiguration(bundlesInfoFile.toURI().toURL(), baseDir == null ? null : baseDir.toURI());
 		HashMap<String, BundleInfo> currentBundleInfos = readBundleInfosInMap(readConfiguration);
 
-        currentBundleInfos.putAll(this.toBeAddedInBundlesInfo);
-        this.toBeAddedInBundlesInfo.clear();
+        currentBundleInfos.putAll(toBeAddedInBundlesInfo);
+        toBeAddedInBundlesInfo.clear();
 
-        for (String identifier : this.toBeRemovedFromBundlesInfo.keySet()) {
+        for (String identifier : toBeRemovedFromBundlesInfo.keySet()) {
             currentBundleInfos.remove(identifier);
         }
-        this.toBeRemovedFromBundlesInfo.clear();
+        toBeRemovedFromBundlesInfo.clear();
 
-        if (this.bundlesInfoFile.exists()) {
-            String backupName = this.bundlesInfoFile.getName() + System.currentTimeMillis();
-            File backupFile = new File(this.bundlesInfoFile.getParentFile(), backupName);
-            if (!this.bundlesInfoFile.renameTo(backupFile)) {
-                throw new IOException("Fail to rename from (" + this.bundlesInfoFile + ") to (" + backupFile + ")");
+        if (bundlesInfoFile.exists()) {
+            String backupName = bundlesInfoFile.getName() + System.currentTimeMillis();
+            File backupFile = new File(bundlesInfoFile.getParentFile(), backupName);
+            if (!bundlesInfoFile.renameTo(backupFile)) {
+                throw new IOException("Fail to rename from (" + bundlesInfoFile + ") to (" + backupFile + ")");
             }
         }
 
         SimpleConfiguratorManipulatorUtils.writeConfiguration(currentBundleInfos.values().toArray(new BundleInfo[currentBundleInfos.size()]),
-            this.bundlesInfoFile);
+            bundlesInfoFile);
     }
 
     private static BundleInfo bundleFile2BundleInfo(File file, int startLevel, boolean autoStartFlag) throws IOException, BundleException {
