private void Worker_DoWork(object sender, DoWorkEventArgs e)
        {
            // log the start
            Logger.Log("Worker started.", EventType.Debug);

            // create vars
            var worker  = (BackgroundWorker)sender;
            var context = (SyncContext)e.Argument;

            e.Result = context;
            bool duplicates = false;

            // initialize the syncer
            context.Report(worker, Resources.SettingsForm_InitializeSync, ToolTipIcon.Info);
            var sync = new Syncronizer()
            {
                SyncProfile  = WindowsIdentity.GetCurrent().User.Value,
                SyncOption   = context.Mode,
                SyncDelete   = true,
                PromptDelete = false,
                UseFileAs    = true,
                SyncNotes    = false,
                SyncContacts = true,
            };

            sync.ErrorEncountered += (title, ex, type) =>
                                     // simply log the error (it's counted by the Syncronizer)
                                     Logger.Log(ex.Message, type);
            sync.DuplicatesFound += (title, text) =>
            {
                // log all duplicates and set the flag
                Logger.Log(text, EventType.Warning);
                duplicates = true;
            };

            // log into Google
            context.Report(worker, Resources.SettingsForm_GoogleLogon, ToolTipIcon.Info);
            sync.LoginToGoogle(context.UserName, DecodePassword(context.Password));
            try
            {
                // access Outlook
                context.Report(worker, Resources.SettingsForm_OutlookLogon, ToolTipIcon.Info);
                sync.LoginToOutlook();
                try
                {
                    // reset matches
                    if ((context.Tasks & WorkerTasks.ResetMatches) != 0)
                    {
                        context.Report(worker, Resources.SettingsForm_ResetMatches, ToolTipIcon.Info);
                        sync.LoadContacts();
                        sync.ResetContactMatches();
                    }

                    // sync
                    if ((context.Tasks & WorkerTasks.Synchronize) != 0)
                    {
                        context.Report(worker, Resources.SettingsForm_SyncContacts, ToolTipIcon.Info);
                        sync.Sync();
                    }
                }
                finally
                {
                    // log out from Outlook
                    context.Report(worker, Resources.SettingsForm_OutlookLogoff, ToolTipIcon.Info);
                    sync.LogoffOutlook();
                }
            }
            finally
            {
                // log out from Google
                context.Report(worker, Resources.SettingsForm_GoogleLogoff, ToolTipIcon.Info);
                sync.LogoffGoogle();
            }

            // finalizing
            var successful = sync.ErrorCount == 0 && sync.SkippedCountNotMatches == 0;

            context.Report
            (
                worker,
                string.Format(!successful ? Resources.SettingsForm_SyncIncomplete : duplicates ? Resources.SettingsForm_SyncSuccessfulWithDuplicates : Resources.SettingsForm_SyncSuccessful, DateTime.Now, sync.TotalCount, sync.SyncedCount, sync.DeletedCount, sync.SkippedCountNotMatches, sync.ErrorCount),
                successful ? ToolTipIcon.Info : ToolTipIcon.Warning
            );

            // log the result
            Logger.Log("Worker ended.", EventType.Debug);
        }