diff --git a/.gitignore b/.gitignore
index e97b4720ac45c49088f54d0a712f717cac1a2a98..7c2965eda294e35b644059bf493b44aa290aebb6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,7 @@
 ## Ignore Visual Studio temporary files, build results, and
 ## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
 
 # User-specific files
-*.rsuser
 *.suo
 *.user
 *.userosscache
@@ -20,21 +17,16 @@
 [Rr]eleases/
 x64/
 x86/
-[Aa][Rr][Mm]/
-[Aa][Rr][Mm]64/
 bld/
 [Bb]in/
 [Oo]bj/
 [Ll]og/
 
-# Visual Studio 2015/2017 cache/options directory
+# Visual Studio 2015 cache/options directory
 .vs/
 # Uncomment if you have tasks that create the project's static files in wwwroot
 #wwwroot/
 
-# Visual Studio 2017 auto generated files
-Generated\ Files/
-
 # MSTest test Results
 [Tt]est[Rr]esult*/
 [Bb]uild[Ll]og.*
@@ -48,28 +40,19 @@ TestResult.xml
 [Rr]eleasePS/
 dlldata.c
 
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
-
-# .NET Core
+# DNX
 project.lock.json
 project.fragment.lock.json
 artifacts/
 
-# StyleCop
-StyleCopReport.xml
-
-# Files built by Visual Studio
 *_i.c
 *_p.c
-*_h.h
+*_i.h
 *.ilk
 *.meta
 *.obj
-*.iobj
 *.pch
 *.pdb
-*.ipdb
 *.pgc
 *.pgd
 *.rsp
@@ -79,7 +62,6 @@ StyleCopReport.xml
 *.tlh
 *.tmp
 *.tmp_proj
-*_wpftmp.csproj
 *.log
 *.vspscc
 *.vssscc
@@ -108,9 +90,6 @@ ipch/
 *.vspx
 *.sap
 
-# Visual Studio Trace Files
-*.e2e
-
 # TFS 2012 Local Workspace
 $tf/
 
@@ -121,6 +100,7 @@ $tf/
 _ReSharper*/
 *.[Rr]e[Ss]harper
 *.DotSettings.user
+Resharper
 
 # JustCode is a .NET coding add-in
 .JustCode
@@ -131,14 +111,6 @@ _TeamCity*
 # DotCover is a Code Coverage Tool
 *.dotCover
 
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
 # NCrunch
 _NCrunch_*
 .*crunch*.local.xml
@@ -170,9 +142,9 @@ publish/
 # Publish Web Output
 *.[Pp]ublish.xml
 *.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
+# TODO: Comment the next line if you want to checkin your web deploy settings
 # but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
+#*.pubxml
 *.publishproj
 
 # Microsoft Azure Web App publish settings. Comment the next line if you want to
@@ -183,12 +155,12 @@ PublishScripts/
 # NuGet Packages
 *.nupkg
 # The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
+**/packages/*
 # except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
+!**/packages/build/
 # Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
+#!**/packages/repositories.config
+# NuGet v3's project.json files produces more ignoreable files
 *.nuget.props
 *.nuget.targets
 
@@ -205,13 +177,12 @@ AppPackages/
 BundleArtifacts/
 Package.StoreAssociation.xml
 _pkginfo.txt
-*.appx
 
 # Visual Studio cache files
 # files ending in .cache can be ignored
 *.[Cc]ache
 # but keep track of directories ending in .cache
-!?*.[Cc]ache/
+!*.[Cc]ache/
 
 # Others
 ClientBin/
@@ -222,17 +193,12 @@ ClientBin/
 *.jfm
 *.pfx
 *.publishsettings
+node_modules/
 orleans.codegen.cs
 
-# Including strong name files can present a security risk
-# (https://github.com/github/gitignore/pull/2483#issue-259490424)
-#*.snk
-
 # Since there are multiple workflows, uncomment next line to ignore bower_components
 # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
 #bower_components/
-# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true
-**/wwwroot/lib/
 
 # RIA/Silverlight projects
 Generated_Code/
@@ -244,20 +210,15 @@ _UpgradeReport_Files/
 Backup*/
 UpgradeLog*.XML
 UpgradeLog*.htm
-ServiceFabricBackup/
-*.rptproj.bak
 
 # SQL Server files
 *.mdf
 *.ldf
-*.ndf
 
 # Business Intelligence projects
 *.rdl.data
 *.bim.layout
 *.bim_*.settings
-*.rptproj.rsuser
-*- Backup*.rdl
 
 # Microsoft Fakes
 FakesAssemblies/
@@ -267,7 +228,6 @@ FakesAssemblies/
 
 # Node.js Tools for Visual Studio
 .ntvs_analysis.dat
-node_modules/
 
 # Visual Studio 6 build log
 *.plg
@@ -275,9 +235,6 @@ node_modules/
 # Visual Studio 6 workspace options file
 *.opt
 
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
 # Visual Studio LightSwitch build output
 **/*.HTMLClient/GeneratedArtifacts
 **/*.DesktopClient/GeneratedArtifacts
@@ -297,49 +254,13 @@ paket-files/
 .idea/
 *.sln.iml
 
