public bool CloneNetwork(NetworkViewModel viewModel, List <string> usedEntityNames) { if (viewModel.CurrentStatus != ServerStatus.STOPPED) { StopNetwork(viewModel, false); while (viewModel.CurrentStatus != ServerStatus.STOPPED) { Thread.Sleep(500); } } try { DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(App.ServerPath, viewModel.Name)); if (!directoryInfo.Exists) { ErrorLogger.Append( new DirectoryNotFoundException("Could not find Directory " + directoryInfo.FullName)); return(false); } string newName = RefineName(viewModel.Name + "-Clone", usedEntityNames); //Better to use a object copy function string oldNetworkJson = JsonConvert.SerializeObject(viewModel.Network); Network newNetwork = JsonConvert.DeserializeObject <Network>(oldNetworkJson); newNetwork.Name = newName; newNetwork.UID = Guid.NewGuid().ToString(); NetworkViewModel newNetworkViewModel = new NetworkViewModel(newNetwork); string newNetworkPath = Path.Combine(App.ServerPath, newName); newNetworkViewModel.StartImport(); Application.Current.Dispatcher?.Invoke(() => ServerManager.Instance.Entities.Add(newNetworkViewModel)); ApplicationManager.Instance.MainViewModel.SelectedEntity = newNetworkViewModel; //Create server directory Directory.CreateDirectory(newNetworkPath); //Import server files Thread copyThread = new Thread(() => { FileImporter fileImporter = new FileImporter(); fileImporter.CopyProgressChanged += newNetworkViewModel.CopyProgressChanged; fileImporter.DirectoryCopy(directoryInfo.FullName, newNetworkPath, true, new List <string> { "server.jar" }); Console.WriteLine("Finished copying server files for server " + newNetworkPath); newNetworkViewModel.FinishedCopying(); }); copyThread.Start(); return(true); } catch (Exception e) { ErrorLogger.Append(e); return(false); } }