diff --git a/org.eclipse.opencert.apm.assurproj.edit/src/org/eclipse/opencert/apm/assurproj/assuranceproject/utils/CrossDomainUI.java b/org.eclipse.opencert.apm.assurproj.edit/src/org/eclipse/opencert/apm/assurproj/assuranceproject/utils/CrossDomainUI.java
index 5d714f7..862f639 100644
--- a/org.eclipse.opencert.apm.assurproj.edit/src/org/eclipse/opencert/apm/assurproj/assuranceproject/utils/CrossDomainUI.java
+++ b/org.eclipse.opencert.apm.assurproj.edit/src/org/eclipse/opencert/apm/assurproj/assuranceproject/utils/CrossDomainUI.java
@@ -2454,8 +2454,17 @@
 					//Copy the ArtefactModelData to destination model If it's empty
 					
 					if(amT.getRepoUrl()==null || amT.getRepoUrl().equals("")){
-						amT.setId(amF.getId());
-						amT.setName(amF.getName());
+						if(amF.getId()!=null){
+							amT.setId(amF.getId());
+						}
+						if(amF.getName()!=null){
+							amT.setName(amF.getName());							
+						}
+						else if (amT.getName()==null){
+							amT.setName ("NoNameSpecified");
+						}
+						
+						
 						amT.setRepoLocalPath(amF.getRepoLocalPath());
 						amT.setRepoPassword(amF.getRepoPassword());
 						amT.setRepoUrl(amF.getRepoUrl());
@@ -2479,6 +2488,9 @@
 						artefactModelFolderPath.mkdir();
 			       }
 					
