diff --git a/MahApps.Metro/Controls/Dialogs/DialogCoordinator.cs b/MahApps.Metro/Controls/Dialogs/DialogCoordinator.cs
new file mode 100644
index 0000000000..647c2653e0
--- /dev/null
+++ b/MahApps.Metro/Controls/Dialogs/DialogCoordinator.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace MahApps.Metro.Controls.Dialogs
+{
+ public class DialogCoordinator : IDialogCoordinator
+ {
+ ///
+ /// Gets the default instance if the dialog coordinator, which can be injected into a view model.
+ ///
+ public static readonly DialogCoordinator Instance = new DialogCoordinator();
+
+ public Task ShowInputAsync(object context, string title, string message, MetroDialogSettings metroDialogSettings = null)
+ {
+ var metroWindow = GetMetroWindow(context);
+
+ return metroWindow.ShowInputAsync(title, message, metroDialogSettings);
+ }
+
+ public Task ShowLoginAsync(object context, string title, string message, MessageDialogStyle style = MessageDialogStyle.Affirmative, LoginDialogSettings settings = null)
+ {
+ var metroWindow = GetMetroWindow(context);
+
+ return metroWindow.ShowLoginAsync(title, message, settings);
+ }
+
+ public Task ShowMessageAsync(object context, string title, string message, MessageDialogStyle style = MessageDialogStyle.Affirmative, MetroDialogSettings settings = null)
+ {
+ var metroWindow = GetMetroWindow(context);
+
+ return metroWindow.ShowMessageAsync(title, message, style, settings);
+ }
+
+ public Task ShowProgressAsync(object context, string title, string message,
+ bool isCancelable = false, MetroDialogSettings settings = null)
+ {
+ var metroWindow = GetMetroWindow(context);
+
+ return metroWindow.ShowProgressAsync(title, message, isCancelable, settings);
+ }
+
+ public Task ShowMetroDialogAsync(object context, BaseMetroDialog dialog,
+ MetroDialogSettings settings = null)
+ {
+ var metroWindow = GetMetroWindow(context);
+
+ return metroWindow.ShowMetroDialogAsync(dialog, settings);
+ }
+
+ public Task HideMetroDialogAsync(object context, BaseMetroDialog dialog, MetroDialogSettings settings = null)
+ {
+ var metroWindow = GetMetroWindow(context);
+
+ return metroWindow.HideMetroDialogAsync(dialog, settings);
+ }
+
+ public Task GetCurrentDialogAsync(object context) where TDialog : BaseMetroDialog
+ {
+ var metroWindow = GetMetroWindow(context);
+
+ return metroWindow.GetCurrentDialogAsync();
+ }
+
+ private static MetroWindow GetMetroWindow(object context)
+ {
+ if (context == null) throw new ArgumentNullException("context");
+ if (!DialogParticipation.IsRegistered(context))
+ throw new InvalidOperationException(
+ "Context is not registered. Consider using DialogParticipation.Register in XAML to bind in the DataContext.");
+
+ var association = DialogParticipation.GetAssociation(context);
+ var metroWindow = Window.GetWindow(association) as MetroWindow;
+
+ if (metroWindow == null)
+ throw new InvalidOperationException("Control is not inside a MetroWindow.");
+ return metroWindow;
+ }
+ }
+}
\ No newline at end of file
diff --git a/MahApps.Metro/Controls/Dialogs/DialogParticipation.cs b/MahApps.Metro/Controls/Dialogs/DialogParticipation.cs
new file mode 100644
index 0000000000..a369e31f4d
--- /dev/null
+++ b/MahApps.Metro/Controls/Dialogs/DialogParticipation.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Windows;
+
+namespace MahApps.Metro.Controls.Dialogs
+{
+ public static class DialogParticipation
+ {
+ private static readonly IDictionary