diff --git a/.gitignore b/.gitignore
index bd7a0ffa9d..b598939a1a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -142,4 +142,5 @@ build/ui-docs.zip
build/csharp-docs.zip
build/msbuild.log
.vs/
-src/packages/
\ No newline at end of file
+src/packages/
+build/tools/
diff --git a/build/Build.bat b/build/Build.bat
index d20eef70fb..85ba809f3b 100644
--- a/build/Build.bat
+++ b/build/Build.bat
@@ -113,18 +113,61 @@ REM This is necessary because SETLOCAL is on in InstallGit.cmd so that one might
REM but the path setting is lost due to SETLOCAL
SET PATH="C:\Program Files (x86)\Git\cmd";"C:\Program Files\Git\cmd";%PATH%
+SET toolsFolder=%CD%\tools\
+IF NOT EXIST %toolsFolder% (
+ MD tools
+)
+
+SET nuGetExecutable=%CD%\tools\nuget.exe
+IF NOT EXIST %nuGetExecutable% (
+ ECHO Getting NuGet so we can fetch some tools
+ ECHO Downloading https://dist.nuget.org/win-x86-commandline/latest/nuget.exe to %nuGetExecutable%
+ powershell -Command "(New-Object Net.WebClient).DownloadFile('https://dist.nuget.org/win-x86-commandline/latest/nuget.exe', '%nuGetExecutable%')"
+)
+
+:: We need 7za.exe for BuildBelle.bat
+IF NOT EXIST %toolsFolder%7za.exe (
+ ECHO 7zip not found - fetching now
+ %nuGetExecutable% install 7-Zip.CommandLine -OutputDirectory %toolsFolder% -Verbosity quiet
+)
+
+:: We need 7za.exe for VS2017+
+IF NOT EXIST %toolsFolder%vswhere.exe (
+ ECHO vswhere not found - fetching now
+ %nuGetExecutable% install vswhere -OutputDirectory %toolsFolder% -Verbosity quiet
+)
+
+:: Put 7za.exe and vswhere.exe in a predictable path (not version specific)
+FOR /f "delims=" %%A in ('dir %toolsFolder%7-Zip.CommandLine.* /b') DO SET "sevenZipExePath=%toolsFolder%%%A\"
+MOVE %sevenZipExePath%tools\7za.exe %toolsFolder%7za.exe
+
+FOR /f "delims=" %%A in ('dir %toolsFolder%vswhere.* /b') DO SET "vswhereExePath=%toolsFolder%%%A\"
+MOVE %vswhereExePath%tools\vswhere.exe %toolsFolder%vswhere.exe
+
ECHO.
ECHO Making sure we have a web.config
IF NOT EXIST "%CD%\..\src\Umbraco.Web.UI\web.config" COPY "%CD%\..\src\Umbraco.Web.UI\web.Template.config" "%CD%\..\src\Umbraco.Web.UI\web.config"
+for /f "usebackq tokens=1* delims=: " %%i in (`%CD%\tools\vswhere.exe -latest -requires Microsoft.Component.MSBuild`) do (
+ if /i "%%i"=="installationPath" set InstallDir=%%j
+)
+
+SET VSWherePath="%InstallDir%\MSBuild"
+
+ECHO.
+ECHO Visual Studio is installed in: %InstallDir%
+
+SET MSBUILDPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
+SET MSBUILD="%MSBUILDPATH%\MsBuild.exe"
+
ECHO.
ECHO Reporting NuGet version
-"%CD%\..\src\.nuget\NuGet.exe" help | findstr "^NuGet Version:"
+"%nuGetExecutable%" help | findstr "^NuGet Version:"
ECHO.
ECHO Restoring NuGet packages
ECHO Into %nuGetFolder%
-"%CD%\..\src\.nuget\NuGet.exe" restore "%CD%\..\src\umbraco.sln" -Verbosity Quiet -NonInteractive -PackagesDirectory "%nuGetFolder%"
+"%nuGetExecutable%" restore "%CD%\..\src\umbraco.sln" -Verbosity Quiet -NonInteractive -PackagesDirectory "%nuGetFolder%"
IF ERRORLEVEL 1 GOTO :error
ECHO.
@@ -134,7 +177,7 @@ ECHO This takes a few minutes and logging is set to report warnings
ECHO and errors only so it might seems like nothing is happening for a while.
ECHO You can check the msbuild.log file for progress.
ECHO.
-%MSBUILD% "Build.proj" /p:BUILD_RELEASE=%RELEASE% /p:BUILD_COMMENT=%COMMENT% /p:NugetPackagesDirectory="%nuGetFolder%" /consoleloggerparameters:Summary;ErrorsOnly /fileLogger
+%MSBUILD% "Build.proj" /p:BUILD_RELEASE=%RELEASE% /p:BUILD_COMMENT=%COMMENT% /p:NugetPackagesDirectory="%nuGetFolder%" /p:VSWherePath=%VSWherePath% /consoleloggerparameters:Summary;ErrorsOnly /fileLogger
IF ERRORLEVEL 1 GOTO error
ECHO.
diff --git a/build/BuildBelle.bat b/build/BuildBelle.bat
index 8a07ee380a..ae2d5ba8b5 100644
--- a/build/BuildBelle.bat
+++ b/build/BuildBelle.bat
@@ -1,33 +1,58 @@
@ECHO OFF
SETLOCAL
+ :: SETLOCAL is on, so changes to the path not persist to the actual user's path
-SET release=%1
-ECHO Installing Npm NuGet Package
-
-SET nuGetFolder=%CD%\..\src\packages\
-ECHO Configured packages folder: %nuGetFolder%
+SET toolsFolder=%CD%\tools\
ECHO Current folder: %CD%
-%CD%\..\src\.nuget\NuGet.exe install Npm.js -OutputDirectory %nuGetFolder% -Verbosity quiet
+SET nodeFileName=node-v6.9.1-win-x86.7z
+SET nodeExtractFolder=%toolsFolder%node.js.691
-for /f "delims=" %%A in ('dir %nuGetFolder%node.js.* /b') do set "nodePath=%nuGetFolder%%%A\"
-for /f "delims=" %%A in ('dir %nuGetFolder%npm.js.* /b') do set "npmPath=%nuGetFolder%%%A\tools\"
+IF NOT EXIST %nodeExtractFolder% (
+ ECHO Downloading http://nodejs.org/dist/v6.9.1/%nodeFileName% to %toolsFolder%%nodeFileName%
+ powershell -Command "(New-Object Net.WebClient).DownloadFile('http://nodejs.org/dist/v6.9.1/%nodeFileName%', '%toolsFolder%%nodeFileName%')"
+ ECHO Extracting %nodeFileName% to %nodeExtractFolder%
+ %toolsFolder%\7za.exe x %toolsFolder%\%nodeFileName% -o%nodeExtractFolder% -aos > nul
+)
+FOR /f "delims=" %%A in ('dir %nodeExtractFolder%\node* /b') DO SET "nodePath=%nodeExtractFolder%\%%A"
-ECHO Adding Npm and Node to path
-REM SETLOCAL is on, so changes to the path not persist to the actual user's path
-PATH=%npmPath%;%nodePath%;%PATH%
+SET nuGetExecutable=%CD%\tools\nuget.exe
+IF NOT EXIST %nuGetExecutable% (
+ ECHO Downloading https://dist.nuget.org/win-x86-commandline/latest/nuget.exe to %nuGetExecutable%
+ powershell -Command "(New-Object Net.WebClient).DownloadFile('https://dist.nuget.org/win-x86-commandline/latest/nuget.exe', '%nuGetExecutable%')"
+)
-SET buildFolder=%CD%
+SET drive=%CD:~0,2%
+SET nuGetFolder=%drive%\packages\
+FOR /f "delims=" %%A in ('dir %nuGetFolder%npm.* /b') DO SET "npmPath=%nuGetFolder%%%A\"
+IF [%npmPath%] == [] GOTO :installnpm
+IF NOT [%npmPath%] == [] GOTO :build
-ECHO Change directory to %CD%\..\src\Umbraco.Web.UI.Client\
-CD %CD%\..\src\Umbraco.Web.UI.Client\
+:installnpm
+ ECHO Downloading npm
+ ECHO Configured packages folder: %nuGetFolder%
+ ECHO Installing Npm NuGet Package
+ %nuGetExecutable% install Npm -OutputDirectory %nuGetFolder% -Verbosity detailed
+ REM Ensures that we look for the just downloaded NPM, not whatever the user has installed on their machine
+ FOR /f "delims=" %%A in ('dir %nuGetFolder%npm.* /b') DO SET "npmPath=%nuGetFolder%%%A\"
+ GOTO :build
-ECHO Do npm install and the grunt build of Belle
-call npm cache clean --quiet
-call npm install --quiet
-call npm install -g grunt-cli --quiet
-call npm install -g bower --quiet
-call grunt build --buildversion=%release%
+:build
+ ECHO Adding Npm and Node to path
+ REM SETLOCAL is on, so changes to the path not persist to the actual user's path
+ PATH=%npmPath%;%nodePath%;%PATH%
-ECHO Move back to the build folder
-CD %buildFolder%
\ No newline at end of file
+ SET buildFolder=%CD%
+
+ ECHO Change directory to %CD%\..\src\Umbraco.Web.UI.Client\
+ CD %CD%\..\src\Umbraco.Web.UI.Client\
+
+ ECHO Do npm install and the grunt build of Belle
+ call npm cache clean --quiet
+ call npm install --quiet
+ call npm install -g grunt-cli --quiet
+ call npm install -g bower --quiet
+ call grunt build --buildversion=%release%
+
+ ECHO Move back to the build folder
+ CD %buildFolder%
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
index 1b3a44644b..9e0c125c30 100644
--- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
+++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
@@ -2388,14 +2388,31 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\"
-
-
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+
+
+
diff --git a/src/umbraco.presentation.targets b/src/umbraco.presentation.targets
deleted file mode 100644
index 2a33705d6f..0000000000
--- a/src/umbraco.presentation.targets
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
- $(MSBuildStartupDirectory)\..\src\
-
-
-
-
- $(SolutionDir)
- $(Computername).
-
-
-
- $(ProjectDir)
- $(WebProjectOutputDir)
- $(ProjDir)web.Template.$(ConfigEnvironment)$(Configuration).config
-
-
-
- $(ProjDir)web.Template.$(Configuration).config
-
-
-
- $(ProjDir)
-
-
-
- $(ProjOutputDir)\
-
-
-
-
-
-
-
-
- $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll
-
-
-
- $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll
-
-
-
- $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll
-
-
-
- $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll
-
-
-
- $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll
-
-
-
-
-
-
-
-
-
-
-
- @(ConfigFiles)
- $(OriginalFileName.Replace("%(ConfigFiles.Extension)",".$(Configuration)%(ConfigFiles.Extension)"))
- $(OriginalFileName.Replace("$(ProjDir)", "$(ProjOutputDir)"))
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file