diff --git a/src/main/java/org/olat/core/commons/modules/bc/FolderModule.java b/src/main/java/org/olat/core/commons/modules/bc/FolderModule.java
index 1af26259f65c9ff67befbf1bb20e2fda07fa6426..47121b2487c46b2a7e5a51edb758c1801562caf6 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/FolderModule.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/FolderModule.java
@@ -60,7 +60,8 @@ public class FolderModule extends AbstractOLATModule {
 	@Override
 	protected void initDefaultProperties() {
 		// Set folder root
-		String homesRoot = getStringConfigParameter(CONFIG_ROOT, System.getProperty("java.io.tmpdir")+"/olatdata/bcroot", false);
+		File defaultHome = new File(System.getProperty("java.io.tmpdir"), "olatdata/bcroot");
+		String homesRoot = getStringConfigParameter(CONFIG_ROOT, defaultHome.getAbsolutePath() , false);
 		if (Settings.isJUnitTest()) {
 			// use dummy directory for junit testcases to not conflict with actual data
 			// on current server. someone may start junit test and not realize that this
diff --git a/src/main/java/org/olat/core/commons/modules/bc/version/RevisionListController.java b/src/main/java/org/olat/core/commons/modules/bc/version/RevisionListController.java
index c70ff246e0b76a914896d8ac24c68bd54fb0c4b4..aac79bf36e673bfdad9c166ff8e5fc990cda81c4 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/version/RevisionListController.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/version/RevisionListController.java
@@ -29,8 +29,6 @@ import java.util.Locale;
 
 import org.olat.core.commons.modules.bc.commands.FolderCommand;
 import org.olat.core.commons.modules.bc.commands.FolderCommandStatus;
-import org.olat.core.commons.modules.bc.meta.MetaInfo;
-import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.table.BaseTableDataModelWithoutFilter;
@@ -90,6 +88,19 @@ public class RevisionListController extends BasicController {
 
 	public RevisionListController(UserRequest ureq, WindowControl wControl, Versionable versionedFile, String title, String description) {
 		super(ureq, wControl);
+		
+		//reload the file with all possible precautions
+		VFSLeaf versionedLeaf = null;
+		if(versionedFile instanceof VFSLeaf) {
+			versionedLeaf = (VFSLeaf)versionedFile;
+		}
+		if(versionedLeaf != null && versionedLeaf.getParentContainer() != null) {
+			//reload the file
+			versionedLeaf = (VFSLeaf)versionedLeaf.getParentContainer().resolve(((VFSLeaf) versionedFile).getName());
+			if(versionedLeaf instanceof Versionable) {
+				versionedFile = (Versionable)versionedLeaf;
+			}
+		}
 		this.versionedFile = versionedFile;
 
 		TableGuiConfiguration summaryTableConfig = new TableGuiConfiguration();
@@ -127,8 +138,9 @@ public class RevisionListController extends BasicController {
 		revisionListTableCtr.addMultiSelectAction("cancel", CMD_CANCEL);
 		revisionListTableCtr.setMultiSelect(true);
 		
-		List<VFSRevision> revisions = new ArrayList<VFSRevision>(versionedFile.getVersions().getRevisions());
-		revisions.add(new CurrentRevision((VFSLeaf)versionedFile));
+		Versions versions = versionedFile.getVersions();
+		List<VFSRevision> revisions = new ArrayList<VFSRevision>(versions.getRevisions());
+		revisions.add(new CurrentRevision(versionedLeaf, versions));
 
 		revisionListTableCtr.setTableDataModel(new RevisionListDataModel(revisions, ureq.getLocale()));
 		listenTo(revisionListTableCtr);
@@ -284,21 +296,18 @@ public class RevisionListController extends BasicController {
 	
 	public class CurrentRevision implements VFSRevision {
 		private final VFSLeaf versionFile;
+		private final Versions versions;
 		
-		public CurrentRevision(VFSLeaf versionFile) {
+		public CurrentRevision(VFSLeaf versionFile, Versions versions) {
 			this.versionFile = versionFile;
+			this.versions = versions;
 		}
 
 		public String getAuthor() {
-			if(versionFile instanceof MetaTagged) {
-				MetaInfo info = ((MetaTagged)versionFile).getMetaInfo();
-				return info.getAuthor();
-			}
-			return "-";
+			return versions.getAuthor();
 		}
 
 		public String getComment() {
-			Versions versions = ((Versionable)versionFile).getVersions();
 			String comment = versions.getComment();
 			if (StringHelper.containsNonWhitespace(comment)) {
 				return comment;
@@ -321,7 +330,7 @@ public class RevisionListController extends BasicController {
 		}
 
 		public String getRevisionNr() {
-			return ((Versionable)versionFile).getVersions().getRevisionNr();
+			return versions.getRevisionNr();
 		}
 
 		public long getSize() {
diff --git a/src/main/java/org/olat/core/util/vfs/version/NotVersioned.java b/src/main/java/org/olat/core/util/vfs/version/NotVersioned.java
index 27706edf82f6a89be3163cf9021cd2fb958da4b5..dee434b379fcd29127d4b303bb8212a651fbe6fd 100644
--- a/src/main/java/org/olat/core/util/vfs/version/NotVersioned.java
+++ b/src/main/java/org/olat/core/util/vfs/version/NotVersioned.java
@@ -46,6 +46,11 @@ public class NotVersioned implements Versions {
 		return Collections.emptyList();
 	}
 
+	@Override
+	public String getAuthor() {
+		return "";
+	}
+
 	public String getCreator() {
 		return "";
 	}
diff --git a/src/main/java/org/olat/core/util/vfs/version/Versions.java b/src/main/java/org/olat/core/util/vfs/version/Versions.java
index 5ae37235f0fc9905416a5ea5d2074ceea9bbe153..864215c993a3bcdb4d667b31834f0c0d8bd17ed1 100644
--- a/src/main/java/org/olat/core/util/vfs/version/Versions.java
+++ b/src/main/java/org/olat/core/util/vfs/version/Versions.java
@@ -45,6 +45,11 @@ public interface Versions {
 	 * @return the current version number
 	 */
 	public String getRevisionNr();
+	
+	/**
+	 * @return the current author of the file
+	 */
+	public String getAuthor();
 
 	/**
 	 * @return creator of the file
diff --git a/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java b/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java
index cd5da89cc05d5eee763cb7946d75e24460911614..a1c478a4c9d40d043303c86ee6fc931a7ab350f9 100644
--- a/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java
+++ b/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java
@@ -113,6 +113,7 @@ public class VersionsFileImpl implements Versions {
 		this.versioned = versioned;
 	}
 
+	@Override
 	public String getAuthor() {
 		return author;
 	}
diff --git a/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java b/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java
index ca20ea78642e4e6cf5ab623143198dc0ec3cacf1..a6f25b3410a28a89a1c375cd1edc9f8c428814a3 100644
--- a/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java
+++ b/src/main/java/org/olat/core/util/vfs/version/VersionsFileManager.java
@@ -75,6 +75,7 @@ public class VersionsFileManager extends VersionsManager implements Initializabl
 	private static XStream mystream;
 	
 
+	private File rootFolder;
 	private File rootVersionFolder;
 	private VFSContainer rootVersionsContainer;
 
@@ -547,7 +548,10 @@ public class VersionsFileManager extends VersionsManager implements Initializabl
 	}
 
 	public String getCanonicalRoot() {
-		return FolderConfig.getCanonicalRoot();
+		if(rootFolder == null) {
+			rootFolder = new File(FolderConfig.getCanonicalRoot());
+		}
+		return rootFolder.getAbsolutePath();
 	}
 	
 	public File getRootVersionsFile() {
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
index 502bfcd4986617bf87a53e6f7a94dcc01d60b49a..a00b7df4395cd389ef9aab8e74f9c9092904a1f7 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
@@ -233,7 +233,7 @@ details.entryinfoheader=Information on this entry
 details.extlinkheader=External link to this learning resource
 details.groups=Manage owners
 details.groups.participant=Manage participants
-details.groups.tutor=Manage owners
+details.groups.tutor=Manage coaches
 details.header=Detailed view
 details.launch=Show content
 details.members=Members management
diff --git a/src/test/java/org/olat/core/util/vfs/VersionManagerTest.java b/src/test/java/org/olat/core/util/vfs/VersionManagerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..803cd5f9fbef8d4e47e2db0fa28af11fb55335b1
--- /dev/null
+++ b/src/test/java/org/olat/core/util/vfs/VersionManagerTest.java
@@ -0,0 +1,179 @@
+package org.olat.core.util.vfs;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.olat.core.CoreSpringFactory;
+import org.olat.core.commons.modules.bc.meta.MetaInfo;
+import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged;
+import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
+import org.olat.core.id.Identity;
+import org.olat.core.util.vfs.version.SimpleVersionConfig;
+import org.olat.core.util.vfs.version.VFSRevision;
+import org.olat.core.util.vfs.version.Versionable;
+import org.olat.core.util.vfs.version.Versions;
+import org.olat.core.util.vfs.version.VersionsFileManager;
+import org.olat.test.JunitTestHelper;
+import org.olat.test.OlatTestCase;
+
+/**
+ * 
+ * Description:<br>
+ * 
+ * <P>
+ * Initial Date:  23 déc. 2011 <br>
+ *
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class VersionManagerTest extends OlatTestCase {
+	
+	private static boolean setuped = false;
+	
+	private static Identity id1, id2;
+	
+	@Before
+	public void setUp() throws Exception {
+		if(setuped) return;
+		
+		//create identities
+		id1 = JunitTestHelper.createAndPersistIdentityAsUser("vm-one" + getRandomName());
+		id2 = JunitTestHelper.createAndPersistIdentityAsUser("vm-two" + getRandomName());
+		
+		SimpleVersionConfig versionConfig = (SimpleVersionConfig)CoreSpringFactory.getBean("versioningConfigurator");
+		versionConfig.setMaxNumberOfVersionsProperty(new Long(10));
+		
+		setuped = true;
+	}
+	
+	@Test
+	public void testVersionManager() throws IOException {
+		//create a file
+		OlatRootFolderImpl rootTest = new OlatRootFolderImpl("/test", null);
+		String filename = getRandomName();
+		VFSLeaf file = rootTest.createChildLeaf(filename);
+		OutputStream out = file.getOutputStream(false);
+		InputStream in = VersionManagerTest.class.getResourceAsStream("test.txt");
+		int byteCopied = IOUtils.copy(in, out);
+		IOUtils.closeQuietly(in);
+		assertFalse(byteCopied == 0);
+		assertTrue(file instanceof Versionable);
+		
+		//save a first version
+		Versionable versionedFile1 = (Versionable)file;
+		InputStream in1 = new ByteArrayInputStream("Hello version 1".getBytes());
+		versionedFile1.getVersions().addVersion(id2, "Version 1", in1);
+		IOUtils.closeQuietly(in1);
+		
+		//save a second version
+		Versionable versionedFile2 = (Versionable)file;
+		InputStream in2 = new ByteArrayInputStream("Hello version 2".getBytes());
+		versionedFile2.getVersions().addVersion(id2, "Version 2", in2);
+		IOUtils.closeQuietly(in2);
+		
+		//save a third version
+		Versionable versionedFile3 = (Versionable)file;
+		InputStream in3 = new ByteArrayInputStream("Hello version 3".getBytes());
+		versionedFile3.getVersions().addVersion(id2, "Version 3", in3);
+		IOUtils.closeQuietly(in3);
+
+		//make the checks
+		VFSItem retrievedFile = rootTest.resolve(filename);
+		assertTrue(retrievedFile instanceof Versionable);
+		Versions versions = VersionsFileManager.getInstance().createVersionsFor((VFSLeaf)retrievedFile);	
+		List<VFSRevision> revisions = versions.getRevisions();
+		assertNotNull(revisions);
+		assertEquals(3, revisions.size());
+		
+		VFSRevision revision0 = revisions.get(0);
+		//we don't set an author for the original file
+		assertEquals("-", revision0.getAuthor());
+		VFSRevision revision1 = revisions.get(1);
+		assertEquals(id2.getName(), revision1.getAuthor());
+		VFSRevision revision2 = revisions.get(2);
+		assertEquals(id2.getName(), revision2.getAuthor());
+
+		//check the comments
+		assertNull(revision0.getComment());	
+		assertEquals("Version 1", revision1.getComment());
+		assertEquals("Version 2", revision2.getComment());
+		assertEquals("Version 3", versions.getComment());
+	}
+	
+	@Test
+	public void testAuthorsAndCreators() throws IOException {
+		//create a file
+		OlatRootFolderImpl rootTest = new OlatRootFolderImpl("/test2", null);
+		String filename = getRandomName();
+		VFSLeaf file = rootTest.createChildLeaf(filename);
+		OutputStream out = file.getOutputStream(false);
+		InputStream in = VersionManagerTest.class.getResourceAsStream("test.txt");
+		int byteCopied = IOUtils.copy(in, out);
+		IOUtils.closeQuietly(in);
+		assertFalse(byteCopied == 0);
+		assertTrue(file instanceof Versionable);
+		assertTrue(file instanceof MetaTagged);
+		
+		//set the author
+		MetaTagged metaTagged = (MetaTagged)file;
+		MetaInfo metaInfo = metaTagged.getMetaInfo();
+		metaInfo.setAuthor(id1.getName());
+		metaInfo.setCreator(id1.getName());
+		metaInfo.write();
+		
+		//save a first version -> id2
+		Versionable versionedFile1 = (Versionable)file;
+		InputStream in1 = new ByteArrayInputStream("Hello version 1".getBytes());
+		versionedFile1.getVersions().addVersion(id2, "Version 1", in1);
+		IOUtils.closeQuietly(in1);
+		
+		//save a second version -> id1
+		Versionable versionedFile2 = (Versionable)file;
+		InputStream in2 = new ByteArrayInputStream("Hello version 2".getBytes());
+		versionedFile2.getVersions().addVersion(id1, "Version 2", in2);
+		IOUtils.closeQuietly(in2);
+		
+		//save a third version -> id2
+		Versionable versionedFile3 = (Versionable)file;
+		InputStream in3 = new ByteArrayInputStream("Hello version 3".getBytes());
+		versionedFile3.getVersions().addVersion(id2, "Version 3", in3);
+		IOUtils.closeQuietly(in3);
+		
+		
+		//make the checks
+		VFSItem retrievedFile = rootTest.resolve(filename);
+		assertTrue(retrievedFile instanceof Versionable);
+		Versions versions = VersionsFileManager.getInstance().createVersionsFor((VFSLeaf)retrievedFile);	
+		List<VFSRevision> revisions = versions.getRevisions();
+		assertNotNull(revisions);
+		assertEquals(3, revisions.size());
+		assertTrue(retrievedFile instanceof MetaTagged);
+		
+		
+		VFSRevision revision0 = revisions.get(0);
+		//we don't set an author for the original file
+		assertEquals(id1.getName(), revision0.getAuthor());
+		VFSRevision revision1 = revisions.get(1);
+		assertEquals(id2.getName(), revision1.getAuthor());
+		VFSRevision revision2 = revisions.get(2);
+		assertEquals(id1.getName(), revision2.getAuthor());
+		//current
+		assertEquals(id2.getName(), versions.getAuthor());
+	}
+	
+	private String getRandomName() {
+		return UUID.randomUUID().toString().replace("-", "");
+	}
+}
\ No newline at end of file
diff --git a/src/test/java/org/olat/core/util/vfs/test.txt b/src/test/java/org/olat/core/util/vfs/test.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5ab2f8a4323abafb10abb68657d9d39f1a775057
--- /dev/null
+++ b/src/test/java/org/olat/core/util/vfs/test.txt
@@ -0,0 +1 @@
+Hello
\ No newline at end of file
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index f635ae0247b5015ac8b1952f2b02e8edc53785c8..1ac5448a34fc3820abe90d7d17d3147733a78676 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -131,6 +131,7 @@ import org.junit.runners.Suite;
 	org.olat.resource.accesscontrol.ACOfferManagerTest.class,
 	org.olat.resource.accesscontrol.ACOrderManagerTest.class,
 	org.olat.resource.accesscontrol.ACTransactionManagerTest.class,
+	org.olat.core.util.vfs.VersionManagerTest.class,
 	/**
 	 * 
 	 * Place tests which load their own Spring context