-# CodeRush personal settings
-.cr/personal
+# CodeRush
+.cr/
 
 # Python Tools for Visual Studio (PTVS)
 __pycache__/
 *.pyc
 
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
-
-# Tabs Studio
-*.tss
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
-
-# OpenCover UI analysis results
-OpenCover/
-
-# Azure Stream Analytics local run output
-ASALocalRun/
-
-# MSBuild Binary and Structured Log
-*.binlog
-
-# NVidia Nsight GPU debugger configuration file
-*.nvuser
-
-# MFractors (Xamarin productivity tool) working folder
-.mfractor/
-
-# Local History for Visual Studio
-.localhistory/
-
-# BeatPulse healthcheck temp database
-healthchecksdb
-
-# Backup folder for Package Reference Convert tool in Visual Studio 2017
-MigrationBackup/
\ No newline at end of file
+#cake
+tools/
+dist/
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a60ae9cac3363615b4f1ae284ba69ccae900c97e
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,108 @@
+
+
+stages:
+  - build
+  - test
+  - docs
+  - update-assembly-info
+  - build-release
+  - semantic-release
+  - release
+    
+build:
+  before_script:
+    - PowerShell .\build.ps1 -Target Clean
+    - PowerShell .\build.ps1 -Target Restore-NuGet-Packages
+  stage: build
+  script:
+    - PowerShell .\build.ps1 -Target Build
+  except:
+    variables:
+      - $GITLAB_USER_ID == $GIT_BOT_USER_ID
+  
+test:
+  stage: test
+  script:
+    - PowerShell .\build.ps1 -Target Resharper
+    - PowerShell .\build.ps1 -Target Run-Unit-Tests
+  variables:
+    GIT_STRATEGY: none
+  dependencies:
+    - build
+  artifacts:
+    reports:
+      junit: TestResult.xml
+  except:
+    variables:
+      - $GITLAB_USER_ID == $GIT_BOT_USER_ID
+
+update-assembly-info:
+  stage: update-assembly-info
+  script:
+    - PowerShell .\build.ps1 -Target Update-Assembly-Info
+  variables:
+    GIT_STRATEGY: none
+  dependencies:
+    - test
+  only:
+    - master
+  except:
+    variables:
+      - $GITLAB_USER_ID == $GIT_BOT_USER_ID
+
+build-release:
+  before_script:
+    - PowerShell .\build.ps1 -Target Clean
+    - PowerShell .\build.ps1 -Target Restore-NuGet-Packages
+  stage: build-release
+  script:
+    - PowerShell .\build.ps1 -Target Build-Release
+  variables:
+    GIT_STRATEGY: none
+  dependencies:
+    - update-assembly-info
+  only:
+    - master
+  except:
+    variables:
+      - $GITLAB_USER_ID == $GIT_BOT_USER_ID
+
+docs:
+  stage: docs
+  script:
+    - .\publishDocs.ps1 $GITLAB_TOKEN
+  variables:
+    GIT_STRATEGY: none
+  dependencies:
+    - test
+  only:
+    - master
+  except:
+    variables:
+      - $GITLAB_USER_ID == $GIT_BOT_USER_ID
+  
+semantic-release:
+  stage: semantic-release
+  script:
+    - PowerShell .\build.ps1 -Target Semantic-Release
+  variables:
+    GIT_STRATEGY: none
+  dependencies:
+    - test
+  only:
+    - master
+  except:
+    variables:
+      - $GITLAB_USER_ID == $GIT_BOT_USER_ID
+  
+release:
+  stage: release
+  script:
+    - PowerShell .\build.ps1 -Target Build-Release
+  variables:
+    GIT_STRATEGY: none
+  artifacts:
+    paths:
+      - dist
+  only:
+    - tags
diff --git a/.releaserc b/.releaserc
new file mode 100644
index 0000000000000000000000000000000000000000..576a3f725c1310a69365c11aae327a9f61e5dc47
--- /dev/null
+++ b/.releaserc
@@ -0,0 +1,23 @@
+{
+  "plugins": [
+    ["@semantic-release/commit-analyzer", {
+      "preset": "eslint"
+    }],
+    ["@semantic-release/release-notes-generator", {
+      "preset": "eslint",
+    }],
+    ["@semantic-release/gitlab", {
+      "preset": "eslint",
+      "gitlabUrl": "https://git.rwth-aachen.de"
+    }],
+    ["@semantic-release/exec", {
+      "prepareCmd" : "echo ${nextRelease.version}",
+      "publishCmd" : "echo test"
+      }],
+    ["@semantic-release/git", {
+      "preset": "eslint",
+      "assets": "src/**/Properties/AssemblyInfo.cs",
+      "message": "Chore: ${nextRelease.version}\n\n${nextRelease.notes}"
+    }]
+  ]
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..1cacbda86167c5f5629e9d3f8605295ad009460f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 RWTH Aachen University
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
index 92628d69beff45f1e476f2799e6dd2b755335ea2..26fed1bb9c9fc5544894faf7ba099ded199ec796 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+## ConfigurationUpdater
+
 Call this program with the method "SetValue", "GetValue", "SetValueOnConfiguration", "RestartNomadJob" or "Listen".
 
 Call "SetValue" with "Key" and "Value".
diff --git a/build.cake b/build.cake
new file mode 100644
index 0000000000000000000000000000000000000000..9167f136cd91b4c3805451f5c14b6009130cae7c
--- /dev/null
+++ b/build.cake
@@ -0,0 +1,241 @@
+#tool nuget:?package=NUnit.ConsoleRunner&version=3.9.0
+#tool nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2018.3.4
+
+#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.Npx&version=1.3.0
+#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.Issues&version=0.6.2
+#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.Issues.InspectCode&version=0.6.1
+#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.FileHelpers&version=3.1.0
+
+//////////////////////////////////////////////////////////////////////
+// ARGUMENTS
+//////////////////////////////////////////////////////////////////////
+
+var target = Argument("target", "Default");
+var configuration = Argument("configuration", "Release");
+
+//////////////////////////////////////////////////////////////////////
+// PREPARATION
+//////////////////////////////////////////////////////////////////////
+
+// Define directories.
+string projectName;
+string projectPath;
+DirectoryPath buildDir;
+FilePath solutionFile;
+
+// Error rules for resharper
+// Example: {"InconsistentNaming", "RedundantUsingDirective"};
+string [] resharperErrorRules = {};
+
+Action<NpxSettings> requiredSemanticVersionPackages = settings => settings
+    .AddPackage("semantic-release")
+    .AddPackage("@semantic-release/commit-analyzer")
+    .AddPackage("@semantic-release/release-notes-generator")
+    .AddPackage("@semantic-release/gitlab")
+    .AddPackage("@semantic-release/git")
+    .AddPackage("@semantic-release/exec")
+    .AddPackage("conventional-changelog-eslint");
+
+//////////////////////////////////////////////////////////////////////
+// TASKS
+//////////////////////////////////////////////////////////////////////
+
+Task("Get-Project-Name")
+    .Does(() =>
+{
+    var solutions = GetFiles("./**/*.sln");
+    projectName = solutions.First().GetFilenameWithoutExtension().ToString();
+    Information("Project Name: {0}", projectName);
+	
+    solutionFile = solutions.First().ToString();
+    Information("Solution File: {0}", solutionFile.ToString());
+	
+    projectPath = Context.Environment.WorkingDirectory.ToString().ToString() + "/src";
+    Information("Project Directory: {0}", projectPath);
+	
+    buildDir = Directory(projectPath + "/" + projectName + "/bin") + Directory(configuration);
+    Information("Build Directory: {0}", buildDir.ToString());
+});
+
+Task("Clean")
+    .IsDependentOn("Get-Project-Name")
+    .Does(() =>
+{
+    CleanDirectory(buildDir);
+    CleanDirectory("./dist");
+});
+
+Task("Restore-NuGet-Packages")
+    .IsDependentOn("Get-Project-Name")
+    .Does(() =>
+{
+    NuGetRestore(solutionFile);
+});
+
+Task("Resharper")
+    .IsDependentOn("Get-Project-Name")
+    .Does(() =>
+{
+    FilePath dupLog = Context.Environment.WorkingDirectory + "/Resharper/dupfinder.xml";
+    FilePath inspectLog = Context.Environment.WorkingDirectory + "/Resharper/inspectcode.xml";
+    
+    DupFinder(solutionFile, new DupFinderSettings() {
+        OutputFile = dupLog.ToString()
+    });
+    
+    Information("DupFinder Log:{0}{1}", Environment.NewLine, FileReadText(dupLog));
+    
+    InspectCode(solutionFile, new InspectCodeSettings() {
+        OutputFile = inspectLog.ToString()
+    });
+    
+    var issues = ReadIssues(
+        InspectCodeIssuesFromFilePath(inspectLog.ToString()),
+        Context.Environment.WorkingDirectory);
+
+    Information("{0} issues are found.", issues.Count());
+    
+    Information("InspectCode Log:{0}{1}", Environment.NewLine, FileReadText(inspectLog));
+    
+    var errorIssues = issues.Where(issue => resharperErrorRules.Any(issue.Rule.Contains)).ToList();
+ 
+    if(errorIssues.Any())
+    {
+        var errorMessage = errorIssues.Aggregate(new StringBuilder(), (stringBuilder, issue) => stringBuilder.AppendFormat("FileName: {0} Line: {1} Message: {2}{3}", issue.AffectedFileRelativePath, issue.Line, issue.Message, Environment.NewLine));
+        throw new CakeException($"{errorIssues.Count} errors detected: {Environment.NewLine}{errorMessage}.");
+    }
+});
+                
+Task("Update-Assembly-Info")
+    .IsDependentOn("Get-Project-Name")
+    .Does(() =>
+{
+    
+    Information("Running semantic-release in dry run mode to extract next semantic version number");
+
+    string[] semanticReleaseOutput;
+    Npx("semantic-release", "--dry-run", requiredSemanticVersionPackages, out semanticReleaseOutput);
+
+    Information(string.Join(Environment.NewLine, semanticReleaseOutput));
+
+    var nextSemanticVersionNumber = ExtractNextSemanticVersionNumber(semanticReleaseOutput);
+
+    if (nextSemanticVersionNumber == null) {
+        Warning("There are no relevant changes. AssemblyInfo won't be updated!");
+    } else {
+        Information("Next semantic version number is {0}", nextSemanticVersionNumber);
+        
+        var assemblyVersion = $"{nextSemanticVersionNumber}.0";
+            
+        CreateAssemblyInfo(projectPath + "/" + projectName + "/Properties/AssemblyInfo.cs", new AssemblyInfoSettings{
+            Product = projectName,
+            Title = projectName,
+            Company = "RWTH Aachen University IT Center",
+            Version = assemblyVersion,
+            FileVersion = assemblyVersion,
+            InformationalVersion  = assemblyVersion,
+            Copyright = "RWTH Aachen University IT Center " + DateTime.Now.Year
+        });
+    }
+});
+                
+Task("Build-Release")
+    .IsDependentOn("Get-Project-Name")
+    .Does(() =>
+{        
+    if(IsRunningOnWindows())
+    {
+        // Use MSBuild
+        MSBuild(solutionFile, settings => 
+        {
+            settings.SetConfiguration(configuration);
+            settings.WithProperty("DebugSymbols", "false");
+            settings.WithProperty("DebugType", "None");
+        });
+    }
+    else
+    {
+        // Use XBuild
+        XBuild(solutionFile, settings =>
+        {            
+            settings.SetConfiguration(configuration);
+            settings.WithProperty("DebugSymbols", "false");
+            settings.WithProperty("DebugType", "None");
+        });
+    }
+    CopyDirectory(buildDir, "./dist");
+});
+
+Task("Build")
+    .IsDependentOn("Get-Project-Name")
+    .Does(() =>
+{        
+    if(IsRunningOnWindows())
+    {
+        // Use MSBuild
+        MSBuild(solutionFile, settings => 
+        {
+            settings.SetConfiguration(configuration);
+            settings.WithProperty("RunCodeAnalysis", "true");
+        });
+    }
+    else
+    {
+        // Use XBuild
+        XBuild(solutionFile, settings =>
+        {            
+            settings.SetConfiguration(configuration);
+            settings.WithProperty("RunCodeAnalysis", "true");
+        });
+    }
+});
+
+Task("Run-Unit-Tests")
+    .Does(() =>
+{
+    NUnit3("./src/**/bin/" + configuration + "/*.Tests.dll", new NUnit3Settings {
+        // generate the xml file
+        NoResults = false,
+        Results = new NUnit3Result[]{new NUnit3Result(){
+            FileName = Context.Environment.WorkingDirectory + "/TestResult.xml",
+            Transform = Context.Environment.WorkingDirectory + "/nunit3-junit.xslt"
+        }}
+    });
+});
+
+Task("Semantic-Release")
+    .Does(() =>
+{
+    Npx("semantic-release", requiredSemanticVersionPackages);
+});
+
+//////////////////////////////////////////////////////////////////////
+// TASK TARGETS
+//////////////////////////////////////////////////////////////////////
+
+Task("Default")
+    .IsDependentOn("Clean")
+    .IsDependentOn("Restore-NuGet-Packages")
+    .IsDependentOn("Resharper")
+    .IsDependentOn("Build")
+    .IsDependentOn("Run-Unit-Tests");
+
+//////////////////////////////////////////////////////////////////////
+// EXECUTION
+//////////////////////////////////////////////////////////////////////
+
+RunTarget(target);
+
+///////////////////////////////////////////////////////////////////////////////
+// Helpers
+///////////////////////////////////////////////////////////////////////////////
+
+string ExtractNextSemanticVersionNumber(string[] semanticReleaseOutput)
+{
+    var extractRegEx = new System.Text.RegularExpressions.Regex("^.+next release version is (?<SemanticVersionNumber>.*)$");
+
+    return semanticReleaseOutput
+        .Select(line => extractRegEx.Match(line).Groups["SemanticVersionNumber"].Value)
+        .Where(line => !string.IsNullOrWhiteSpace(line))
+        .SingleOrDefault();
+}
\ No newline at end of file
diff --git a/build.ps1 b/build.ps1
new file mode 100644
index 0000000000000000000000000000000000000000..f83382e8e4092ba6cf32a47f9dfa4e211c878430
--- /dev/null
+++ b/build.ps1
@@ -0,0 +1,255 @@
+#The MIT License (MIT)
+#
+#Copyright (c) 2014 - 2016 Patrik Svensson, Mattias Karlsson, Gary Ewan Park and contributors
+#
+#Permission is hereby granted, free of charge, to any person obtaining a copy of
+#this software and associated documentation files (the "Software"), to deal in
+#the Software without restriction, including without limitation the rights to
+#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+#the Software, and to permit persons to whom the Software is furnished to do so,
+#subject to the following conditions:
+#
+#The above copyright notice and this permission notice shall be included in all
+#copies or substantial portions of the Software.
+#
+#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+##########################################################################
+# This is the Cake bootstrapper script for PowerShell.
+# This file was downloaded from https://github.com/cake-build/resources
+# Feel free to change this file to fit your needs.
+##########################################################################
+
+<#
+
+.SYNOPSIS
+This is a Powershell script to bootstrap a Cake build.
+
+.DESCRIPTION
+This Powershell script will download NuGet if missing, restore NuGet tools (including Cake)
+and execute your Cake build script with the parameters you provide.
+
+.PARAMETER Script
+The build script to execute.
+.PARAMETER Target
+The build script target to run.
+.PARAMETER Configuration
+The build configuration to use.
+.PARAMETER Verbosity
+Specifies the amount of information to be displayed.
+.PARAMETER ShowDescription
+Shows description about tasks.
+.PARAMETER DryRun
+Performs a dry run.
+.PARAMETER Experimental
+Uses the nightly builds of the Roslyn script engine.
+.PARAMETER Mono
+Uses the Mono Compiler rather than the Roslyn script engine.
+.PARAMETER SkipToolPackageRestore
+Skips restoring of packages.
+.PARAMETER ScriptArgs
+Remaining arguments are added here.
+
+.LINK
+https://cakebuild.net
+
+#>
+
+[CmdletBinding()]
+Param(
+    [string]$Script = "build.cake",
+    [string]$Target,
+    [string]$Configuration,
+    [ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")]
+    [string]$Verbosity,
+    [switch]$ShowDescription,
+    [Alias("WhatIf", "Noop")]
+    [switch]$DryRun,
+    [switch]$Experimental,
+    [switch]$Mono,
+    [switch]$SkipToolPackageRestore,
+    [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
+    [string[]]$ScriptArgs
+)
+
+[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null
+function MD5HashFile([string] $filePath)
+{
+    if ([string]::IsNullOrEmpty($filePath) -or !(Test-Path $filePath -PathType Leaf))
+    {
+        return $null
+    }
+
+    [System.IO.Stream] $file = $null;
+    [System.Security.Cryptography.MD5] $md5 = $null;
+    try
+    {
+        $md5 = [System.Security.Cryptography.MD5]::Create()
+        $file = [System.IO.File]::OpenRead($filePath)
+        return [System.BitConverter]::ToString($md5.ComputeHash($file))
+    }
+    finally
+    {
+        if ($file -ne $null)
+        {
+            $file.Dispose()
+        }
+    }
+}
+
+function GetProxyEnabledWebClient
+{
+    $wc = New-Object System.Net.WebClient
+    $proxy = [System.Net.WebRequest]::GetSystemWebProxy()
+    $proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials        
+    $wc.Proxy = $proxy
+    return $wc
+}
+
+Write-Host "Preparing to run build script..."
+
+if(!$PSScriptRoot){
+    $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
+}
+
+$TOOLS_DIR = Join-Path $PSScriptRoot "tools"
+$ADDINS_DIR = Join-Path $TOOLS_DIR "Addins"
+$MODULES_DIR = Join-Path $TOOLS_DIR "Modules"
+$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe"
+$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe"
+$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
+$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config"
+$PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum"
+$ADDINS_PACKAGES_CONFIG = Join-Path $ADDINS_DIR "packages.config"
+$MODULES_PACKAGES_CONFIG = Join-Path $MODULES_DIR "packages.config"
+
+# Make sure tools folder exists
+if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) {
+    Write-Verbose -Message "Creating tools directory..."
+    New-Item -Path $TOOLS_DIR -Type directory | out-null
+}
+
+# Make sure that packages.config exist.
+if (!(Test-Path $PACKAGES_CONFIG)) {
+    Write-Verbose -Message "Downloading packages.config..."    
+    try {        
+        $wc = GetProxyEnabledWebClient
+        $wc.DownloadFile("https://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch {
+        Throw "Could not download packages.config."
+    }
+}
+
+# Try find NuGet.exe in path if not exists
+if (!(Test-Path $NUGET_EXE)) {
+    Write-Verbose -Message "Trying to find nuget.exe in PATH..."
+    $existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_ -PathType Container) }
+    $NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1
+    if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) {
+        Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)."
+        $NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
+    }
+}
+
+# Try download NuGet.exe if not exists
+if (!(Test-Path $NUGET_EXE)) {
+    Write-Verbose -Message "Downloading NuGet.exe..."
+    try {
+        $wc = GetProxyEnabledWebClient
+        $wc.DownloadFile($NUGET_URL, $NUGET_EXE)
+    } catch {
+        Throw "Could not download NuGet.exe."
+    }
+}
+
+# Save nuget.exe path to environment to be available to child processed
+$ENV:NUGET_EXE = $NUGET_EXE
+
+# Restore tools from NuGet?
+if(-Not $SkipToolPackageRestore.IsPresent) {
+    Push-Location
+    Set-Location $TOOLS_DIR
+
+    # Check for changes in packages.config and remove installed tools if true.
+    [string] $md5Hash = MD5HashFile($PACKAGES_CONFIG)
+    if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or
+      ($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) {
+        Write-Verbose -Message "Missing or changed package.config hash..."
+        Remove-Item * -Recurse -Exclude packages.config,nuget.exe
+    }
+
+    Write-Verbose -Message "Restoring tools from NuGet..."
+    $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`""
+
+    if ($LASTEXITCODE -ne 0) {
+        Throw "An error occurred while restoring NuGet tools."
+    }
+    else
+    {
+        $md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII"
+    }
+    Write-Verbose -Message ($NuGetOutput | out-string)
+
+    Pop-Location
+}
+
+# Restore addins from NuGet
+if (Test-Path $ADDINS_PACKAGES_CONFIG) {
+    Push-Location
+    Set-Location $ADDINS_DIR
+
+    Write-Verbose -Message "Restoring addins from NuGet..."
+    $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$ADDINS_DIR`""
+
+    if ($LASTEXITCODE -ne 0) {
+        Throw "An error occurred while restoring NuGet addins."
+    }
+
+    Write-Verbose -Message ($NuGetOutput | out-string)
+
+    Pop-Location
+}
+
+# Restore modules from NuGet
+if (Test-Path $MODULES_PACKAGES_CONFIG) {
+    Push-Location
+    Set-Location $MODULES_DIR
+
+    Write-Verbose -Message "Restoring modules from NuGet..."
+    $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$MODULES_DIR`""
+
+    if ($LASTEXITCODE -ne 0) {
+        Throw "An error occurred while restoring NuGet modules."
+    }
+
+    Write-Verbose -Message ($NuGetOutput | out-string)
+
+    Pop-Location
+}
+
+# Make sure that Cake has been installed.
+if (!(Test-Path $CAKE_EXE)) {
+    Throw "Could not find Cake.exe at $CAKE_EXE"
+}
+
+
+
+# Build Cake arguments
+$cakeArguments = @("$Script");
+if ($Target) { $cakeArguments += "-target=$Target" }
+if ($Configuration) { $cakeArguments += "-configuration=$Configuration" }
+if ($Verbosity) { $cakeArguments += "-verbosity=$Verbosity" }
+if ($ShowDescription) { $cakeArguments += "-showdescription" }
+if ($DryRun) { $cakeArguments += "-dryrun" }
+if ($Experimental) { $cakeArguments += "-experimental" }
+if ($Mono) { $cakeArguments += "-mono" }
+$cakeArguments += $ScriptArgs
+
+# Start Cake
+Write-Host "Running build script..."
+&$CAKE_EXE $cakeArguments
+exit $LASTEXITCODE
diff --git a/build.sh b/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..d088917ed78538ff57cf654cf71aad6bf045d655
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,122 @@
+#!/usr/bin/env bash
+
+#The MIT License (MIT)
+#
+#Copyright (c) 2014 - 2016 Patrik Svensson, Mattias Karlsson, Gary Ewan Park and contributors
+#
+#Permission is hereby granted, free of charge, to any person obtaining a copy of
+#this software and associated documentation files (the "Software"), to deal in
+#the Software without restriction, including without limitation the rights to
+#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+#the Software, and to permit persons to whom the Software is furnished to do so,
+#subject to the following conditions:
+#
+#The above copyright notice and this permission notice shall be included in all
+#copies or substantial portions of the Software.
+#
+#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+##########################################################################
+# This is the Cake bootstrapper script for Linux and OS X.
+# This file was downloaded from https://github.com/cake-build/resources
+# Feel free to change this file to fit your needs.
+##########################################################################
+
+# Define directories.
+SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+TOOLS_DIR=$SCRIPT_DIR/tools
+NUGET_EXE=$TOOLS_DIR/nuget.exe
+CAKE_EXE=$TOOLS_DIR/Cake/Cake.exe
+PACKAGES_CONFIG=$TOOLS_DIR/packages.config
+PACKAGES_CONFIG_MD5=$TOOLS_DIR/packages.config.md5sum
+
+# Define md5sum or md5 depending on Linux/OSX
+MD5_EXE=
+if [[ "$(uname -s)" == "Darwin" ]]; then
+    MD5_EXE="md5 -r"
+else
+    MD5_EXE="md5sum"
+fi
+
+# Define default arguments.
+SCRIPT="build.cake"
+TARGET="Default"
+CONFIGURATION="Release"
+VERBOSITY="verbose"
+DRYRUN=
+SHOW_VERSION=false
+SCRIPT_ARGUMENTS=()
+
+# Parse arguments.
+for i in "$@"; do
+    case $1 in
+        -s|--script) SCRIPT="$2"; shift ;;
+        -t|--target) TARGET="$2"; shift ;;
+        -c|--configuration) CONFIGURATION="$2"; shift ;;
+        -v|--verbosity) VERBOSITY="$2"; shift ;;
+        -d|--dryrun) DRYRUN="-dryrun" ;;
+        --version) SHOW_VERSION=true ;;
+        --) shift; SCRIPT_ARGUMENTS+=("$@"); break ;;
+        *) SCRIPT_ARGUMENTS+=("$1") ;;
+    esac
+    shift
+done
+
+# Make sure the tools folder exist.
+if [ ! -d "$TOOLS_DIR" ]; then
+  mkdir "$TOOLS_DIR"
+fi
+
+# Make sure that packages.config exist.
+if [ ! -f "$TOOLS_DIR/packages.config" ]; then
+    echo "Downloading packages.config..."
+    curl -Lsfo "$TOOLS_DIR/packages.config" https://cakebuild.net/download/bootstrapper/packages
+    if [ $? -ne 0 ]; then
+        echo "An error occurred while downloading packages.config."
+        exit 1
+    fi
+fi
+
+# Download NuGet if it does not exist.
+if [ ! -f "$NUGET_EXE" ]; then
+    echo "Downloading NuGet..."
+    curl -Lsfo "$NUGET_EXE" https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
+    if [ $? -ne 0 ]; then
+        echo "An error occurred while downloading nuget.exe."
+        exit 1
+    fi
+fi
+
+# Restore tools from NuGet.
+pushd "$TOOLS_DIR" >/dev/null
+if [ ! -f $PACKAGES_CONFIG_MD5 ] || [ "$( cat $PACKAGES_CONFIG_MD5 | sed 's/\r$//' )" != "$( $MD5_EXE $PACKAGES_CONFIG | awk '{ print $1 }' )" ]; then
+    find . -type d ! -name . | xargs rm -rf
+fi
+
+mono "$NUGET_EXE" install -ExcludeVersion
+if [ $? -ne 0 ]; then
+    echo "Could not restore NuGet packages."
+    exit 1
+fi
+
+$MD5_EXE $PACKAGES_CONFIG | awk '{ print $1 }' >| $PACKAGES_CONFIG_MD5
+
+popd >/dev/null
+
+# Make sure that Cake has been installed.
+if [ ! -f "$CAKE_EXE" ]; then
+    echo "Could not find Cake.exe at '$CAKE_EXE'."
+    exit 1
+fi
+
+# Start Cake
+if $SHOW_VERSION; then
+    exec mono "$CAKE_EXE" -version
+else
+    exec mono "$CAKE_EXE" $SCRIPT -verbosity=$VERBOSITY -configuration=$CONFIGURATION -target=$TARGET $DRYRUN "${SCRIPT_ARGUMENTS[@]}"
+fi
\ No newline at end of file
diff --git a/docs/ESLintConvention.md b/docs/ESLintConvention.md
new file mode 100644
index 0000000000000000000000000000000000000000..001dba56ac6f0f96234f03d0278f618826728495
--- /dev/null
+++ b/docs/ESLintConvention.md
@@ -0,0 +1,45 @@
+## ESLint Convention
+
+Make the changes to the code and tests and then commit to your branch. Be sure to follow the commit message conventions.
+
+Commit message summaries must follow this basic format:
+
+```
+Tag: Message (fixes #1234)
+```
+
+`Tag` should not be confused with git tag.
+`Message` should not be confused with git commit message.
+
+The `Tag` is one of the following:
+
+* `Fix` - for a bug fix.
+* `Update` - for a backwards-compatible enhancement.
+* `Breaking` - for a backwards-incompatible enhancement.
+* `Docs` - changes to documentation only.
+* `Build` - changes to build process only.
+* `New` - implemented a new feature.
+* `Upgrade` - for a dependency upgrade.
+
+The message summary should be a one-sentence description of the change. The issue number should be mentioned at the end. * The commit message should say "(fixes #1234)" at the end of the description if it closes out an existing issue (replace 1234 with the issue number). If the commit doesn't completely fix the issue, then use `(refs #1234)` instead of `(fixes #1234)`.
+
+Here are some good commit message summary examples:
+
+```
+Build: Update Travis to only test Node 0.10 (refs #734)
+Fix: Semi rule incorrectly flagging extra semicolon (fixes #840)
+Upgrade: Esprima to 1.2, switch to using Esprima comment attachment (fixes #730)
+```
+
+The commit message format is important because these messages are used to create a changelog for each release. The tag and issue number help to create more consistent and useful changelogs.
+
+Based on https://github.com/eslint/eslint.github.io/blob/master/docs/developer-guide/contributing.md#step-2-make-your-changes
+
+[npm-image]: https://badge.fury.io/js/conventional-changelog-eslint.svg
+[npm-url]: https://npmjs.org/package/conventional-changelog-eslint
+[travis-image]: https://travis-ci.org/stevemao/conventional-changelog-eslint.svg?branch=master
+[travis-url]: https://travis-ci.org/stevemao/conventional-changelog-eslint
+[daviddm-image]: https://david-dm.org/stevemao/conventional-changelog-eslint.svg?theme=shields.io
+[daviddm-url]: https://david-dm.org/stevemao/conventional-changelog-eslint
+[coveralls-image]: https://coveralls.io/repos/stevemao/conventional-changelog-eslint/badge.svg
+[coveralls-url]: https://coveralls.io/r/stevemao/conventional-changelog-eslint
\ No newline at end of file
diff --git a/docs/home.md b/docs/home.md
new file mode 100644
index 0000000000000000000000000000000000000000..26fed1bb9c9fc5544894faf7ba099ded199ec796
--- /dev/null
+++ b/docs/home.md
@@ -0,0 +1,13 @@
+## ConfigurationUpdater
+
+Call this program with the method "SetValue", "GetValue", "SetValueOnConfiguration", "RestartNomadJob" or "Listen".
+
+Call "SetValue" with "Key" and "Value".
+                           
+Call "GetValue" with "Key".
+
+Call "SetValueOnConfiguration" with "Key", "TemplateConfigurationFile", "OutputConfigurationFile" and n-combinations of "ReplaceKey" and "ConsulKey".
+
+Call "RestartNomadJob" with the "JobId".
+
+Call "Listen" with "JobId", "Key", "TemplateConfigurationFile", "OutputConfigurationFile" and n-combinations of "ReplaceKey" and "ConsulKey".
\ No newline at end of file
diff --git a/docs/images/add_a_package.png b/docs/images/add_a_package.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8e8ed2121edfc81d8fb2e4f3e03ed4807c66eea
Binary files /dev/null and b/docs/images/add_a_package.png differ
diff --git a/docs/images/add_a_reference.png b/docs/images/add_a_reference.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ee38c9951bc5739297b78abb2c82113286f6e71
Binary files /dev/null and b/docs/images/add_a_reference.png differ
diff --git a/docs/images/create_class_library.png b/docs/images/create_class_library.png
new file mode 100644
index 0000000000000000000000000000000000000000..89a252c6e358c73fb9b7299464f851e69127285a
Binary files /dev/null and b/docs/images/create_class_library.png differ
diff --git a/docs/images/create_project.png b/docs/images/create_project.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7ae1a1701c9287d5f7a959bf856f55966293081
Binary files /dev/null and b/docs/images/create_project.png differ
diff --git a/docs/images/select_framework.png b/docs/images/select_framework.png
new file mode 100644
index 0000000000000000000000000000000000000000..bba5b07168b73cb1005150aad92d6d925bada649
Binary files /dev/null and b/docs/images/select_framework.png differ
diff --git a/docs/images/select_project.png b/docs/images/select_project.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f42cc3a18e89d6e2a26cd76de9730f39feb51bf
Binary files /dev/null and b/docs/images/select_project.png differ
diff --git a/docs/images/test_code.png b/docs/images/test_code.png
new file mode 100644
index 0000000000000000000000000000000000000000..e9d9b5f88107c03fb19d4d2c6567981d25658154
Binary files /dev/null and b/docs/images/test_code.png differ
diff --git a/docs/nunit.md b/docs/nunit.md
new file mode 100644
index 0000000000000000000000000000000000000000..020e56f85510b1319edbe89e76cdd0891b5abe43
--- /dev/null
+++ b/docs/nunit.md
@@ -0,0 +1,33 @@
+## Add NUnit Tests
+
+### Add Nunit test adapter
+1.  Choose **Tools > Extensions and Updates**
+2.  In the **Extensions and Updates** dialog box, expand the **Online** category and then **Visual Studio Marketplace**. Then, choose **Tools > Testing**.
+2.  Select the **NUnit test adapter** and then choose **Download.**
+### Add Tests
+
+1.  Create a class library project and add it to your solution.
+
+    For convinience name it like your main project and add **.Tests** as a suffix.
+    ![alt text](images/create_class_library.png "Select Class Library")
+
+2.  Install the plug-in. In **Solution Explorer**, select the class library project, and then choose **Manage NuGet Packages** from its right-click or context menu.
+
+    ![alt text](images/add_a_package.png "Add a package")
+
+3.  In the **NuGet Package Manager** window, search for and select the plug-in (NUnit), and then choose **Install**.
+    ![alt text](images/select_framework.png "Select Project")
+
+    The framework is now referenced in your project under **References**.
+
+4.  From the class library project's **References** node, select **Add Reference**.
+
+    ![alt text](images/add_a_reference.png "Add a reference")
+
+5. In the **Reference Manager** dialog box, select the project that contains the code you'll test.
+
+    ![alt text](images/select_project.png "Select Project")
+
+6. Code your unit test.
+    
+    ![alt text](images/test_code.png "Test Code")
diff --git a/docs/testdoc.md b/docs/testdoc.md
new file mode 100644
index 0000000000000000000000000000000000000000..938b6eb3d01ae251f10a000bda25fd4538d87d7a
--- /dev/null
+++ b/docs/testdoc.md
@@ -0,0 +1,78 @@
+It's very easy to make some words **bold** and other words *italic* with Markdown. You can even [link to Google!](http://google.com)
+
+Sometimes you want numbered lists:
+
+1. One
+2. Two
+3. Three
+
+Sometimes you want bullet points:
+
+* Start a line with a star
+* Profit!
+
+Alternatively,
+
+- Dashes work just as well
+- And if you have sub points, put two spaces before the dash or star:
+  - Like this
+  - And this
+
+If you want to embed images, this is how you do it:
+
+![Image of Yaktocat](https://octodex.github.com/images/yaktocat.png)
+
+# Structured documents
+
+Sometimes it's useful to have different levels of headings to structure your documents. Start lines with a `#` to create headings. Multiple `##` in a row denote smaller heading sizes.
+
+### This is a third-tier heading
+
+You can use one `#` all the way up to `######` six for different heading sizes.
+
+If you'd like to quote someone, use the > character before the line:
+
+> Coffee. The finest organic suspension ever devised... I beat the Borg with it.
+> - Captain Janeway
+
+[200~There are many different ways to style code with GitHub's markdown. If you have inline code blocks, wrap them in backticks: `var example = true`.  If you've got a longer block of code, you can indent with four spaces:
+
+    if (isAwesome){
+      return true
+    }
+
+GitHub also supports something called code fencing, which allows for multiple lines without indentation:
+
+```
+if (isAwesome){
+  return true
+}
+```
+
+And if you'd like to use syntax highlighting, include the language:
+
+```javascript
+if (isAwesome){
+  return true
+}
+```
+
+GitHub supports many extras in Markdown that help you reference and link to people. If you ever want to direct a comment at someone, you can prefix their name with an @ symbol: Hey @kneath — love your sweater!
+
+But I have to admit, tasks lists are my favorite:
+
+- [x] This is a complete item
+- [ ] This is an incomplete item
+
+When you include a task list in the first comment of an Issue, you will see a helpful progress bar in your list of issues. It works in Pull Requests, too!
+
+And, of course emoji!
+GitHub supports many extras in Markdown that help you reference and link to people. If you ever want to direct a comment at someone, you can prefix their name with an @ symbol: Hey @kneath — love your sweater!
+
+But I have to admit, tasks lists are my favorite:
+
+ This is a complete item
+ This is an incomplete item
+When you include a task list in the first comment of an Issue, you will see a helpful progress bar in your list of issues. It works in Pull Requests, too!
+
+And, of course emoji!
diff --git a/nunit3-junit.xslt b/nunit3-junit.xslt
new file mode 100644
index 0000000000000000000000000000000000000000..bf69bdb1d2cd6fc2fdbeb915b4eb6732f720848e
--- /dev/null
+++ b/nunit3-junit.xslt
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Taken from: https://github.com/nunit/nunit-transforms/tree/master/nunit3-junit
+-->
+<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:output method="xml" indent="yes"/>
+
+  <xsl:template match="/test-run">
+    <testsuites tests="{@testcasecount}" failures="{@failed}" disabled="{@skipped}" time="{@duration}">
+      <xsl:apply-templates/>
+    </testsuites>
+  </xsl:template>
+
+  <xsl:template match="test-suite">
+    <xsl:if test="test-case">
+      <testsuite tests="{@testcasecount}" time="{@duration}" errors="{@testcasecount - @passed - @skipped - @failed}" failures="{@failed}" skipped="{@skipped}" timestamp="{@start-time}">
+        <xsl:attribute name="name">
+          <xsl:for-each select="ancestor-or-self::test-suite/@name">
+            <xsl:value-of select="concat(., '.')"/>
+          </xsl:for-each>
+        </xsl:attribute>
+        <xsl:apply-templates select="test-case"/>
+      </testsuite>
+      <xsl:apply-templates select="test-suite"/>
+    </xsl:if>
+    <xsl:if test="not(test-case)">
+      <xsl:apply-templates/>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="test-case">
+    <testcase name="{@name}" assertions="{@asserts}" time="{@duration}" status="{@result}" classname="{@classname}">
+      <xsl:if test="@runstate = 'Skipped' or @runstate = 'Ignored'">
+        <skipped/>
+      </xsl:if>
+      
+      <xsl:apply-templates/>
+    </testcase>
+  </xsl:template>
+
+  <xsl:template match="command-line"/>
+  <xsl:template match="settings"/>
+
+  <xsl:template match="output">
+    <system-out>
+      <xsl:value-of select="."/>
+    </system-out>
+  </xsl:template>
+
+  <xsl:template match="stack-trace">
+  </xsl:template>
+
+  <xsl:template match="test-case/failure">
+    <failure message="{./message}">
+      <xsl:value-of select="./stack-trace"/>
+    </failure>
+  </xsl:template>
+
+  <xsl:template match="test-suite/failure"/>
+
+  <xsl:template match="test-case/reason">
+    <skipped message="{./message}"/>
+  </xsl:template>
+  
+  <xsl:template match="test-case/assertions">
+  </xsl:template>
+
+  <xsl:template match="test-suite/reason"/>
+
+  <xsl:template match="properties"/>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/publishDocs.ps1 b/publishDocs.ps1
new file mode 100644
index 0000000000000000000000000000000000000000..f49b3b93e477ca9d57f7b1163b2bcf246f86d35d
--- /dev/null
+++ b/publishDocs.ps1
@@ -0,0 +1,19 @@
+param(
+    $token
+)
+
+$remoteUrl = git config --get remote.origin.url
+$remoteUrl = $remoteUrl.replace("git@", "")
+$remoteUrl = $remoteUrl -replace "https(.*?)@",""
+$remoteUrl = $remoteUrl.replace(":", "/")
+$remoteUrl = $remoteUrl.replace(".git", ".wiki.git")
+
+$temporaryFolderName = "publishDocsTempFolder"
+
+git clone "https://gitlab-ci-token:$($token)@$($remoteUrl)" $temporaryFolderName
+cd $temporaryFolderName
+Remove-Item *
+cp -r ../docs/* ./
+git add . 
+git commit -m "Docs: Documentation Update" 
+git push
\ No newline at end of file
diff --git a/ConfigurationUpdater.sln b/src/ConfigurationUpdater.sln
similarity index 100%
rename from ConfigurationUpdater.sln
rename to src/ConfigurationUpdater.sln
diff --git a/ConfigurationUpdater/App.config b/src/ConfigurationUpdater/App.config
similarity index 100%
rename from ConfigurationUpdater/App.config
rename to src/ConfigurationUpdater/App.config
diff --git a/ConfigurationUpdater/ConfigurationUpdater.csproj b/src/ConfigurationUpdater/ConfigurationUpdater.csproj
similarity index 100%
rename from ConfigurationUpdater/ConfigurationUpdater.csproj
rename to src/ConfigurationUpdater/ConfigurationUpdater.csproj
diff --git a/ConfigurationUpdater/Consul.cs b/src/ConfigurationUpdater/Consul.cs
similarity index 100%
rename from ConfigurationUpdater/Consul.cs
rename to src/ConfigurationUpdater/Consul.cs
diff --git a/ConfigurationUpdater/Nomad.cs b/src/ConfigurationUpdater/Nomad.cs
similarity index 100%
rename from ConfigurationUpdater/Nomad.cs
rename to src/ConfigurationUpdater/Nomad.cs
diff --git a/ConfigurationUpdater/Program.cs b/src/ConfigurationUpdater/Program.cs
similarity index 100%
rename from ConfigurationUpdater/Program.cs
rename to src/ConfigurationUpdater/Program.cs
diff --git a/ConfigurationUpdater/Properties/AssemblyInfo.cs b/src/ConfigurationUpdater/Properties/AssemblyInfo.cs
similarity index 100%
rename from ConfigurationUpdater/Properties/AssemblyInfo.cs
rename to src/ConfigurationUpdater/Properties/AssemblyInfo.cs
diff --git a/ConfigurationUpdater/packages.config b/src/ConfigurationUpdater/packages.config
similarity index 100%
rename from ConfigurationUpdater/packages.config
rename to src/ConfigurationUpdater/packages.config