diff --git a/devTools/FC.targets b/devTools/FC.targets
new file mode 100644
index 0000000000000000000000000000000000000000..e379da0de255cc30b7a6a1303a76cc65e286729a
--- /dev/null
+++ b/devTools/FC.targets
@@ -0,0 +1,85 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+	<!-- Task to concat files injecting their names in between -->
+	<UsingTask TaskName="ConcatFiles" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
+		<ParameterGroup>
+			<Inputs ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
+			<BaseDir ParameterType="System.String" Required="true" />
+			<Output ParameterType="System.String" Required="true" />
+		</ParameterGroup>
+		<Task>
+			<Using Namespace="System"/>
+			<Using Namespace="System.IO"/>
+			<Code Type="Fragment" Language="cs"><![CDATA[
+				using (StreamWriter output = new StreamWriter(Output)) {
+					int bdl = BaseDir.Length;
+					foreach (ITaskItem item in Inputs) {
+						string inp = item.GetMetadata("FullPath");
+						string rp = inp.StartsWith(BaseDir) ? inp.Substring(bdl) : inp; // a simple relative path
+						output.WriteLine("/* Source: {0} */", rp);
+						output.Write(File.ReadAllText(inp));
+						output.WriteLine();
+					}
+				}
+			]]></Code>
+		</Task>
+	</UsingTask>
+
+	<!-- https://stackoverflow.com/questions/7837644/how-to-replace-string-in-file-using-msbuild -->
+	<UsingTask TaskName="ReplaceFileText" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
+	<ParameterGroup>
+		<InputFilename ParameterType="System.String" Required="true" />
+		<OutputFilename ParameterType="System.String" Required="true" />
+		<MatchExpression ParameterType="System.String" Required="true" />
+		<ReplacementText ParameterType="System.String" Required="true" />
+	</ParameterGroup>
+	<Task>
+		<Using Namespace="System" />
+		<Using Namespace="System.IO" />
+		<Using Namespace="System.Text.RegularExpressions" />
+		<Code Type="Fragment" Language="cs">
+		<![CDATA[
+				File.WriteAllText(
+					OutputFilename,
+					Regex.Replace(File.ReadAllText(InputFilename), MatchExpression, ReplacementText)
+					);
+			]]>
+		</Code>
+	</Task>
+	</UsingTask>
+
+	<UsingTask TaskName="GetToolPath" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
+		<ParameterGroup>
+			<ToolName Required="true" />
+			<LocalPath />
+			<ToolPath Output="true" />
+			<ToolFound ParameterType="System.Boolean" Output="true" />
+		</ParameterGroup>
+		<Task>
+			<Reference Include="Microsoft.Win32.Registry" />
+			<Code Type="Class" Language="cs" Source="$(MSBuildThisFileDirectory)FindToolPath.cs" />
+		</Task>
+	</UsingTask>
+
+
+	<Target Name="FindGitWindows" Condition=" '$([MSBuild]::IsOsPlatform(Windows))' ">
+		<GetToolPath ToolName="git">
+			<Output TaskParameter="ToolPath" PropertyName="GitExe"/>
+			<Output TaskParameter="ToolFound" PropertyName="GitExeFound"/>
+		</GetToolPath>
+	</Target>
+
+	<Target Name="FindGitUnix" Condition=" '$([MSBuild]::IsOSUnixLike())' " >
+		<PropertyGroup>
+			<GitExe>git</GitExe>
+		</PropertyGroup>
+		<Exec Command="$(GitExe) help > /dev/null" IgnoreExitCode="True">
+			<Output TaskParameter="ExitCode" PropertyName="GitExeExitCode" />
+		</Exec>
+		<PropertyGroup>
+			<GitExeFound Condition=" '$(GitExeExitCode)' == '0' " >true</GitExeFound>
+			<GitExeFound Condition=" '$(GitExeExitCode)' != '0' " >false</GitExeFound>
+		</PropertyGroup>
+	</Target>
+
+	<Target Name="FindGit" DependsOnTargets="FindGitWindows;FindGitUnix" />
+</Project>
diff --git a/devTools/FindToolPath.cs b/devTools/FindToolPath.cs
new file mode 100644
index 0000000000000000000000000000000000000000..282dc7020ffc8d43202ad6ea349cb49662da1933
--- /dev/null
+++ b/devTools/FindToolPath.cs
@@ -0,0 +1,127 @@
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+using System;
+using System.IO;
+using System.Linq;
+using System.Text;
+using Microsoft.Win32;
+
+/*
+ Copyright (c) 2014, LoreSoft
+ This class was taken from https://github.com/loresoft/msbuildtasks/ and is licensed under BSD-2 license
+*/
+internal static class ToolPathUtil
+{
+	public static bool SafeFileExists(string path, string toolName)
+	{
+		return SafeFileExists(Path.Combine(path, toolName));
+	}
+
+	public static bool SafeFileExists(string file)
+	{
+		Console.WriteLine(String.Format("Testing {0}", file));
+		try { return File.Exists(file); }
+		catch { } // eat exception
+
+		return false;
+	}
+
+	public static string MakeToolName(string name)
+	{
+		return (Environment.OSVersion.Platform == PlatformID.Unix) ?
+			name : name + ".exe";
+	}
+
+	public static string FindInRegistry(string toolName)
+	{
+		try
+		{
+			RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + toolName, false);
+			if (key != null)
+			{
+				string possiblePath = key.GetValue(null) as string;
+				if (SafeFileExists(possiblePath))
+					return Path.GetDirectoryName(possiblePath);
+			}
+		}
+		catch (System.Security.SecurityException) { }
+
+		return null;
+	}
+
+	public static string FindInPath(string toolName)
+	{
+		string pathEnvironmentVariable = Environment.GetEnvironmentVariable("PATH") ?? string.Empty;
+		string[] paths = pathEnvironmentVariable.Split(new[] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
+		foreach (string path in paths)
+		{
+			if (SafeFileExists(path, toolName))
+			{
+				return path;
+			}
+		}
+
+		return null;
+	}
+
+	public static string FindInProgramFiles(string toolName, params string[] commonLocations)
+	{
+		foreach (string location in commonLocations)
+		{
+			string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), location);
+			if (SafeFileExists(path, toolName))
+			{
+				return path;
+			}
+		}
+
+		return null;
+	}
+
+	public static string FindInLocalPath(string toolName, string localPath)
+	{
+		if (localPath == null)
+			return null;
+
+		string path = new DirectoryInfo(localPath).FullName;
+		if (SafeFileExists(localPath, toolName))
+		{
+			return path;
+		}
+
+		return null;
+	}
+}
+
+public class GetToolPath : Microsoft.Build.Utilities.Task
+{
+	public virtual string ToolName { get; set; }
+	public virtual string LocalPath { get; set; }
+	public virtual string ToolPath { get; set; }
+	public virtual bool Success { get; set; }
+
+	public override bool Execute()
+	{
+		this.ToolPath = null;
+		this.Success = false;
+		string tool = ToolPathUtil.MakeToolName(ToolName);
+
+		string toolDir =
+					ToolPathUtil.FindInPath(tool) ??
+					ToolPathUtil.FindInRegistry(tool) ??
+					ToolPathUtil.FindInProgramFiles(tool, tool) ??
+					ToolPathUtil.FindInProgramFiles(tool, Path.Combine(tool, "bin")) ??
+					ToolPathUtil.FindInLocalPath(tool, LocalPath);
+
+
+		if (toolDir == null)
+		{
+			throw new Exception(String.Format("Could not find {0}. Looked in PATH locations and various common folders inside Program Files as well as LocalPath.", tool));
+		}
+
+		Console.WriteLine("Found {0} at {1}", tool, toolDir);
+		ToolPath = Path.Combine(toolDir, tool);
+		Success = true;
+		return Success;
+	}
+}
diff --git a/fc-pregmod.proj b/fc-pregmod.proj
index 1febb914e2349fd4ab47904523bdc1c6ef075261..186dff1698ea33e430de91e06eb397274e5cba1e 100644
--- a/fc-pregmod.proj
+++ b/fc-pregmod.proj
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="FinalHTML" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+	<Import Project="devTools\FC.targets" />
 	<PropertyGroup>
 		<OutputDirectory>.\bin\</OutputDirectory>
 		<JSMoudleFileName>fc.js</JSMoudleFileName>