+					if(amT.getArtefact().get(0).getName()==null){
+						amT.getArtefact().get(0).setName ("NoNameSpecified");
+					}
 					
 					File artefactDefinitionFolderPath=new File(artefactModelFolderPath.getAbsolutePath() +"/" + amT.getArtefact().get(0).getName());
 					if(!artefactDefinitionFolderPath.exists()){	           		
@@ -2494,7 +2506,13 @@
 						//Copy the resource to target artefact
 						org.eclipse.opencert.evm.evidspec.evidence.Resource copy = evidenceFactory.createResource();
 						copy.setId(fromFile.getId());
-						copy.setName(fromFile.getName());
+						if (fromFile.getName()==null){
+							fromFile.setName ("NoNameSpecified");
+						}
+						else{
+							copy.setName(fromFile.getName());
+						}
+						
 						copy.setDescription(fromFile.getDescription());
 						copy.setFormat(fromFile.getFormat());
 						
@@ -2536,8 +2554,7 @@
 					
 					String artefactModelFolderPath = "";
 					if(!repoLibrary.existsFolderRepo(projectFolderPath+"/" + amT.getName())){
-						artefactModelFolderPath = repoLibrary.addFolderToRepo(projectFolderPath,amT.getName(), "");
-						//String ArtefactDefFolderPath = repoLibrary.addFolderToRepo(ArtefactModelFolderPath,am.getArtefact().get(0).getName(), "");
+						artefactModelFolderPath = repoLibrary.addFolderToRepo(projectFolderPath,amT.getName(), "");						
 					}
 					else{
 						artefactModelFolderPath =projectFolderPath+"/"+amT.getName();
@@ -2545,9 +2562,12 @@
 							
 					
 					String artefactDefinitionFolderPath = "";
+					if(amT.getArtefact().get(0).getName()==null){
+						amT.getArtefact().get(0).setName ("NoNameSpecified");
+					}
+					
 					if(!repoLibrary.existsFolderRepo(artefactModelFolderPath + "/" + amT.getArtefact().get(0).getName())){
-						artefactDefinitionFolderPath = repoLibrary.addFolderToRepo(artefactModelFolderPath,amT.getArtefact().get(0).getName(), "");
-						//String ArtefactDefFolderPath = repoLibrary.addFolderToRepo(ArtefactModelFolderPath,am.getArtefact().get(0).getName(), "");
+						artefactDefinitionFolderPath = repoLibrary.addFolderToRepo(artefactModelFolderPath,amT.getArtefact().get(0).getName(), "");						
 					}
 					else{
 						artefactDefinitionFolderPath =artefactModelFolderPath+"/"+amT.getArtefact().get(0).getName();
@@ -2557,7 +2577,7 @@
 					String artefactFolderPath="";
 					if(!repoLibrary.existsFolderRepo(artefactDefinitionFolderPath+"/" + artTo.getName())){
 						artefactFolderPath = repoLibrary.addFolderToRepo(artefactDefinitionFolderPath,artTo.getName(), "");
-						//String ArtefactDefFolderPath = repoLibrary.addFolderToRepo(ArtefactModelFolderPath,am.getArtefact().get(0).getName(), "");
+						
 					}
 					else{
 						artefactFolderPath =artefactDefinitionFolderPath+"/" + artTo.getName();
@@ -2567,7 +2587,14 @@
 						//Copy the resource to target artefact
 						org.eclipse.opencert.evm.evidspec.evidence.Resource copy = evidenceFactory.createResource();
 						copy.setId(fromFile.getId());
-						copy.setName(fromFile.getName());
+												
+						if (fromFile.getName()==null){
+							fromFile.setName ("NoNameSpecified");
+						}
+						else{
+							copy.setName(fromFile.getName());
+						}
+						
 						copy.setDescription(fromFile.getDescription());
 						copy.setFormat(fromFile.getFormat());
 						
diff --git a/org.eclipse.opencert.apm.assurproj.reuse/src/org/eclipse/opencert/apm/assurproj/reuse/views/ReuseAssistanceView.java b/org.eclipse.opencert.apm.assurproj.reuse/src/org/eclipse/opencert/apm/assurproj/reuse/views/ReuseAssistanceView.java
index 8e8b4fd..c86c626 100644
--- a/org.eclipse.opencert.apm.assurproj.reuse/src/org/eclipse/opencert/apm/assurproj/reuse/views/ReuseAssistanceView.java
+++ b/org.eclipse.opencert.apm.assurproj.reuse/src/org/eclipse/opencert/apm/assurproj/reuse/views/ReuseAssistanceView.java
Binary files differ
diff --git a/org.eclipse.opencert.infra.svnkit/src/org/eclipse/opencert/infra/svnkit/MainClass.java b/org.eclipse.opencert.infra.svnkit/src/org/eclipse/opencert/infra/svnkit/MainClass.java
index f8d090f..12640ed 100644
--- a/org.eclipse.opencert.infra.svnkit/src/org/eclipse/opencert/infra/svnkit/MainClass.java
+++ b/org.eclipse.opencert.infra.svnkit/src/org/eclipse/opencert/infra/svnkit/MainClass.java
@@ -26,56 +26,41 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.IOException;
 import java.io.OutputStream;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
 
-import org.eclipse.ui.PlatformUI;
 import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
 import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
 import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
 import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
 import org.tmatesoft.svn.core.io.ISVNEditor;
-import org.tmatesoft.svn.core.io.ISVNFileRevisionHandler;
-import org.tmatesoft.svn.core.io.SVNFileRevision;
+
 import org.tmatesoft.svn.core.io.SVNRepository;
 
 import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
 import org.tmatesoft.svn.core.io.diff.SVNDeltaGenerator;
-import org.tmatesoft.svn.core.io.diff.SVNDiffWindow;
 import org.tmatesoft.svn.core.wc.SVNWCUtil;
 import org.tmatesoft.svn.core.*;
 
 public class MainClass {
 
-	
-
 
 	//private static final String LOCAL_REPO_PROTOCOL = "file:///";
 	private static final int EXCEPTION = 3;
 	private static final int URL_NOT_FILE = 2;
 	private static final int INCORRECT_URL = 1;
-	private static final int NO_ERROR = 0;
-	private static final String SVNInfo_REPOSITORY_TYPE = "OPENCERT_SVN_REPOSITORY_TYPE";
-	private static final String SVNInfo_LOCAL_REPOSITORY_URL = "OPENCERT_SVN_LOCAL_REPOSITORY_URL";
-	private static final String SVNInfo_REMOTE_REPOSITORY_URL = "OPENCERT_SVN_REMOTE_REPOSITORY_URL";
-	private static final String SVNInfo_USER = "OPENCERT_SVN_USER";
-	private static final String SVNInfo_PASS = "OPENCERT_SVN_PASS";
-	
+	private static final int NO_ERROR = 0;	
+
 	private SVNRepository repository=null;
-	         
-	
+
 
 	public MainClass() {		
 	}
-	
+
 	public void deleteFile(String filePath) {
 
 		try {
@@ -87,28 +72,28 @@
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}  
-		
+
 	}
 
 
 	public int connectRepository(String urlCon,String name, String password){
 		//boolean useLocalRepository = PlatformUI.getPreferenceStore().getBoolean(SVNInfo_REPOSITORY_TYPE);
-		
+
 		//String name ="";
 		//String password ="";
-		
-		
-		
+
+
+
 		//if(useLocalRepository){
 		//	urlCon = LOCAL_REPO_PROTOCOL + urlCon;
 		//}
-			
+
 		/*
 		 * initializes the library (it must be done before ever using the
 		 * library itself)
 		 */
 		setupLibrary();
-		
+
 		try {
 
 			repository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(urlCon));
@@ -123,13 +108,13 @@
 
 		ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);
 		repository.setAuthenticationManager(authManager);									
-		
-		
+
+
 		return NO_ERROR;
 	}
-	
+
 	public int checkPath(String urlCon){
-	
+
 		/*
 		 * Checks up if the specified path/to/repository part of the URL
 		 * really corresponds to a directory. If doesn't the program exits.
@@ -150,12 +135,12 @@
 			// TODO Auto-generated catch block
 			return EXCEPTION;
 		}
-		
+
 	}
-	
-	
+
+
 	public boolean existsFileRepo(String localPath){
-		
+
 		// paranoia
 		if (repository == null) {
 			return false;
@@ -164,7 +149,7 @@
 		//Read the file Bytes
 		//File file = new File(localPath);
 		//String name=file.getName();
-		
+
 		try {
 			SVNNodeKind nodeKind = repository.checkPath(localPath, -1);
 			if (nodeKind == SVNNodeKind.FILE) {				
@@ -172,20 +157,20 @@
 			} else {				
 				return false;
 			}
-			
+
 		} catch (SVNException e) {
 			// TODO Auto-generated catch block
 			return true;
 		}
-		
+
 	}
-	
-public boolean existsFolderRepo(String localPath){
-		
+
+	public boolean existsFolderRepo(String localPath){
+
 		//Read the file Bytes
 		//File file = new File(localPath);
 		//String name=file.getName();
-		
+
 		try {
 			SVNNodeKind nodeKind = repository.checkPath(localPath, -1);
 			if (nodeKind == SVNNodeKind.DIR) {				
@@ -193,14 +178,14 @@
 			} else {				
 				return false;
 			}
-			
+
 		} catch (SVNException e) {
 			// TODO Auto-generated catch block
 			return false;
 		}
-		
+
 	}
-	
+
 	public  ArrayList<String> getFileHistory(String filePath) {
 		//Get file de history
 		ArrayList<String> entriesList=new ArrayList<String>();
@@ -218,7 +203,7 @@
 					entriesList.add(historyRev);			
 				}			
 			}
-			
+
 		} catch (SVNException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
@@ -249,7 +234,7 @@
 				return fullPath;
 			}
 			return "";
-			
+
 		} catch (Exception e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
@@ -257,25 +242,25 @@
 		}    
 
 	}
-		
+
 	public String copyFileFromRepo(String sourceURI, String targetFolderURI, String comment) {
 		String tempFile = getFileFromRepo(sourceURI);
 		if(tempFile.equals("exists")){
 			return tempFile;
 		}
 		String finalLocation=  addFileToRepo(tempFile, targetFolderURI,comment); 
-		
+
 		return finalLocation;
 	}
-	
-	
+
+
 	public String updateFileFromRepo(String sourceURI, String targetFolderURI, String comment) {
 		String tempFile = getFileFromRepo(sourceURI);
 		if(tempFile.equals("exists")){
 			return tempFile;
 		}
 		String finalLocation=  changeRepoFile(tempFile, targetFolderURI,comment); 
-		
+
 		return finalLocation;
 	}
 
@@ -283,7 +268,7 @@
 		ISVNEditor editor = null;
 		try {	
 			editor = repository.getCommitEditor( comment , null );
-			
+
 			//Read the file Bytes
 			File file = new File(localPath);
 			byte [] contentsNew = new byte[(int)file.length()];
@@ -291,7 +276,7 @@
 			dis.readFully(contentsNew);
 			dis.close();
 			String remotePath=destinationDir + "/" + file.getName();
-			
+
 			editor.openRoot(-1);
 			//editor.openDir(destinationDir, -1);
 			editor.openFile(remotePath, -1);
@@ -310,7 +295,7 @@
 
 			return remotePath;
 
-			
+
 		} catch ( Exception svne ) {
 			svne.printStackTrace();
 			try {
@@ -322,63 +307,57 @@
 			return  "An error has occurred updating the file to the Repository";
 		}
 
-	}
+	} 
 
 	public String addFolderToRepo(String destinationDir, String newFolderName, String comment) {
-		
+
 
 		ISVNEditor editor = null;
-	try {	
-		
-				
-		if(existsFolderRepo(destinationDir + "/" + newFolderName)){
-			return "exists";
-		}
-		
-		editor = repository.getCommitEditor(comment , null );			
-		
-		editor.openRoot(-1);
-		editor.openDir(destinationDir, -1);
-		
-		editor.addDir(newFolderName,null, -1);		
+		try {									
 
-		editor.closeDir();
+			editor = repository.getCommitEditor(comment , null );			
 
-		//Suuuper importante, sino se cierra no se genera nada en el Repo
-		editor.closeEdit();
-								
-		//Erase the first / character
-		String returnString = destinationDir + "/" + newFolderName;
-		if(returnString.startsWith("/")){
-			returnString= returnString.substring(1);
+			editor.openRoot(-1);
+			editor.openDir(destinationDir, -1);
+			//final long latestRevision = repository.getLatestRevision();
+			editor.addDir(newFolderName,null, -1);		
+
+			editor.closeDir();
+
+			//Suuuper importante, sino se cierra no se genera nada en el Repo
+			editor.closeEdit();
+
+			//Erase the first / character
+			String returnString = destinationDir + "/" + newFolderName;
+			if(returnString.startsWith("/")){
+				returnString= returnString.substring(1);
+			}
+			return returnString;
+		} catch ( Exception svne ) {
+			svne.printStackTrace();
+			try {
+				editor.abortEdit( );
+			} catch (SVNException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			return "An error has occurred adding the folder to the Repository";
 		}
-		return returnString;
-	} catch ( Exception svne ) {
-		svne.printStackTrace();
-		try {
-			editor.abortEdit( );
-		} catch (SVNException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return "An error has occurred adding the folder to the Repository";
 	}
-}
-	
-	public String addFileToRepo(String localPath, String destinationDir, String comment) {
-		
 
-			ISVNEditor editor = null;
+	public String addFileToRepo(String localPath, String destinationDir, String comment) {
+
+		ISVNEditor editor = null;
 		try {	
 			File file = new File(localPath);
 			String remotePath= file.getName();
-			
+
 			if(existsFileRepo(destinationDir + "/" + remotePath)){
 				return "exists";
 			}
-			
+
 			editor = repository.getCommitEditor( comment , null );
-			
+
 			//Read the file Bytes
 			//File file = new File(localPath);
 			byte [] fileData = new byte[(int)file.length()];
@@ -386,9 +365,9 @@
 			dis.readFully(fileData);
 			dis.close();
 			//String remotePath= file.getName();
-			
+
 			//byte[] contents = "This is a new file".getBytes();
-			
+
 			editor.openRoot(-1);
 			editor.openDir(destinationDir, -1);
 			//editor.addDir(dir,null, -1);
@@ -408,7 +387,7 @@
 
 			//Suuuper importante, sino se cierra no se genera nada en el Repo
 			editor.closeEdit();
-									
+
 			//Erase the first / character
 			return destinationDir + "/" + remotePath;
 		} catch ( Exception svne ) {
