protected override void doWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            base.doWork(sender, e);

            path_candidates = new SimpleModel<LocationPath>();
            user_candidates = new SimpleModel<string>();

            ProgressHandler.state = ProgressState.Indeterminate;
            try {
                if (archive == null) {
                }
            } catch (Exception ex) {
                TranslatingMessageHandler.SendException(ex);
            }

            if (ArgArchives.Count > 0)
                archive = new Archive(new FileInfo(ArgArchives.Dequeue()));

            if (archive == null)
                throw new TranslateableException("NoRestoreFileSelected");

            TranslatingProgressHandler.setTranslatedMessage("DetectingGameForRestoration");

            if (!archive.Exists)
                throw new TranslateableException("FileNotFound", archive.ArchivePath);

            GameID selected_game = archive.id.Game;
            string backup_owner = archive.id.Owner;
            string archive_type = archive.id.Type;

            try {
                game_data = Games.detectGame(selected_game);
            } catch (Exception ex) {
                TranslatingMessageHandler.SendException(ex);
            }

            NotifyPropertyChanged("GameNotDetected");

            if (game_data != null) {
                // This adds hypothetical locations
                foreach (LocationPath location in game_data.Locations.Paths) {
                    if (game_data.DetectionRequired)
                        break;

                    filterPathCandidates(location);
                }

                // This add already found locations
                foreach (DetectedLocationPathHolder location in game_data.DetectedLocations) {
                    location.IsSelected = true;
                    switch (location.EV) {
                        case EnvironmentVariable.ProgramFiles:
                        case EnvironmentVariable.ProgramFilesX86:
                            // This adds a fake VirtualStore folder, just in case
                            if (Core.locations.uac_enabled) {
                                DetectedLocationPathHolder temp = new DetectedLocationPathHolder(location, Core.locations.getFolder(EnvironmentVariable.LocalAppData, location.owner), location.owner);
                                temp.ReplacePath(Path.Combine("VirtualStore", location.FullDirPath.Substring(3)));
                                temp.EV = EnvironmentVariable.LocalAppData;
                                addPathCandidate(temp);
                            }
                            addPathCandidate(location);
                            break;
                        default:
                            addPathCandidate(location);
                            break;
                    }
                }

                //if (archive.id.Game.OS!=null&&archive.id.Game.OS.StartsWith("PS")) {

                //    foreach (string drive in Core.locations.ps.GetDriveCandidates()) {
                //        DetectedLocationPathHolder loc = new DetectedLocationPathHolder(EnvironmentVariable.Drive, drive, null);
                //            addPathCandidate(loc);
                //    }
                //}
            }

            if (archive.id.OriginalEV != EnvironmentVariable.None &&
                archive.id.OriginalRelativePath != null) {
                LocationPath path = new LocationPath(archive.id.OriginalEV, archive.id.OriginalRelativePath);
                filterPathCandidates(path);
            }

            if (archive.id.OriginalLocation != null) {
                DetectedLocations locs = Core.locations.interpretPath(archive.id.OriginalLocation);
                DetectedLocationPathHolder loc = locs.getMostAccurateLocation();
                if (loc != null) {
                    addPathCandidate(loc);
                }
            }

            if (path_candidates.Count == 1) {
                multiple_paths = false;
                NotifyPropertyChanged("only_path");
            } else if (path_candidates.Count > 1) {
                multiple_paths = true;
            } else {
                throw new TranslateableException("NoRestorePathsDetected", this.archive.id.ToString());
            }
        }