diff --git a/WindowsAgent/Tools/NuGet.exe b/WindowsAgent/Tools/NuGet.exe
new file mode 100644
index 0000000..4645f4b
Binary files /dev/null and b/WindowsAgent/Tools/NuGet.exe differ
diff --git a/WindowsAgent/WindowsAgent.sln b/WindowsAgent/WindowsAgent.sln
new file mode 100644
index 0000000..71a494b
--- /dev/null
+++ b/WindowsAgent/WindowsAgent.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsAgent", "WindowsAgent\WindowsAgent.csproj", "{F7E2A8D5-6D24-4651-A4BC-1024D59F4903}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F7E2A8D5-6D24-4651-A4BC-1024D59F4903}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F7E2A8D5-6D24-4651-A4BC-1024D59F4903}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F7E2A8D5-6D24-4651-A4BC-1024D59F4903}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F7E2A8D5-6D24-4651-A4BC-1024D59F4903}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/WindowsAgent/WindowsAgent/App.config b/WindowsAgent/WindowsAgent/App.config
new file mode 100644
index 0000000..2c1d906
--- /dev/null
+++ b/WindowsAgent/WindowsAgent/App.config
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/WindowsAgent/WindowsAgent/ExecutionPlan.cs b/WindowsAgent/WindowsAgent/ExecutionPlan.cs
new file mode 100644
index 0000000..9c0be86
--- /dev/null
+++ b/WindowsAgent/WindowsAgent/ExecutionPlan.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Mirantis.Keero.WindowsAgent
+{
+ class ExecutionPlan
+ {
+ public class Command
+ {
+ public string Name { get; set; }
+ public Dictionary Arguments { get; set; }
+ }
+
+ public string[] Scripts { get; set; }
+ public LinkedList Commands { get; set; }
+ }
+}
diff --git a/WindowsAgent/WindowsAgent/MqMessage.cs b/WindowsAgent/WindowsAgent/MqMessage.cs
new file mode 100644
index 0000000..d77ab79
--- /dev/null
+++ b/WindowsAgent/WindowsAgent/MqMessage.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Mirantis.Keero.WindowsAgent
+{
+ class MqMessage
+ {
+ private readonly Action ackFunc;
+
+ public MqMessage(Action ackFunc)
+ {
+ this.ackFunc = ackFunc;
+ }
+
+ public string Body { get; set; }
+
+ public void Ack()
+ {
+ ackFunc();
+ }
+ }
+}
diff --git a/WindowsAgent/WindowsAgent/PlanExecutor.cs b/WindowsAgent/WindowsAgent/PlanExecutor.cs
new file mode 100644
index 0000000..7baab0b
--- /dev/null
+++ b/WindowsAgent/WindowsAgent/PlanExecutor.cs
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Management.Automation;
+using System.Management.Automation.Runspaces;
+using System.Text;
+using Newtonsoft.Json;
+
+namespace Mirantis.Keero.WindowsAgent
+{
+ class PlanExecutor
+ {
+ class ExecutionResult
+ {
+ public bool IsException { get; set; }
+ public object Result { get; set; }
+ }
+
+ private readonly string path;
+
+ public PlanExecutor(string path)
+ {
+ this.path = path;
+ }
+
+ public string Execute()
+ {
+ try
+ {
+ var plan = JsonConvert.DeserializeObject(File.ReadAllText(this.path));
+ var resultPath = this.path + ".result";
+ List