internal void Start(string newFileName)
        {
            this.Show();

            Task.Factory.StartNew(() =>
            {
                try
                {
                    ReportProgress(0, "Preparing deobfuscation");
                    obfuscationFile.DeobfuscateBegin();

                    ReportProgress(20, "Deobfuscating");
                    obfuscationFile.Deobfuscate();

                    ReportProgress(40, "Finishing deobfuscation");
                    obfuscationFile.DeobfuscateEnd();

                    ReportProgress(60, "Renaming items");
                    // turn all flags on
                    RenamerFlags flags = RenamerFlags.DontCreateNewParamDefs | RenamerFlags.DontRenameDelegateFields | RenamerFlags.RenameEvents |
                                         RenamerFlags.RenameFields | RenamerFlags.RenameGenericParams | RenamerFlags.RenameMethodArgs |
                                         RenamerFlags.RenameMethods | RenamerFlags.RenameNamespaces | RenamerFlags.RenameProperties |
                                         RenamerFlags.RenameTypes | RenamerFlags.RestoreEvents | RenamerFlags.RestoreEventsFromNames |
                                         RenamerFlags.RestoreProperties | RenamerFlags.RestorePropertiesFromNames;
                    Renamer renamer = new Renamer(obfuscationFile.DeobfuscatorContext, new IObfuscatedFile[] { obfuscationFile }, flags);
                    renamer.Rename();

                    ReportProgress(80, "Saving");
                    obfuscationFile.Save();
                }
                finally
                {
                    obfuscationFile.DeobfuscateCleanUp();
                }
            })
            .ContinueWith(t =>
            {
                ReportProgress(100, "Done");

                if (t.Status == TaskStatus.Faulted)
                {
                    MessageBox.Show(t.Exception.InnerExceptions[0].Message);
                }
                else if (t.Status == TaskStatus.RanToCompletion)
                {
                    ReportProgress(100, "Assembly cleaned");

                    if (MessageBox.Show(Application.Current.MainWindow, "Would you like to load the cleaned assembly?", string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                    {
                        this.assemblyManager.LoadAssembly(newFileName);
                    }
                }
                this.Close();
            }, TaskScheduler.FromCurrentSynchronizationContext());
        }