@@ -14,18 +15,28 @@
 
 	<PropertyGroup Condition=" '$([MSBuild]::IsOsPlatform(Windows))' ">
 		<TweeGoExe>tweego_win$(ArchitectureSuffix).exe</TweeGoExe>
-    </PropertyGroup>
-    <PropertyGroup Condition=" '$([MSBuild]::IsOsPlatform(Linux))' ">
-    	<TweeGoExe>tweego_nix$(ArchitectureSuffix)</TweeGoExe>
-    </PropertyGroup>
-    <PropertyGroup Condition=" '$([MSBuild]::IsOsPlatform(OSX))' ">
-    	<TweeGoExe>tweego_osx$(ArchitectureSuffix)</TweeGoExe>
-    </PropertyGroup>
-
-	<Target Name="DisplayMessages">
+	</PropertyGroup>
+	<PropertyGroup Condition=" '$([MSBuild]::IsOsPlatform(Linux))' ">
+		<TweeGoExe>tweego_nix$(ArchitectureSuffix)</TweeGoExe>
+	</PropertyGroup>
+	<PropertyGroup Condition=" '$([MSBuild]::IsOsPlatform(OSX))' ">
+		<TweeGoExe>tweego_osx$(ArchitectureSuffix)</TweeGoExe>
+	</PropertyGroup>
+
+	<Target Name="CollectGitInfo" DependsOnTargets="FindGit">
+		<Exec Command="$(GitExe) rev-parse --short HEAD" ConsoleToMsBuild="true" EchoOff="true">
+			<Output TaskParameter="ConsoleOutput" PropertyName="GitHash" />
+		</Exec>
+	</Target>
+
+	<Target Name="DisplayMessages" DependsOnTargets="CollectGitInfo">
+		<Message Text="MSBuildProjectDirectory: $(MSBuildProjectDirectory)" />
 		<Message Text="ArchitectureSuffix: $(ArchitectureSuffix)" Importance="high" />
 		<Message Text="TweeGoExe: $(TweeGoExe)" Importance="high" />
 		<Message Text="PA: $([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)" />
