diff --git a/src/main/java/org/olat/core/commons/modules/glossary/GlossaryItemManager.java b/src/main/java/org/olat/core/commons/modules/glossary/GlossaryItemManager.java
index b6cc6b8a909686bff0f3567548f61f509a5af0a4..56015ee749f9c056959dc896104398d653d22f06 100644
--- a/src/main/java/org/olat/core/commons/modules/glossary/GlossaryItemManager.java
+++ b/src/main/java/org/olat/core/commons/modules/glossary/GlossaryItemManager.java
@@ -278,7 +278,7 @@ public class GlossaryItemManager {
 		List<GlossaryItem> glossaryItemList = new ArrayList<>();
 		if (glossaryFile == null) { return new ArrayList<>(); }
 		
-		Object glossObj = XStreamHelper.readObject(xstreamReader, glossaryFile.getInputStream());
+		Object glossObj = XStreamHelper.readObject(xstreamReader, glossaryFile);
 		if (glossObj instanceof ArrayList) {
 			ArrayList<GlossaryItem> glossItemsFromFile = (ArrayList<GlossaryItem>) glossObj;
 			glossaryItemList.addAll(glossItemsFromFile);
diff --git a/src/main/java/org/olat/core/util/xml/XStreamHelper.java b/src/main/java/org/olat/core/util/xml/XStreamHelper.java
index 6d2914f3eb89cc4694e69bb5eb56e4ff4b19bfbc..0c011ca9eb39b736048e5fe126d09b4cfcacbdc0 100644
--- a/src/main/java/org/olat/core/util/xml/XStreamHelper.java
+++ b/src/main/java/org/olat/core/util/xml/XStreamHelper.java
@@ -251,25 +251,11 @@ public class XStreamHelper {
 	 * @return
 	 */
 	public static Object readObject(XStream xStream, File file) {
-		FileInputStream fis = null;
-		BufferedInputStream bis = null;
-		try {
-			fis = new FileInputStream(file);
-			bis = new BufferedInputStream(fis);
+		try(FileInputStream fis = new FileInputStream(file);
+				BufferedInputStream bis = new BufferedInputStream(fis)) {
 			return readObject(xStream, bis);
 		} catch (IOException e) {
-			throw new OLATRuntimeException(XStreamHelper.class,
-					"could not read Object from file: "
-							+ file.getAbsolutePath(), e);
-		} finally {
-			try {
-				if (fis != null)
-					fis.close();
-				if (bis != null)
-					bis.close();
-			} catch (Exception e) {
-				// we did our best to close the inputStream
-			}
+			throw new OLATRuntimeException(XStreamHelper.class, "could not read Object from file: " + file.getAbsolutePath(), e);
 		}
 	}
 	
@@ -284,9 +270,7 @@ public class XStreamHelper {
 				InputStream bis = new BufferedInputStream(in)) {
 			return readObject(xStream, bis);
 		} catch (Exception e) {
-			throw new OLATRuntimeException(XStreamHelper.class,
-					"could not read Object from file: "
-							+ path, e);
+			throw new OLATRuntimeException(XStreamHelper.class, "could not read Object from file: " + path, e);
 		}
 	}
 	
@@ -300,25 +284,11 @@ public class XStreamHelper {
 	 * @return
 	 */
 	public static Object readObject(XStream xStream, VFSLeaf file) {
-		InputStream fis = null;
-		BufferedInputStream bis = null;
-		try {
-			fis = file.getInputStream();
-			bis = new BufferedInputStream(fis);
+		try(InputStream fis = file.getInputStream();
+				BufferedInputStream bis = new BufferedInputStream(fis)) {
 			return readObject(xStream, bis);
 		} catch (Exception e) {
-			throw new OLATRuntimeException(XStreamHelper.class,
-					"could not read Object from file: "
-							+ file.getName(), e);
-		} finally {
-			try {
-				if (fis != null)
-					fis.close();
-				if (bis != null)
-					bis.close();
-			} catch (Exception e) {
-				// we did our best to close the inputStream
-			}
+			throw new OLATRuntimeException(XStreamHelper.class, "could not read Object from file: " + file.getName(), e);
 		}
 	}
 
@@ -332,12 +302,8 @@ public class XStreamHelper {
 	 * @return
 	 */
 	public static Object readObject(XStream xStream, InputStream is) {
-		try {
-			InputStreamReader isr = new InputStreamReader(is, ENCODING);
-			Object obj = xStream.fromXML(isr);
-			isr.close();
-			is.close();
-			return obj;
+		try(InputStreamReader isr = new InputStreamReader(is, ENCODING);) {
+			return xStream.fromXML(isr);
 		} catch (Exception e) {
 			throw new OLATRuntimeException(XStreamHelper.class,
 					"could not read Object from inputstream: " + is, e);
diff --git a/src/main/java/org/olat/course/PersistingCourseImpl.java b/src/main/java/org/olat/course/PersistingCourseImpl.java
index 054643858387a8aafd3d558e5e49016900b79611..ac151b4f0df80327533e4e6a8cdab7b281d46f12 100644
--- a/src/main/java/org/olat/course/PersistingCourseImpl.java
+++ b/src/main/java/org/olat/course/PersistingCourseImpl.java
@@ -476,12 +476,12 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ
 	 */
 	private Object readObject(String fileName) {
 		VFSItem vfsItem = getCourseBaseContainer().resolve(fileName);
-		if (vfsItem == null || !(vfsItem instanceof VFSLeaf)) {
+		if (!(vfsItem instanceof VFSLeaf)) {
 			throw new CorruptedCourseException("Cannot resolve file: " + fileName + " course=" + toString());
 		}
 		try {
 			XStream xstream = CourseXStreamAliases.getReadCourseXStream();
-			return XStreamHelper.readObject(xstream, ((VFSLeaf)vfsItem).getInputStream());
+			return XStreamHelper.readObject(xstream, (VFSLeaf)vfsItem);
 		} catch (Exception e) {
 			log.error("Cannot read course tree file: " + fileName, e);
 			throw new CorruptedCourseException("Cannot resolve file: " + fileName + " course=" + toString(), e);
diff --git a/src/main/java/org/olat/course/config/manager/CourseConfigManagerImpl.java b/src/main/java/org/olat/course/config/manager/CourseConfigManagerImpl.java
index abc67450c699c474415e883c72917fcb2e2150b8..40e7d43e8cc6282daff3e68a10a448b01df752a2 100644
--- a/src/main/java/org/olat/course/config/manager/CourseConfigManagerImpl.java
+++ b/src/main/java/org/olat/course/config/manager/CourseConfigManagerImpl.java
@@ -89,7 +89,7 @@ public class CourseConfigManagerImpl implements CourseConfigManager {
 			saveConfigTo(course, retVal);
 		} else {
 			//file exists, load it with XStream, resolve version
-			Object tmp = XStreamHelper.readObject(xstream, configFile.getInputStream());
+			Object tmp = XStreamHelper.readObject(xstream, configFile);
 			if (tmp instanceof CourseConfig) {
 				retVal = (CourseConfig) tmp;
 				if (retVal.resolveVersionIssues()) {
diff --git a/src/main/java/org/olat/modules/video/VideoManager.java b/src/main/java/org/olat/modules/video/VideoManager.java
index f9e1a2dd0db1568e89cf1232bbf3592d3c1f934f..6f37936e14625edb74a0837d193b19809699e4bf 100644
--- a/src/main/java/org/olat/modules/video/VideoManager.java
+++ b/src/main/java/org/olat/modules/video/VideoManager.java
@@ -274,7 +274,7 @@ public interface VideoManager {
 	 * @param sourceResource the existing video resource
 	 * @param targetResource the empty new resource
 	 */
-	public void copyVideo(OLATResource sourceResource, OLATResource targetResource);
+	public void copyVideo(RepositoryEntry sourceEntry, RepositoryEntry targetEntry);
 
 	/**
 	 * Delete the video transcodings on disk an in database
diff --git a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
index 0389dc79155cdbd98136cf9e5383de6baca00d23..4f7f770cb03efd97c455d2caa0ee3dbe40edb270 100644
--- a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
+++ b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
@@ -60,6 +60,7 @@ import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
+import org.olat.core.util.StringHelper;
 import org.olat.core.util.ZipUtil;
 import org.olat.core.util.httpclient.HttpClientFactory;
 import org.olat.core.util.vfs.LocalFileImpl;
@@ -614,7 +615,13 @@ public class VideoManagerImpl implements VideoManager {
 		LocalFolderImpl repoentryContainer = (LocalFolderImpl)VFSManager.resolveOrCreateContainerFromPath(baseContainer, DIRNAME_REPOENTRY); 
 		RepositoryEntryImportExport importExport = new RepositoryEntryImportExport(repoEntry, repoentryContainer.getBasefile());
 		importExport.exportDoExportProperties();
-		// 2) package everything in resource folder to streaming zip resource
+		// 2) dump video metadata to resource folder
+		VideoMeta videoMeta = getVideoMetadata(videoResource);
+		if(videoMeta != null) {
+			VFSLeaf videoMetaFile = VFSManager.resolveOrCreateLeafFromPath(repoentryContainer, FILENAME_VIDEO_METADATA_XML);
+			VideoMetaXStream.toXml(videoMetaFile, videoMeta);
+		}
+		// 3) package everything in resource folder to streaming zip resource
 		return new VideoExportMediaResource(baseContainer, repoEntry.getDisplayname());
 	}
 
@@ -808,8 +815,15 @@ public class VideoManagerImpl implements VideoManager {
 		// 2) update metadata from the repo entry export
 		LocalFolderImpl repoentryContainer = (LocalFolderImpl) baseContainer.resolve(DIRNAME_REPOENTRY); 
 		if (repoentryContainer != null) {
+			// repo metadata
 			RepositoryEntryImportExport importExport = new RepositoryEntryImportExport(repoentryContainer.getBasefile());
 			importExport.setRepoEntryPropertiesFromImport(repoEntry);
+			// video metadata
+			VFSItem videoMetaFile = repoentryContainer.resolve(FILENAME_VIDEO_METADATA_XML); 
+			if(videoMetaFile instanceof VFSLeaf) {
+				VideoMeta videoMeta = VideoMetaXStream.fromXml((VFSLeaf)videoMetaFile);
+				videoMetadataDao.copyVideoMetadata(repoEntry, videoMeta);
+			}
 			// now delete the import folder, not used anymore
 			repoentryContainer.delete();
 		}
@@ -830,13 +844,20 @@ public class VideoManagerImpl implements VideoManager {
 	}
 
 	@Override
-	public void copyVideo(OLATResource sourceResource, OLATResource targetResource) {
+	public void copyVideo(RepositoryEntry sourceEntry, RepositoryEntry targetEntry) {
+		OLATResource sourceResource = sourceEntry.getOlatResource();
+		OLATResource targetResource = targetEntry.getOlatResource();
 		// 1) Copy files on disk
 		File sourceFileroot = FileResourceManager.getInstance().getFileResourceRootImpl(sourceResource).getBasefile();
 		File targetFileroot = FileResourceManager.getInstance().getFileResourceRootImpl(targetResource).getBasefile();
 		FileUtils.copyDirContentsToDir(sourceFileroot, targetFileroot, false, "copyVideoResource");
-		// 2) Trigger transcoding in background
-		if (videoModule.isTranscodingEnabled()) {
+		// 2) Copy metadata
+		VideoMetaImpl sourceMeta = getVideoMetadata(sourceResource);
+		if(sourceMeta != null) {
+			sourceMeta = videoMetadataDao.copyVideoMetadata(targetEntry, sourceMeta);
+		}
+		// 3) Trigger transcoding in background
+		if (videoModule.isTranscodingEnabled() && !StringHelper.containsNonWhitespace(sourceMeta.getUrl())) {
 			startTranscodingProcess(targetResource);
 		}
 	}
diff --git a/src/main/java/org/olat/modules/video/manager/VideoMetaXStream.java b/src/main/java/org/olat/modules/video/manager/VideoMetaXStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..38b08563e78d7af5fbacb1136116bf639411e474
--- /dev/null
+++ b/src/main/java/org/olat/modules/video/manager/VideoMetaXStream.java
@@ -0,0 +1,76 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.video.manager;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.core.util.xml.XStreamHelper;
+import org.olat.modules.video.VideoMeta;
+import org.olat.modules.video.model.VideoMetaImpl;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.security.ExplicitTypePermission;
+
+/**
+ * 
+ * Initial date: 13 févr. 2019<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class VideoMetaXStream {
+	
+	private static final XStream xstream = XStreamHelper.createXStreamInstance();
+	static {
+		XStream.setupDefaultSecurity(xstream);
+		Class<?>[] types = new Class[] {
+				VideoMeta.class, VideoMetaImpl.class
+		};
+		xstream.addPermission(new ExplicitTypePermission(types));
+		xstream.ignoreUnknownElements();
+
+		xstream.alias("videoMeta", VideoMetaImpl.class);
+		xstream.omitField(VideoMetaImpl.class, "videoResource");
+	}
+	
+	public static void toXml(VFSLeaf file, VideoMeta obj) {
+		XStreamHelper.writeObject(xstream, file, obj);
+	}
+	
+	public static void toXml(OutputStream out, VideoMeta obj) {
+		XStreamHelper.writeObject(xstream, out, obj);
+	}
+	
+	/**
+	 * Your responsible to close the input stream.
+	 * 
+	 * @param in The input stream
+	 * @return The video metadata
+	 */
+	public static VideoMeta fromXml(InputStream in) {
+		return (VideoMeta)xstream.fromXML(in);
+	}
+	
+	public static VideoMeta fromXml(VFSLeaf file) {
+		return (VideoMeta)XStreamHelper.readObject(xstream, file);
+	}
+
+}
diff --git a/src/main/java/org/olat/modules/video/manager/VideoMetadataDAO.java b/src/main/java/org/olat/modules/video/manager/VideoMetadataDAO.java
index 2c6b544eebdc1472c4fb52ed5b162212ee67f64a..9841903006e156c619feceab115bf0d4d40cfaa8 100644
--- a/src/main/java/org/olat/modules/video/manager/VideoMetadataDAO.java
+++ b/src/main/java/org/olat/modules/video/manager/VideoMetadataDAO.java
@@ -139,5 +139,20 @@ public class VideoMetadataDAO {
 		dbInstance.getCurrentEntityManager().persist(videometa);
 		return videometa;
 	}
+	
+	VideoMetaImpl copyVideoMetadata(RepositoryEntry repoEntry, VideoMeta sourceMeta) {
+		VideoMetaImpl videometa = new VideoMetaImpl();
+		videometa.setVideoResource(repoEntry.getOlatResource());
+		videometa.setVideoFormat(sourceMeta.getVideoFormat());
+		videometa.setUrl(sourceMeta.getUrl());
+		videometa.setCreationDate(new Date());
+		videometa.setLastModified(videometa.getCreationDate());		
+		videometa.setHeight(sourceMeta.getHeight());
+		videometa.setWidth(sourceMeta.getWidth());
+		videometa.setSize(sourceMeta.getSize());
+		videometa.setLength(sourceMeta.getLength());
+		dbInstance.getCurrentEntityManager().persist(videometa);
+		return videometa;
+	}
 
 }
diff --git a/src/main/java/org/olat/modules/video/model/VideoMetadataImpl.java b/src/main/java/org/olat/modules/video/model/VideoMetadataImpl.java
index 986b7be9d4f27cfe90a861e5cb8a6eb3043b4b86..07de0f760c9d47f52c42ce724717679e955b9eef 100644
--- a/src/main/java/org/olat/modules/video/model/VideoMetadataImpl.java
+++ b/src/main/java/org/olat/modules/video/model/VideoMetadataImpl.java
@@ -33,7 +33,6 @@ import org.olat.modules.video.VideoMetadata;
  * @author Dirk Furrer
  * 
  */
-
 public class VideoMetadataImpl implements Serializable, VideoMetadata {
 	private static final long serialVersionUID = 1L;
 		private int width;
@@ -41,7 +40,7 @@ public class VideoMetadataImpl implements Serializable, VideoMetadata {
 		private HashMap<String, String> tracks;
 		
 		public VideoMetadataImpl() {
-			tracks = new HashMap<String, String>();
+			tracks = new HashMap<>();
 		}
 				
 		@Override
diff --git a/src/main/java/org/olat/modules/webFeed/manager/FeedFileStorge.java b/src/main/java/org/olat/modules/webFeed/manager/FeedFileStorge.java
index dd50003e47539e8b7f00087657de86a9aa6290f7..25d07e706aa42c594c44ef79a94256e6f86dbde3 100644
--- a/src/main/java/org/olat/modules/webFeed/manager/FeedFileStorge.java
+++ b/src/main/java/org/olat/modules/webFeed/manager/FeedFileStorge.java
@@ -291,7 +291,7 @@ public class FeedFileStorge {
 		if (feedContainer != null) {
 			VFSLeaf leaf = (VFSLeaf) feedContainer.resolve(FEED_FILE_NAME);
 			if (leaf != null) {
-				feed = (FeedImpl) XStreamHelper.readObject(xstream, leaf.getInputStream());
+				feed = (FeedImpl) XStreamHelper.readObject(xstream, leaf);
 				shorteningFeedToLengthOfDbAttribues(feed);
 			}
 		} else {
@@ -390,7 +390,7 @@ public class FeedFileStorge {
 			VFSLeaf leaf = (VFSLeaf) itemContainer.resolve(ITEM_FILE_NAME);
 			if (leaf != null) {
 				try {
-					item = (ItemImpl) XStreamHelper.readObject(xstream, leaf.getInputStream());
+					item = (ItemImpl) XStreamHelper.readObject(xstream, leaf);
 				} catch (Exception e) {
 					log.warn("Item XML-File could not be read. Item container: " + leaf);
 				}
diff --git a/src/main/java/org/olat/repository/RepositoryEntryImportExport.java b/src/main/java/org/olat/repository/RepositoryEntryImportExport.java
index 3883867ed2db7b5dccc556cde658eb2098d456ed..21eba90248778d24ebb6edebc1dd2b5717cc9c13 100644
--- a/src/main/java/org/olat/repository/RepositoryEntryImportExport.java
+++ b/src/main/java/org/olat/repository/RepositoryEntryImportExport.java
@@ -30,11 +30,11 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.nio.file.FileSystem;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.StandardOpenOption;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -165,9 +165,9 @@ public class RepositoryEntryImportExport {
 		}
 	}
 	
-	private void addLicenseInformations(RepositoryEntryImport imp, RepositoryEntry re) {
+	private void addLicenseInformations(RepositoryEntryImport imp, RepositoryEntry entry) {
 		LicenseService licenseService = CoreSpringFactory.getImpl(LicenseService.class);
-		ResourceLicense license = licenseService.loadLicense(re.getOlatResource());
+		ResourceLicense license = licenseService.loadLicense(entry.getOlatResource());
 		if (license != null) {
 			imp.setLicenseTypeKey(String.valueOf(license.getLicenseType().getKey()));
 			imp.setLicenseTypeName(license.getLicenseType().getName());
@@ -183,8 +183,9 @@ public class RepositoryEntryImportExport {
 		if(image != null) {
 			imp.setImageName(image.getName());
 			zout.putNextEntry(new ZipEntry(image.getName()));
-			try(InputStream inImage=image.getInputStream()) {
-				FileUtils.copy(inImage, new ShieldOutputStream(zout));
+			try(InputStream inImage=image.getInputStream();
+					OutputStream out = new ShieldOutputStream(zout)) {
+				FileUtils.copy(inImage, out);
 			} catch(Exception e) {
 				log.error("", e);
 			}
@@ -196,8 +197,9 @@ public class RepositoryEntryImportExport {
 		if(movie != null) {
 			imp.setMovieName(movie.getName());
 			zout.putNextEntry(new ZipEntry(movie.getName()));
-			try(InputStream inMovie=movie.getInputStream()) {
-				FileUtils.copy(inMovie, new ShieldOutputStream(zout));
+			try(InputStream inMovie=movie.getInputStream();
+					OutputStream out=new ShieldOutputStream(zout)) {
+				FileUtils.copy(inMovie, out);
 			} catch(Exception e) {
 				log.error("", e);
 			}
@@ -205,7 +207,11 @@ public class RepositoryEntryImportExport {
 		}
 		
 		zout.putNextEntry(new ZipEntry(PROPERTIES_FILE));
-		getXStream().toXML(imp, new ShieldOutputStream(zout));
+		try(OutputStream out=new ShieldOutputStream(zout)) {
+			getXStream().toXML(imp, out);
+		} catch(IOException e) {
+			log.error("", e);
+		}
 		zout.closeEntry();
 	}
 
@@ -318,37 +324,27 @@ public class RepositoryEntryImportExport {
 	 * Read previousely exported Propertiesproperties
 	 */
 	private void loadConfiguration() {
-		FileSystem fs = null;
-		try {
-			if(baseDirectory.exists()) {
-				if(baseDirectory.getName().endsWith(".zip")) {
-					fs = FileSystems.newFileSystem(baseDirectory.toPath(), null);
+		if(baseDirectory != null && baseDirectory.exists()) {
+			if(baseDirectory.getName().endsWith(".zip")) {
+				try(FileSystem fs = FileSystems.newFileSystem(baseDirectory.toPath(), null)) {
 					Path fPath = fs.getPath("/");
 					Path manifestPath = fPath.resolve("export").resolve(PROPERTIES_FILE);
-					try(InputStream inputFile = Files.newInputStream(manifestPath, StandardOpenOption.READ)) {
-						XStream xstream = getXStream();
-						repositoryProperties = (RepositoryEntryImport)xstream.fromXML(inputFile);
-					} catch(Exception e) {
-						log.error("Cannot read repo.xml im zip", e);
-					}
-				} else {
-					File inputFile = new File(baseDirectory, PROPERTIES_FILE);
-					if(inputFile.exists()) {
-						XStream xstream = getXStream();
-						repositoryProperties = (RepositoryEntryImport)xstream.fromXML(inputFile);
-					} else {
-						repositoryProperties = new RepositoryEntryImport();
-					}
+					repositoryProperties = (RepositoryEntryImport)XStreamHelper.readObject(getXStream(), manifestPath);
+				} catch(Exception e) {
+					log.error("", e);
 				}
 			} else {
-				repositoryProperties = new RepositoryEntryImport();
+				File inputFile = new File(baseDirectory, PROPERTIES_FILE);
+				if(inputFile.exists()) {
+					repositoryProperties = (RepositoryEntryImport)XStreamHelper.readObject(getXStream(), inputFile);
+				} else {
+					repositoryProperties = new RepositoryEntryImport();
+				}
 			}
-			propertiesLoaded = true;
-		} catch (Exception ce) {
-			throw new OLATRuntimeException("Error importing repository entry properties.", ce);
-		} finally {
-			IOUtils.closeQuietly(fs);
+		} else {
+			repositoryProperties = new RepositoryEntryImport();
 		}
+		propertiesLoaded = true;
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/repository/handlers/VideoHandler.java b/src/main/java/org/olat/repository/handlers/VideoHandler.java
index 5de80098b20cf2f009033204f9343dcc7e5119dd..932dd4fb53fc07d6fabec6281971229dec160e94 100644
--- a/src/main/java/org/olat/repository/handlers/VideoHandler.java
+++ b/src/main/java/org/olat/repository/handlers/VideoHandler.java
@@ -51,6 +51,7 @@ import org.olat.fileresource.types.ResourceEvaluation;
 import org.olat.fileresource.types.VideoFileResource;
 import org.olat.modules.video.VideoFormat;
 import org.olat.modules.video.VideoManager;
+import org.olat.modules.video.VideoMeta;
 import org.olat.modules.video.ui.VideoDisplayController;
 import org.olat.modules.video.ui.VideoRuntimeController;
 import org.olat.repository.RepositoryEntry;
@@ -164,14 +165,19 @@ public class VideoHandler extends FileHandler {
 		} else if (fileName.endsWith(".zip")) {
 			// 2b) import video from archive from another OpenOLAT instance
 			dbInstance.commit();
-			videoManager.importFromExportArchive(repoEntry, importFile);			
+			videoManager.importFromExportArchive(repoEntry, importFile);
+			dbInstance.commit();			
 		}	
 		// 3) Persist Meta data
-		videoManager.createVideoMetadata(repoEntry, filesize, fileName);
-		dbInstance.commit();	
+		VideoMeta videoMeta = videoManager.getVideoMetadata(resource);
+		if(videoMeta == null) {
+			videoMeta =videoManager.createVideoMetadata(repoEntry, filesize, fileName);
+		}
+		dbInstance.commit();
 		// 4) start transcoding process if enabled
-		videoManager.startTranscodingProcessIfEnabled(resource);
-		
+		if(!StringHelper.containsNonWhitespace(videoMeta.getUrl())) {
+			videoManager.startTranscodingProcessIfEnabled(resource);
+		}
 		return repoEntry;
 	}
 	
@@ -277,9 +283,7 @@ public class VideoHandler extends FileHandler {
 	@Override
 	public RepositoryEntry copy(Identity author, RepositoryEntry source,
 			RepositoryEntry target) {
-		OLATResource sourceResource = source.getOlatResource();
-		OLATResource targetResource = target.getOlatResource();
-		videoManager.copyVideo(sourceResource, targetResource);
+		videoManager.copyVideo(source, target);
 		return target;
 	}
 
diff --git a/src/test/java/org/olat/modules/video/manager/VideoMetaXStreamTest.java b/src/test/java/org/olat/modules/video/manager/VideoMetaXStreamTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..08e4b4c04cb65736d2fccfc8a2f58a2b03afd3ad
--- /dev/null
+++ b/src/test/java/org/olat/modules/video/manager/VideoMetaXStreamTest.java
@@ -0,0 +1,79 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.video.manager;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.modules.video.VideoFormat;
+import org.olat.modules.video.VideoMeta;
+import org.olat.repository.RepositoryEntry;
+import org.olat.test.JunitTestHelper;
+import org.olat.test.OlatTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 28 nov. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class VideoMetaXStreamTest extends OlatTestCase {
+	
+	private static final OLog log = Tracing.createLoggerFor(VideoMetaXStreamTest.class);
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private VideoMetadataDAO videoMetadataDao;
+	
+	@Test
+	public void writeRead_meta() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		//create metadata entries
+		VideoMeta meta = videoMetadataDao.createVideoMetadata(entry, 1500, null, VideoFormat.mp4);
+		Assert.assertNotNull(meta);
+		dbInstance.commitAndCloseSession();
+
+		byte[] content = null;
+		try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+			VideoMetaXStream.toXml(out, meta);
+			content = out.toByteArray();
+		} catch(IOException e) {
+			log.error("", e);
+		}
+		
+		Assert.assertNotNull(content);
+		
+		try(ByteArrayInputStream in = new ByteArrayInputStream(content)) {
+			VideoMeta reloadedMeta = VideoMetaXStream.fromXml(in);
+			Assert.assertNotNull(reloadedMeta);
+		} catch(IOException e) {
+			log.error("", e);
+			Assert.fail();
+		}
+	}
+}
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 384f74918937f70fd23271e9d8a12644e91681f9..2e134043af31d8d91fb620f4e099322f773424ad 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -270,6 +270,7 @@ import org.junit.runners.Suite;
 	org.olat.modules.video.manager.VideoTranscodingDAOTest.class,
 	org.olat.modules.video.manager.VideoMetadataDAOTest.class,
 	org.olat.modules.video.manager.VideoXStreamTest.class,
+	org.olat.modules.video.manager.VideoMetaXStreamTest.class,
 	org.olat.modules.video.manager.VideoManagerTest.class,
 	org.olat.modules.webFeed.manager.FeedDAOTest.class,
 	org.olat.modules.webFeed.manager.ItemDAOTest.class,