/// <summary>
        /// Installation of image is complete (or failed)
        /// </summary>
        private void ProcessInstallImage(Task downloadTask, SdkSystemImage image, string path)
        {
            if (downloadTask.Exception != null)
            {
                SuspendLayout();
                progress.Visible   = false;
                lbProgress.Visible = false;
                ResumeLayout(true);
                UpdateControlState();

                // Show error
                var msg = string.Format("Failed to install system image because {0}", downloadTask.Exception.Message);
                MessageBoxEx.Show(msg, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                // We're done
                Done.Fire(this);
            }
        }
        /// <summary>
        /// Download image is complete (or failed)
        /// </summary>
        private void ProcessDownloadImage(Task downloadTask, SdkSystemImage image, string path)
        {
            if (downloadTask.Exception != null)
            {
                SuspendLayout();
                progress.Visible   = false;
                lbProgress.Visible = false;
                ResumeLayout(true);
                UpdateControlState();

                // Show error
                var msg = string.Format("Failed to download system image because {0}", downloadTask.Exception.Message);
                MessageBoxEx.Show(msg, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                // Install image
                lbProgress.Text = string.Format("Installing {0}...", image.Description);
                var ui   = TaskScheduler.FromCurrentSynchronizationContext();
                var task = Task.Factory.StartNew(() => SystemImages.Instance.Install(image, path));
                task.ContinueWith(x => ProcessInstallImage(x, image, path), ui);
            }
        }
        /// <summary>
        /// Installation of image is complete (or failed)
        /// </summary>
        private void ProcessInstallImage(Task downloadTask, SdkSystemImage image, string path)
        {
            if (downloadTask.Exception != null)
            {
                SuspendLayout();
                progress.Visible = false;
                lbProgress.Visible = false;
                ResumeLayout(true);
                UpdateControlState();

                // Show error
                var msg = string.Format("Failed to install system image because {0}", downloadTask.Exception.Message);
                MessageBoxEx.Show(msg, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                // We're done
                Done.Fire(this);
            }
        }
        /// <summary>
        /// Download image is complete (or failed)
        /// </summary>
        private void ProcessDownloadImage(Task downloadTask, SdkSystemImage image, string path)
        {
            if (downloadTask.Exception != null)
            {
                SuspendLayout();
                progress.Visible = false;
                lbProgress.Visible = false;
                ResumeLayout(true);
                UpdateControlState();

                // Show error
                var msg = string.Format("Failed to download system image because {0}", downloadTask.Exception.Message);
                MessageBoxEx.Show(msg, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                // Install image
                lbProgress.Text = string.Format("Installing {0}...", image.Description);
                var ui = TaskScheduler.FromCurrentSynchronizationContext();
                var task = Task.Factory.StartNew(() => SystemImages.Instance.Install(image, path));
                task.ContinueWith(x => ProcessInstallImage(x, image, path), ui);
            }
        }