private async void btnImportPartners_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Are you sure you want to import partnerships from your MyJohnDeere account?  Existing partners will be updated and no partners will be deleted.", "Import Partners", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                List <Partner>      results      = null;
                ImportPartnerResult importResult = new ImportPartnerResult();
                showLoadingMessage("Retrieving partnership data");

                await Task.Run(async() => { importResult = await DataHelper.ImportPartners(results, remoteDataRepository, true); });

                if (importResult.Status == ImportStatus.SUCCESS)
                {
                    await loadPartnerGrid();
                }
                else
                {
                    MessageBox.Show(importResult.Message);
                }

                hideLoadingMessage();
            }
        }
        /// <summary>
        /// Initiates the update of local partnerships and then downloads files for
        /// relevant partners
        /// </summary>
        /// <returns></returns>
        private async Task executeDownload()
        {
            DateTime startTime = DateTime.Now;

            if (!downloadRunning)
            {
                Logger.Log("INFO", "Starting download");

                downloadRunning = true;
                extractErrors   = 0;
                //kick off process to download all files
                List <Partner>      results      = null;
                string              message      = "";
                ImportPartnerResult importResult = new ImportPartnerResult();

                //first check for new partner relationships
                this.Invoke((MethodInvoker) delegate
                {
                    lblStatusValue.Text      = "Getting download information...";
                    lblStatusValue.ForeColor = Color.Green;
                });

                await Task.Run(async() =>
                {
                    try
                    {
                        using (IUnitOfWorkDataProvider dp = AppStorage.GetUnitOfWorkDataProvider())
                        {
                            //save last download time at beginning so another download doesn't start if
                            //process takes longer
                            dp.Settings.UpdateSettingWithKey(SettingKeyType.LastDownload, startTime.ToString());
                            dp.SaveChanges();
                        }

                        //TODO: NEED A WAY TO PROPAGATE MESSAGE BACK TO SCREEN
                        importResult = await DataHelper.ImportPartners(results, remoteDataRepository, false);
                    }
                    catch (Exception exc)
                    {
                        extractErrors++;
                        Logger.Log(exc);
                    }
                });


                await Task.Run(async() =>
                {
                    try
                    {
                        using (IUnitOfWorkDataProvider dp = AppStorage.GetUnitOfWorkDataProvider())
                        {
                            downloadFolder  = dp.Settings.GetDownloadFolder().TrimEnd('\\') + "\\";
                            downloadFolder += "temp\\";

                            //clean up previous download attempt
                            if (System.IO.Directory.Exists(downloadFolder))
                            {
                                System.IO.Directory.Delete(downloadFolder, true);
                            }

                            int fileCountOld = dp.OutputFiles.FileCount();
                            batchNumber      = dp.SourceFiles.GetNextBatchNumber();
                            var orgIds       = dp.Organizations.GetAll().Select(o => o.RemoteID).ToArray();
                            var fileIds      = dp.SourceFiles.GetFileIds();

                            List <OrgFileETag> savedETags = new List <OrgFileETag>();
                            var orgs = dp.Organizations.GetAll();
                            foreach (var o in orgs)
                            {
                                savedETags.Add(new OrgFileETag {
                                    OrgId = o.RemoteID, CreatedDate = o.FilesETagDate, Tag = o.FilesETag
                                });
                            }

                            Logger.Log("INFO", "Start download all files.");
                            var updatedETags = await remoteDataRepository.DownloadOrganizationFiles(savedETags, downloadFolder, orgIds, fileIds, FileDownloaded, DownloadProgress, FileDownloadError);
                            Logger.Log("INFO", "Finished download all files.");

                            //update organization record with new file eTags
                            foreach (var o in orgs)
                            {
                                var tag = updatedETags.SingleOrDefault(t => t.OrgId == o.RemoteID);
                                if (tag != null)
                                {
                                    o.FilesETag     = tag.Tag;
                                    o.FilesETagDate = tag.CreatedDate;
                                }
                            }
                            dp.SaveChanges();

                            int fileCountNew = dp.OutputFiles.FileCount();

                            Logger.Log("INFO", "Old file count: " + fileCountOld.ToString());
                            Logger.Log("INFO", "New file count: " + fileCountNew.ToString());

                            if (System.IO.Directory.Exists(downloadFolder))
                            {
                                System.IO.Directory.Delete(downloadFolder, true);
                            }

                            if (fileCountNew > fileCountOld)
                            {
                                OnNewFilesDownloaded(new EventArgs());
                            }
                        }
                    }
                    catch (Exception exc)
                    {
                        extractErrors++;
                        Logger.Log(exc);
                    }
                });

                await LoadRecentFilesAsync();

                this.Invoke((MethodInvoker) delegate
                {
                    lblNextDownloadValue.Text = "--";
                    if (extractErrors > 0)
                    {
                        lblStatusValue.Text      = "Completed with errors at " + DateTime.Now.ToString();
                        lblStatusValue.ForeColor = Color.Red;
                    }
                    else
                    {
                        lblStatusValue.Text      = "Completed successfully at " + DateTime.Now.ToString();
                        lblStatusValue.ForeColor = Color.Green;
                    }
                });

                downloadRunning = false;
            }
        }