+		<Message Text="Git found: $(GitExeFound)" Importance="high" />
+		<Message Text="Git executable: $(GitExe)" Importance="high" />
+		<Message Text="HEAD commit hash: $(GitHash)" Importance="high" />
     </Target>
 
 	<Target Name="createDirs">
@@ -34,23 +45,35 @@
 
 	<Target Name="JSModule" DependsOnTargets="createDirs;DisplayMessages">
 		<ItemGroup>
-			<jsScripts Include=".\js\**\*.js"></jsScripts>
+			<jsScripts Include=".\js\**\*.js"></jsScripts> <!-- will be sorted aphabetically -->
 		</ItemGroup>
+		<ConcatFiles Inputs="@(jsSCripts)" BaseDir="$(MSBuildProjectDirectory)" Output="$(OutputDirectory)\$(JSMoudleFileName)"/>
+	</Target>
 
-		<!-- Read the contents of the files preserving tabs/spaces. -->
-		<ItemGroup>
-			<FileContents Include="$([System.IO.File]::ReadAllText(%(jsSCripts.FullPath)))"/>
-		</ItemGroup>
+	<Target Name="AlphaDisclaimer" DependsOnTargets="CollectGitInfo" Condition=" '$(GitExeFound)'" >
+		<ReplaceFileText
+			InputFilename="$(MSBuildProjectDirectory)\src\gui\mainMenu\AlphaDisclaimer.tw"
+			OutputFilename="$(MSBuildProjectDirectory)\src\gui\mainMenu\AlphaDisclaimer.tw"
+			MatchExpression="(build: \$releaseID)"
+			ReplacementText="$1, git commit: $(GitHash)"
+		/>
+	</Target>
 
-		<WriteLinesToFile File="$(OutputDirectory)\$(JSMoudleFileName)" Lines="@(FileContents)" Overwrite="true" />
+	<Target Name="ResetAlphaDisclaimer" DependsOnTargets="FindGit" Condition=" '$(GitExeFound)'" >
+		<Exec Command="$(GitExe) checkout -- src/gui/mainMenu/AlphaDisclaimer.tw" />
 	</Target>
 
-	<Target Name="tmpOutput" DependsOnTargets="JSModule">
+	<Target Name="tmpOutput" DependsOnTargets="JSModule;AlphaDisclaimer">
 		<Exec Command="devTools\tweeGo\$(TweeGoExe) --module=$(OutputDirectory)\$(JSMoudleFileName) --head devTools\head.html -o $(OutputDirectory)\tmp.html src\" />
 	</Target>
 
-	<Target Name="FinalHTML" DependsOnTargets="tmpOutput">
+	<Target Name="FinalHTML" DependsOnTargets="tmpOutput;ResetAlphaDisclaimer">
 		<Delete Files="$(OutputDirectory)\$(JSMoudleFileName)" />
 		<Move SourceFiles="$(OutputDirectory)\tmp.html" DestinationFiles="$(OutputDirectory)\FC_pregmod.html" />
 	</Target>
+
+	<Target Name="JavaSanityCheck">
+		<Exec Command="java -jar .\devTools\javaSanityCheck\SanityCheck.jar" />
+	</Target>
+
 </Project>