diff --git a/org.eclipse.virgo.nano.deployer/.classpath b/org.eclipse.virgo.nano.deployer/.classpath
index 7ae18a1..bab38b9 100644
--- a/org.eclipse.virgo.nano.deployer/.classpath
+++ b/org.eclipse.virgo.nano.deployer/.classpath
@@ -28,7 +28,7 @@
 	<classpathentry kind="var" path="IVY_CACHE/org.easymock/com.springsource.org.easymock/2.3.0/com.springsource.org.easymock-2.3.0.jar" sourcepath="/IVY_CACHE/org.easymock/com.springsource.org.easymock/2.3.0/com.springsource.org.easymock-sources-2.3.0.jar"/>
 	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.medic/org.eclipse.virgo.medic.core/3.6.0.D-20121003030924/org.eclipse.virgo.medic.core-3.6.0.D-20121003030924.jar"/>
 	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.eclipse.equinox.simpleconfigurator.manipulator/2.0.0.v20110808-1657/org.eclipse.equinox.simpleconfigurator.manipulator-2.0.0.v20110808-1657.jar"/>
-	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.eclipse.equinox.simpleconfigurator/1.0.300.v20110815-1744/org.eclipse.equinox.simpleconfigurator-1.0.300.v20110815-1744.jar" sourcepath="/IVY_CACHE/org.eclipse.osgi/org.eclipse.equinox.simpleconfigurator/1.0.300.v20110815-1744/org.eclipse.equinox.simpleconfigurator-sources-1.0.300.v20110815-1744.jar"/>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.eclipse.equinox.simpleconfigurator/1.0.300.v20110815-1744/org.eclipse.equinox.simpleconfigurator-1.0.300.v20110815-1744.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.mirrored/org.eclipse.equinox.simpleconfigurator/1.0.300.v20110815-1744/org.eclipse.equinox.simpleconfigurator.source-1.0.300.v20110815-1744.jar"/>
 	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.slf4j.api/1.6.4.v20120130-2120/org.slf4j.api-1.6.4.v20120130-2120.jar" sourcepath="/IVY_CACHE/org.slf4j/com.springsource.slf4j.api/1.6.1/com.springsource.slf4j.api-sources-1.6.1.jar"/>
 	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi.manifest/3.6.0.D-20121003030151/org.eclipse.virgo.util.osgi.manifest-3.6.0.D-20121003030151.jar"/>
 	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.medic/org.eclipse.virgo.medic.test/3.6.0.D-20121003030924/org.eclipse.virgo.medic.test-3.6.0.D-20121003030924.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.medic/org.eclipse.virgo.medic.test/3.1.0.D-20111205152504/org.eclipse.virgo.medic.test-sources-3.1.0.D-20111205152504.jar"/>
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 46a5326..08fcc94 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
@@ -131,19 +131,13 @@
         } catch (Exception e) {
             this.eventLogger.log(NanoDeployerLogEvents.NANO_REFRESH_HOST_ERROR, e, fragment.getSymbolicName(), fragment.getVersion());
         }
-        try {
-            if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
-                registerToBundlesInfo(fragment, true);
-            }
-        } catch (Exception e) {
-            this.eventLogger.log(NanoDeployerLogEvents.NANO_PERSIST_ERROR, e, fragment.getSymbolicName(), fragment.getVersion());
-        }
     }
 
-    private void updateBundleInfo(Bundle bundle, Boolean isFragment) {
+    private void updateBundleInfo(Bundle bundle, File stagedFile, Boolean isFragment) {
         try {
+            URI location = BundleLocationUtil.getRelativisedURI(this.kernelHomeFile, stagedFile);
             if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
-                registerToBundlesInfo(bundle, true);
+                registerToBundlesInfo(bundle, location.toString(), isFragment);
             }
         } catch (Exception ex) {
             this.eventLogger.log(NanoDeployerLogEvents.NANO_PERSIST_ERROR, ex, bundle.getSymbolicName(), bundle.getVersion());
@@ -158,8 +152,7 @@
                 this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING_ERROR, uri);
                 return STATUS_ERROR;
             }
-            // copy bundle to work folder
-            File stagedFile = new File(this.workBundleInstallLocation, extractJarFileNameFromString(uri.toString()));
+            File stagedFile = getStagedFile(uri);
             FileCopyUtils.copy(new File(uri), stagedFile);
 
             // install the bundle
@@ -170,7 +163,7 @@
             // if fragment, refresh hosts and update bundles.info
             if (isFragment(hostHolder)) {
                 refreshHosts(hostHolder, installed);
-                updateBundleInfo(installed, true);
+                updateBundleInfo(installed, stagedFile, true);
             }
         } catch (Exception e) {
             this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING_ERROR, e, uri);
