public async Task UpdateTemplateAsync()
        {
            var selection = SelectedTemplate;

            Debug.Assert(selection != null);
            if (selection == null)
            {
                throw new InvalidOperationException("UpdateTemplateAsync called with null SelectedTemplate");
            }

            ResetStatus();

            try {
                UpdatingStatus = OperationStatus.InProgress;

                _outputWindow.ShowAndActivate();
                _outputWindow.WriteLine(String.Empty);
                _outputWindow.WriteLine(Strings.UpdatingTemplateStarted.FormatUI(selection.DisplayName));

                await _installedSource.UpdateTemplateAsync(selection.ClonedPath);

                selection.IsUpdateAvailable = false;

                UpdatingStatus = OperationStatus.Succeeded;

                _outputWindow.WriteLine(Strings.UpdatingTemplateSuccess.FormatUI(selection.DisplayName, selection.ClonedPath));

                ReportTemplateEvent(CookiecutterTelemetry.TelemetryArea.Template, CookiecutterTelemetry.TemplateEvents.Update, selection);
            } catch (Exception ex) when(!ex.IsCriticalException())
            {
                UpdatingStatus = OperationStatus.Failed;

                _outputWindow.WriteErrorLine(ex.Message);
                _outputWindow.WriteLine(Strings.UpdatingTemplateFailed.FormatUI(selection.DisplayName));

                ReportTemplateEvent(CookiecutterTelemetry.TelemetryArea.Template, CookiecutterTelemetry.TemplateEvents.Update, selection, ex);
            }
        }