diff --git a/Duality.sln b/Duality.sln
index 3d89ae1f3..01610d4b4 100644
--- a/Duality.sln
+++ b/Duality.sln
@@ -102,6 +102,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DualityPhysics", "Source\Co
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleRunner", "Samples\SampleRunner\SampleRunner.csproj", "{A9B86395-ED96-4695-8A18-548301524B42}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DualityTemplates", "Source\DualityTemplates\DualityTemplates.csproj", "{3AB26D57-70D9-40DE-B12D-6B1489035805}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -260,6 +262,10 @@ Global
{A9B86395-ED96-4695-8A18-548301524B42}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A9B86395-ED96-4695-8A18-548301524B42}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A9B86395-ED96-4695-8A18-548301524B42}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3AB26D57-70D9-40DE-B12D-6B1489035805}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3AB26D57-70D9-40DE-B12D-6B1489035805}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3AB26D57-70D9-40DE-B12D-6B1489035805}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3AB26D57-70D9-40DE-B12D-6B1489035805}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Source/DualityTemplates/DualityTemplates.csproj b/Source/DualityTemplates/DualityTemplates.csproj
new file mode 100644
index 000000000..f64319b0c
--- /dev/null
+++ b/Source/DualityTemplates/DualityTemplates.csproj
@@ -0,0 +1,63 @@
+
+
+
+ Template
+ AdamsLair.Duality.Templates
+ Duality Templates
+ Rick van Dam
+ Templates to use with the Duality game engine
+ dotnet-new;templates;duality
+ netstandard2.0
+ false
+ $(MSBuildProjectDirectory)/bin
+ true
+ false
+ content
+ 4.0.0-alpha
+ https://www.duality2d.net/
+ https://github.com/AdamsLair/duality
+ MIT
+ false
+ None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Never
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/.gitignore b/Source/DualityTemplates/Templates/SolutionTemplate/.gitignore
new file mode 100644
index 000000000..1ebd818bf
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/.gitignore
@@ -0,0 +1,18 @@
+# Build output files
+**/bin
+**/obj
+
+# Duality specific files
+/Temp
+/Backup
+/UserData.dat
+/DesignTimeData.dat
+*.pdb
+/*.dll
+/*.exe
+/*.txt
+/*.xml
+/Plugins
+
+# Visual studio specific files
+Source/.vs
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/.template.config/template.json b/Source/DualityTemplates/Templates/SolutionTemplate/.template.config/template.json
new file mode 100644
index 000000000..9b8254677
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/.template.config/template.json
@@ -0,0 +1,28 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Rick van Dam",
+ "classifications": [ "Duality" ],
+ "identity": "DualitySolutionTemplate",
+ "name": "DualitySolutionTemplate",
+ "shortName": "dualitySolution",
+ "sourceName": "DualityGame",
+ "tags": {
+ "language": "C#"
+ },
+ "postActions": [
+ {
+ "actionId": "3A7C4B45-1F5D-4A30-959A-51B88E82B5D2",
+ "args": {
+ "executable": "dotnet",
+ "args": "build Source"
+ },
+ "manualInstructions": [
+ {
+ "text": "Builds the solution using dotnet build'"
+ }
+ ],
+ "continueOnError": false,
+ "description ": "runs the build"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Directory.Build.props b/Source/DualityTemplates/Templates/SolutionTemplate/Directory.Build.props
new file mode 100644
index 000000000..c54c9362f
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Directory.Build.props
@@ -0,0 +1,5 @@
+
+
+ $(MSBuildThisFileDirectory)
+
+
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/DualityGame.sln b/Source/DualityTemplates/Templates/SolutionTemplate/Source/DualityGame.sln
new file mode 100644
index 000000000..a72db313c
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/DualityGame.sln
@@ -0,0 +1,49 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29911.84
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GameLauncher", "Launchers\GameLauncher\GameLauncher.csproj", "{EB32E368-2C3C-444F-9F7A-C808C03D462E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GameEditor", "Launchers\GameEditor\GameEditor.csproj", "{E587311C-714A-4078-ADAE-EC00E8D971CB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DualityGameCorePlugin", "Plugins\DualityGameCorePlugin\DualityGameCorePlugin.csproj", "{E77740F1-234A-4B92-B1BC-43AD9EB9BA03}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{F75B2813-797D-44A5-A301-331C229992C7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DualityGameEditorPlugin", "Plugins\DualityGameEditorPlugin\DualityGameEditorPlugin.csproj", "{F0DCA20C-6888-4294-97C4-14C82B4DBC82}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {EB32E368-2C3C-444F-9F7A-C808C03D462E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EB32E368-2C3C-444F-9F7A-C808C03D462E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EB32E368-2C3C-444F-9F7A-C808C03D462E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EB32E368-2C3C-444F-9F7A-C808C03D462E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E587311C-714A-4078-ADAE-EC00E8D971CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E587311C-714A-4078-ADAE-EC00E8D971CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E587311C-714A-4078-ADAE-EC00E8D971CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E587311C-714A-4078-ADAE-EC00E8D971CB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E77740F1-234A-4B92-B1BC-43AD9EB9BA03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E77740F1-234A-4B92-B1BC-43AD9EB9BA03}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E77740F1-234A-4B92-B1BC-43AD9EB9BA03}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E77740F1-234A-4B92-B1BC-43AD9EB9BA03}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F0DCA20C-6888-4294-97C4-14C82B4DBC82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F0DCA20C-6888-4294-97C4-14C82B4DBC82}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F0DCA20C-6888-4294-97C4-14C82B4DBC82}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F0DCA20C-6888-4294-97C4-14C82B4DBC82}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {E77740F1-234A-4B92-B1BC-43AD9EB9BA03} = {F75B2813-797D-44A5-A301-331C229992C7}
+ {F0DCA20C-6888-4294-97C4-14C82B4DBC82} = {F75B2813-797D-44A5-A301-331C229992C7}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {3678251F-E0BD-439B-9C29-8FB5513B3241}
+ EndGlobalSection
+EndGlobal
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/Directory.Build.props b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/Directory.Build.props
new file mode 100644
index 000000000..017a91e4d
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/Directory.Build.props
@@ -0,0 +1,38 @@
+
+
+
+ net472
+ false
+ none
+ false
+ .pdb
+ any
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameEditor/GameEditor.csproj b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameEditor/GameEditor.csproj
new file mode 100644
index 000000000..b21e6d2cb
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameEditor/GameEditor.csproj
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameEditor/Properties/launchSettings.json b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameEditor/Properties/launchSettings.json
new file mode 100644
index 000000000..c9003e71d
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameEditor/Properties/launchSettings.json
@@ -0,0 +1,9 @@
+{
+ "profiles": {
+ "GameEditor": {
+ "commandName": "Executable",
+ "executablePath": ".\\DualityEditor.exe",
+ "workingDirectory": ".\\..\\..\\..\\.."
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameLauncher/GameLauncher.csproj b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameLauncher/GameLauncher.csproj
new file mode 100644
index 000000000..e25c5087c
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameLauncher/GameLauncher.csproj
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameLauncher/Properties/launchSettings.json b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameLauncher/Properties/launchSettings.json
new file mode 100644
index 000000000..22a778a60
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Launchers/GameLauncher/Properties/launchSettings.json
@@ -0,0 +1,9 @@
+{
+ "profiles": {
+ "GameLauncher": {
+ "commandName": "Executable",
+ "executablePath": ".\\DualityLauncher.exe",
+ "workingDirectory": ".\\..\\..\\..\\.."
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/DualityGameCorePlugin.cs b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/DualityGameCorePlugin.cs
new file mode 100644
index 000000000..ac9b78255
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/DualityGameCorePlugin.cs
@@ -0,0 +1,18 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Duality;
+
+namespace DualityGameCorePlugin
+{
+ ///
+ /// Defines a Duality core plugin.
+ ///
+ public class DualityGameCorePlugin : CorePlugin
+ {
+ // Override methods here for global logic
+ }
+}
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/DualityGameCorePlugin.csproj b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/DualityGameCorePlugin.csproj
new file mode 100644
index 000000000..67ea2692c
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/DualityGameCorePlugin.csproj
@@ -0,0 +1,15 @@
+
+
+
+ netstandard2.0
+ false
+ true
+ DualityGameCorePlugin.core
+
+
+
+
+
+
+
+
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/YourCustomComponentType.cs b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/YourCustomComponentType.cs
new file mode 100644
index 000000000..bd2be906a
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameCorePlugin/YourCustomComponentType.cs
@@ -0,0 +1,14 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Duality;
+
+namespace DualityGameCorePlugin
+{
+ public class YourCustomComponentType : Component
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameEditorPlugin/DualityGameEditorPlugin.csproj b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameEditorPlugin/DualityGameEditorPlugin.csproj
new file mode 100644
index 000000000..1e82aff5b
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameEditorPlugin/DualityGameEditorPlugin.csproj
@@ -0,0 +1,16 @@
+
+
+
+ net472
+ false
+ true
+ DualityGameEditorPlugin.editor
+
+
+
+
+
+
+
+
+
diff --git a/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameEditorPlugin/EditorPlugin.cs b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameEditorPlugin/EditorPlugin.cs
new file mode 100644
index 000000000..f98767495
--- /dev/null
+++ b/Source/DualityTemplates/Templates/SolutionTemplate/Source/Plugins/DualityGameEditorPlugin/EditorPlugin.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Duality.Editor;
+
+namespace DualityGameEditorPlugin
+{
+ ///
+ /// Defines a Duality editor plugin.
+ ///
+ public class DualityGameEditorPlugin : EditorPlugin
+ {
+ public override string Id
+ {
+ get { return "Duality_EditorPlugin"; }
+ }
+ }
+}
\ No newline at end of file