@@ -182,12 +175,13 @@
     @Override
     public boolean start(URI uri) {
         Bundle installedBundle = getInstalledBundle(uri);
+        File stagedFile = getStagedFile(uri);
         if (installedBundle != null) {
             this.eventLogger.log(NanoDeployerLogEvents.NANO_STARTING, installedBundle.getSymbolicName(), installedBundle.getVersion());
             try {
                 if (!isFragment(installedBundle)) {
                     installedBundle.start();
-                    updateBundleInfo(installedBundle, false);
+                    updateBundleInfo(installedBundle, stagedFile, false);
                 } else {
                     this.logger.warn("The installed bundle for the given url [" + uri
                         + "] is a fragment bundle. Start operation for this url failed. ");
@@ -214,6 +208,7 @@
         }
         final Bundle installed;
         final FragmentHost hostHolder;
+        File stagedFile = null;
         try {
             // copy bundle to work
             if (!this.workBundleInstallLocation.exists()) {
@@ -224,7 +219,7 @@
                     return STATUS_ERROR;
                 }
             }
-            File stagedFile = new File(this.workBundleInstallLocation, extractJarFileNameFromString(path.toString()));
+            stagedFile = getStagedFile(path);
             FileCopyUtils.copy(deployedFile, stagedFile);
             // install the bundle
             installed = this.bundleContext.installBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, stagedFile));
@@ -258,7 +253,8 @@
         }
         try {
             if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
-                registerToBundlesInfo(installed, hostHolder != null && hostHolder.getBundleSymbolicName() != null);
+                String bundlesInfoLocation = BundleLocationUtil.getRelativisedURI(kernelHomeFile, stagedFile).toString();
+                registerToBundlesInfo(installed, bundlesInfoLocation, hostHolder != null && hostHolder.getBundleSymbolicName() != null);
             }
         } catch (Exception e) {
             this.eventLogger.log(NanoDeployerLogEvents.NANO_PERSIST_ERROR, e, installed.getSymbolicName(), installed.getVersion());
@@ -317,14 +313,15 @@
     @Override
     public boolean undeploy(Bundle bundle) {
         if (bundle != null) {
-            File stagingFileToDelete = new File(bundle.getLocation().substring(BundleLocationUtil.REFERENCE_PREFIX.length()));
+            File stagingFileToDelete = new File(bundle.getLocation().substring(BundleLocationUtil.REFERENCE_FILE_PREFIX.length()));
             final FragmentHost hostHolder = getFragmentHostFromDeployedBundleIfExsiting(stagingFileToDelete);
             try {
                 if (this.logger.isInfoEnabled()) {
                     this.logger.info("Removing bundle '" + bundle.getSymbolicName() + "' version '" + bundle.getVersion() + "' from bundles.info.");
                 }
                 if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
-                    unregisterToBundlesInfo(bundle, hostHolder != null && hostHolder.getBundleSymbolicName() != null);
+                    String bundlesInfoLocation = BundleLocationUtil.getRelativisedURI(kernelHomeFile, stagingFileToDelete).toString();
+                    unregisterToBundlesInfo(bundle, bundlesInfoLocation, hostHolder != null && hostHolder.getBundleSymbolicName() != null);
                     this.logger.info("Successfully removed bundle '" + bundle.getSymbolicName() + "' version '" + bundle.getVersion()
                         + "' from bundles.info.");
                 } else {
@@ -361,14 +358,17 @@
     }
 
     private Bundle getInstalledBundle(URI uri) {
+        return this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, getStagedFile(uri)));
+    }
+
+    private File getStagedFile(URI uri) {
         File matchingStagingBundle = new File(this.workBundleInstallLocation, extractJarFileNameFromString(uri.toString()));
-        return this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, matchingStagingBundle));
+        return matchingStagingBundle;
     }
 
     @Override
     public boolean isDeployed(URI path) {
-        File matchingStagingBundle = new File(this.workBundleInstallLocation, extractJarFileNameFromString(path.toString()));
-        if (this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, matchingStagingBundle)) == null) {
+        if (this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, getStagedFile(path))) == null) {
             return false;
         }
         return true;
@@ -376,7 +376,7 @@
 
     @Override
     public DeploymentIdentity getDeploymentIdentity(URI path) {
-        File matchingStagingBundle = new File(this.workBundleInstallLocation, extractJarFileNameFromString(path.toString()));
+        File matchingStagingBundle = getStagedFile(path);
         Bundle bundle = this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, matchingStagingBundle));
         if (bundle == null) {
             return null;
@@ -414,18 +414,16 @@
         return isWritable;
     }
 
-    private final void registerToBundlesInfo(Bundle bundle, boolean isFragment) throws URISyntaxException, IOException, BundleException {
-        String location = bundle.getLocation();
+    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(location),
+        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, boolean isFragment) throws IOException, BundleException, URISyntaxException {
-        String location = bundle.getLocation();
+    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(location),
+        this.bundleInfosUpdater.removeBundleFromBundlesInfo(symbolicName == null ? UNKNOWN : symbolicName, new URI(stagedRelativeLocation),
             bundle.getVersion().toString(), SimpleDeployer.HOT_DEPLOYED_ARTIFACTS_START_LEVEL, !isFragment);
         this.bundleInfosUpdater.updateBundleInfosRepository();
     }
diff --git a/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleLocationUtil.java b/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleLocationUtil.java
index 19959ca..4869a08 100644
--- a/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleLocationUtil.java
+++ b/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleLocationUtil.java
@@ -5,10 +5,13 @@
 
 public class BundleLocationUtil {
     
-    public static final String REFERENCE_PREFIX = "reference:file:";
+    public static final String REFERENCE_FILE_PREFIX = "reference:file:";
     
-    public static String createInstallLocation(final File kernelHomeFile, final File jarFile) {
-        URI relativeUriLocation = kernelHomeFile.toURI().relativize(jarFile.toURI());
-        return REFERENCE_PREFIX + relativeUriLocation;
+    public static String createInstallLocation(final File kernelHomeFile, final File archiveFile) {
+        return REFERENCE_FILE_PREFIX + getRelativisedURI(kernelHomeFile, archiveFile);
+    }
+    
+    public static URI getRelativisedURI(final File kernelHomeFile, final File archiveFile) {
+        return kernelHomeFile.toURI().relativize(archiveFile.toURI());
     }
 }
