diff --git a/GetRuntime.cmd b/GetRuntime.cmd
deleted file mode 100644
index 85ce4b9abc5c..000000000000
--- a/GetRuntime.cmd
+++ /dev/null
@@ -1,18 +0,0 @@
-@echo off
-cd %~dp0
-
-SETLOCAL
-SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe
-
-IF EXIST %CACHED_NUGET% goto copynuget
-echo Downloading latest version of NuGet.exe...
-IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet
-@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '%CACHED_NUGET%'"
-
-:copynuget
-IF EXIST .nuget\nuget.exe goto restore
-md .nuget
-copy %CACHED_NUGET% .nuget\nuget.exe > nul
-
-:restore
-.nuget\NuGet.exe install ProjectK -o packages -nocache -pre
diff --git a/K.cmd b/K.cmd
deleted file mode 100644
index b50ffdf586b1..000000000000
--- a/K.cmd
+++ /dev/null
@@ -1,30 +0,0 @@
-@ECHO OFF
-
-SETLOCAL ENABLEDELAYEDEXPANSION
-
-SET CURRDIR=%CD%
-SET PARENTDIR=!CURRDIR!
-
-:START
-IF EXIST !CURRDIR!\packages\ProjectK* FOR /F %%I IN ('DIR !CURRDIR!\packages\ProjectK* /B /O:-D') DO (SET ProjectKDir=%%I& GOTO :ENDFOR)
-:ENDFOR
-
-SET LocalKCmd=!CURRDIR!\packages\!ProjectKDir!\tools\k.cmd
-
-IF NOT EXIST !LocalKCmd! (
- CALL :RESOLVE !CURRDIR!\.. PARENTDIR
- IF !CURRDIR!=="!PARENTDIR!" (
- ECHO Unable to locate the ProjectK runtime
- ENDLOCAL & EXIT /b 1
- ) ELSE (
- SET CURRDIR="!PARENTDIR!"
- GOTO :START
- )
-)
-
-CALL !LocalKCmd! %*
-ENDLOCAL & EXIT /b %ERRORLEVEL%
-
-:RESOLVE
-SET %2=%~f1
-GOTO :EOF
diff --git a/kvm.cmd b/kvm.cmd
new file mode 100644
index 000000000000..3f68bd86de57
--- /dev/null
+++ b/kvm.cmd
@@ -0,0 +1,187 @@
+@ECHO OFF
+IF "%1"=="" (
+ CALL :cmd_help
+) ELSE (
+ CALL :cmd_%1 %*
+ IF ERRORLEVEL 1 CALL:cmd_help
+)
+GOTO:EOF
+
+
+:cmd_setup
+SET "_KVM_PATH=%USERPROFILE%\.k\"
+SET "_TEMP_PATH=%PATH%"
+
+IF /I NOT "%~dp0"=="%_KVM_PATH%" (
+ IF NOT EXIST "%_KVM_PATH%" MKDIR "%_KVM_PATH%"
+ COPY "%~f0" "%_KVM_PATH%kvm.cmd"
+)
+
+:PARSE_START
+@IF "%_TEMP_PATH%"=="" GOTO PARSE_END
+@FOR /F "tokens=1* delims=;" %%a in ("%_TEMP_PATH%") Do @IF "%%a"=="%_KVM_PATH%" GOTO:end_setup
+@FOR /F "tokens=1* delims=;" %%a in ("%_TEMP_PATH%") Do @SET _TEMP_PATH=%%b
+@GOTO PARSE_START
+:PARSE_END
+
+SET "PATH=%PATH%;%_KVM_PATH%"
+powershell -NoProfile -ExecutionPolicy unrestricted -Command "[Environment]::SetEnvironmentVariable('PATH',[Environment]::GetEnvironmentVariable('PATH','user')+';%_KVM_PATH%','user');"
+
+
+:end_setup
+CALL "%_KVM_PATH%kvm.cmd" upgrade
+@ECHO Running crossgen, see crossgen.log for results
+CALL "%_KVM_PATH%k.cmd" crossgen --in %_KVM_PATH%packages\ProjectK.%_KVM_VERSION%\tools\k10 >crossgen.log 2>crossgen.err.log
+SET _KVM_PATH=
+SET _TEMP_PATH=
+GOTO:EOF
+
+
+:cmd_upgrade
+CALL:cmd_install install
+CALL:cmd_alias alias default %_KVM_VERSION%
+GOTO:EOF
+
+
+:cmd_install
+IF NOT EXIST "%~dp0.nuget\NuGet.exe" (
+ IF NOT EXIST "%~dp0.nuget" MKDIR "%~dp0.nuget"
+ ECHO Downloading latest version of NuGet.exe...
+ @powershell -NoProfile -ExecutionPolicy unrestricted -Command "((new-object net.webclient).DownloadFile('https://nuget.org/nuget.exe', '%~dp0.nuget\NuGet.exe'))"
+)
+
+IF NOT EXIST "%~dp0.nuget\NuGet.config" (
+echo ^ >"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+echo ^ >>"%~dp0.nuget\NuGet.config"
+)
+
+IF "%2"=="" (
+ echo Finding latest version
+ FOR /f "tokens=1,2" %%G in ('"%~dp0.nuget\NuGet.exe" list ProjectK -Prerelease -ConfigFile %~dp0.nuget\NuGet.config') DO (
+ IF "%%G"=="ProjectK" (
+ SET _KVM_VERSION=%%H
+ )
+ )
+) ELSE (
+ SET "_KVM_VERSION=%2"
+)
+
+ECHO Downloading version %_KVM_VERSION%
+"%~dp0.nuget\NuGet.exe" install ProjectK -Version %_KVM_VERSION% -OutputDirectory "%~dp0packages" -ConfigFile "%~dp0.nuget\NuGet.config"
+
+CALL:cmd_use use %_KVM_VERSION%
+GOTO:EOF
+
+
+:cmd_use
+IF NOT EXIST "%~dp0k.cmd" (
+ ECHO @CALL %%~dp0kvm.cmd k %%* >%~dp0k.cmd
+)
+IF EXIST "%~dp0alias\%2.txt" (
+ FOR /F %%G IN (%~dp0alias\%2.txt) DO (
+ ECHO Setting _KVM_VERSION to '%%G'
+ SET "_KVM_VERSION=%%G"
+ )
+) ELSE (
+ IF NOT EXIST "%~dp0packages\ProjectK.%2\tools\k.cmd" (
+ ECHO Version '%2' not found.
+ ECHO You may need to run 'kvm install %2'
+ GOTO:EOF
+ )
+ ECHO Setting _KVM_VERSION to '%2'
+ SET "_KVM_VERSION=%2"
+)
+GOTO:EOF
+
+
+:cmd_alias
+IF NOT EXIST "%~dp0alias" (
+ MKDIR "%~dp0alias"
+)
+IF "%3"=="" (
+ IF "%2"=="" (
+ DIR "%~dp0alias" /b
+ ) ELSE (
+ ECHO Alias '%2' is
+ TYPE "%~dp0alias\%2.txt"
+ )
+) ELSE (
+ IF NOT EXIST "%~dp0packages\ProjectK.%3\tools\k.cmd" (
+ ECHO Version '%3' not found.
+ ECHO You may need to run 'kvm install %3'
+ GOTO:EOF
+ )
+
+ ECHO Setting alias '%2' to '%3'
+ ECHO %3>%~dp0alias\%2.txt
+)
+GOTO:EOF
+
+
+:cmd_list
+dir /b "%~dp0packages\ProjectK*"
+GOTO:EOF
+
+
+:cmd_k
+@REM find k.cmd in local paths
+
+@REM read _KVM_VERSION.txt if _KVM_VERSION not set
+IF "%_KVM_VERSION%" == "" (
+ FOR /F %%G IN (%~dp0alias\default.txt) DO (
+ SET "_KVM_VERSION=%%G"
+ )
+)
+IF NOT EXIST "%~dp0packages\ProjectK.%_KVM_VERSION%\tools\k.cmd" (
+ ECHO Version '%_KVM_VERSION%' not found.
+ ECHO You may need to run 'kvm install %_KVM_VERSION%'
+) ELSE (
+ CALL "%~dp0packages\ProjectK.%_KVM_VERSION%\tools\k.cmd" %2 %3 %4 %5 %6 %7 %8 %9
+)
+GOTO:EOF
+
+
+:cmd_help
+ECHO kvm ^ [args...]
+ECHO k version manager
+ECHO .
+ECHO kvm help
+ECHO displays this help
+ECHO .
+ECHO kvm upgrade
+ECHO install latest k version and make it the default
+ECHO .
+ECHO kvm install ^
+ECHO install and use specific k version
+ECHO .
+ECHO kvm list
+ECHO list installed k versions
+ECHO .
+ECHO kvm use ^^|^
+ECHO use a version or alias within the current command prompt
+ECHO .
+ECHO kvm alias ^ ^
+ECHO create alias to a specific version
+ECHO alias names may be passed to 'kvm use ^'
+ECHO the alias 'default' determines the default k version
+ECHO when kvm use is not called
+ECHO .
+ECHO kvm alias ^
+ECHO show the version of an alias
+ECHO .
+ECHO kvm alias
+ECHO list aliases
+ECHO .
+
+GOTO:EOF
+
+