diff --git a/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.App.sln b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.App.sln
new file mode 100644
index 00000000..b503a762
--- /dev/null
+++ b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.App.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31612.314
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Caliburn.Micro.Tutorial.Wpf", "Caliburn.Micro.Tutorial.Wpf\Caliburn.Micro.Tutorial.Wpf.csproj", "{91C89E27-E316-4117-85D0-5B7DA2AC3939}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {91C89E27-E316-4117-85D0-5B7DA2AC3939}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {91C89E27-E316-4117-85D0-5B7DA2AC3939}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91C89E27-E316-4117-85D0-5B7DA2AC3939}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {91C89E27-E316-4117-85D0-5B7DA2AC3939}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {7EFDF5AC-4D67-47F0-BA20-395AC9E897F9}
+ EndGlobalSection
+EndGlobal
diff --git a/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/App.xaml b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/App.xaml
new file mode 100644
index 00000000..ba5ad623
--- /dev/null
+++ b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/App.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/App.xaml.cs b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/App.xaml.cs
new file mode 100644
index 00000000..ebc0cc0e
--- /dev/null
+++ b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/App.xaml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Caliburn.Micro.Tutorial.Wpf
+ {
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+ }
diff --git a/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/AssemblyInfo.cs b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/AssemblyInfo.cs
new file mode 100644
index 00000000..8b5504ec
--- /dev/null
+++ b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+using System.Windows;
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
diff --git a/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/Bootstrapper.cs b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/Bootstrapper.cs
new file mode 100644
index 00000000..dc656bbc
--- /dev/null
+++ b/samples/tutorals/WPF/Wpf.Tutorial/Caliburn.Micro.Tutorial.Wpf/Bootstrapper.cs
@@ -0,0 +1,65 @@
+using System.Collections.Generic;
+using System;
+using System.Linq;
+using System.Windows;
+using Caliburn.Micro.Tutorial.Wpf.ViewModels;
+using System.Diagnostics;
+
+namespace Caliburn.Micro.Tutorial.Wpf
+ {
+ public class Bootstrapper: BootstrapperBase
+ {
+ private readonly SimpleContainer _container = new SimpleContainer();
+
+ public Bootstrapper()
+ {
+ Initialize();
+ StartDebugLogger();
+ }
+
+ // [Conditional("DEBUG")] You can use this conditional starting with C# 9.0
+ public static void StartDebugLogger()
+ {
+ LogManager.GetLog = type => new DebugLog(type);
+ }
+
+ protected override void Configure()
+ {
+ _container.Instance(_container);
+ _container
+ .Singleton()
+ .Singleton();
+
+ foreach(var assembly in SelectAssemblies())
+ {
+ assembly.GetTypes()
+ .Where(type => type.IsClass)
+ .Where(type => type.Name.EndsWith("ViewModel"))
+ .ToList()
+ .ForEach(viewModelType => _container.RegisterPerRequest(
+ viewModelType, viewModelType.ToString(), viewModelType));
+ }
+ }
+
+ protected override async void OnStartup(object sender, StartupEventArgs e)
+ {
+ var c= IoC.Get();
+ await DisplayRootViewForAsync(typeof(ShellViewModel));
+ }
+
+ protected override object GetInstance(Type service, string key)
+ {
+ return _container.GetInstance(service, key);
+ }
+
+ protected override IEnumerable