diff --git a/bin/update.bat b/bin/update.bat
new file mode 100644
index 0000000..9da7e3c
--- /dev/null
+++ b/bin/update.bat
@@ -0,0 +1,9 @@
+@ECHO OFF
+SET full_path=%~dp0
+IF EXIST %full_path%update.js (
+        cscript "%full_path%update.js" %* //nologo
+) ELSE (
+    ECHO.
+    ECHO ERROR: Could not find 'update.js' in 'bin' folder, aborting...>&2
+    EXIT /B 1
+)
\ No newline at end of file
diff --git a/bin/update.js b/bin/update.js
new file mode 100644
index 0000000..8ea38a8
--- /dev/null
+++ b/bin/update.js
@@ -0,0 +1,353 @@
+/*
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+
+var fso           = WScript.CreateObject("Scripting.FileSystemObject");
+var wscript_shell = WScript.CreateObject("WScript.Shell");
+var shell         = WScript.CreateObject("shell.application");
+var args          = WScript.Arguments;
+// working dir
+var ROOT = WScript.ScriptFullName.split('\\bin\\update.js').join('');
+//Get version number
+var VERSION = read(ROOT+'\\VERSION').replace(/\r\n/,'').replace(/\n/,'');
+var plugins_folder = "\\Plugins";
+var template_folder = "\\templates\\standalone";
+// anything thats missing to the project
+var overwrite = false;
+var replace = false;
+
+// usage function
+function Usage() {
+    Log("WARNING : Make sure to back up your project before updating!")
+    Log("Usage: update Path-To-Project ");//[ -f | -r ] ");
+    Log("    Path-To-Old-Project : The path the project you would like to update.");
+    //Log("                     -f : Will forcefully overwrite and add all core components of the application.");
+    //Log("                     -r : Will create an updated project, only keeping the www assets. *NOTE: no native code will be preserved*");
+    Log("examples:");
+    Log("    update C:\\Users\\anonymous\\Desktop\\MyProject");
+}
+
+// logs messaged to stdout and stderr
+function Log(msg, error) {
+    if (error) {
+        WScript.StdErr.WriteLine(msg);
+    }
+    else {
+        WScript.StdOut.WriteLine(msg);
+    }
+}
+
+// executes a commmand in the shell
+function exec(command) {
+    //Log("Command : " + command);
+    var oShell=wscript_shell.Exec(command);
+    while (oShell.Status === 0) {
+        WScript.sleep(100);
+    }
+}
+
+// executes a commmand in the shell
+function exec_verbose(command) {
+    Log("Command: " + command);
+    var oShell=wscript_shell.Exec(command);
+    while (oShell.Status == 0) {
+        //Wait a little bit so we're not super looping
+        WScript.sleep(100);
+        //Print any stdout output from the script
+        if (!oShell.StdOut.AtEndOfStream) {
+            var line = oShell.StdOut.ReadAll();
+            Log(line);
+        }
+    }
+    //Check to make sure our scripts did not encounter an error
+    if (!oShell.StdErr.AtEndOfStream) {
+        var line = oShell.StdErr.ReadAll();
+        Log(line, true);
+        WScript.Quit(2);
+    }
+}
+
+var ForReading = 1, ForWriting = 2, ForAppending = 8;
+var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
+
+// returns the contents of a file
+function read(filename) {
+    if (fso.FileExists(filename)) {
+        var f=fso.OpenTextFile(filename, 1, 2);
+        var s=f.ReadAll();
+        f.Close();
+        return s;
+    }
+    else {
+        Log('Cannot read non-existant file : ' + filename, true);
+        WScript.Quit(2);
+    }
+    return null;
+}
+
+// writes the contents to the specified file
+function write(filename, contents) {
+    var f=fso.OpenTextFile(filename, ForWriting, TristateTrue);
+    f.Write(contents);
+    f.Close();
+}
+
+// replaces the matches of regexp with replacement
+function replaceInFile(filename, regexp, replacement) {
+    var text = read(filename).replace(regexp,replacement);
+    write(filename,text);
+}
+
+// returns true if the given path is the root of a cordova windows phone project
+// currently returns true if the folder contains a .csproj file.
+function is_windows_phone_project(path) {
+    if (fso.FolderExists(path)) {
+        var proj_folder = fso.GetFolder(path);
+        var proj_files = new Enumerator(proj_folder.Files);
+        for (;!proj_files.atEnd(); proj_files.moveNext()) {
+            if (fso.GetExtensionName(proj_files.item()) == 'csproj') {
+                return true;  
+            }
+        }
+    }
+    return false;
+}
+
+// returns the name of the application
+function get_app_name(path) {
+    var WMAppManifest = read(path + '\\Properties\\WMAppManifest.xml').split('\n');
+    for (line in WMAppManifest) {
+        if (WMAppManifest[line].match(/Title\=\"/)) {
+            return WMAppManifest[line].split('Title="')[1].split('"')[0];
+        }
+    }
+    Log("Error : unable to find applicaiton name in the project.", true);
+    Log(" Path : " + path, true);
+    WScript.Quit(2);
+}
+
+// returns the name of the application package
+function get_package_name(path) {
+    var WMAppManifest = read(path + '\\Properties\\WMAppManifest.xml').split('\n');
+    for (line in WMAppManifest) {
+        if (WMAppManifest[line].match(/Title\=\"/)) {
+            return WMAppManifest[line].split('Title="')[1].split('"')[0];
+        }
+    }
+    Log("Error : unable to find applicaiton name in the project.", true);
+    Log(" Path : " + path, true);
+    WScript.Quit(2);
+}
+
+// returns the GUID ame of the application
+function get_app_GUID(path) {
+    var AppXAML = read(path + '\\App.xaml').split('\n');
+    for (line in AppXAML) {
+        if (AppXAML[line].match(/x\:Class\=\"/)) {
+            return AppXAML[line].split('Class="')[1].split('"')[0];
+        }
+    }
+    Log("Error : unable to find package name in the project.", true);
+    Log(" Path : " + path, true);
+    WScript.Quit(2);
+}
+
+// updates the cordova.js and all references in the given project with this repositories version
+function update_cordova_js(path) {
+    // remove old cordova.js
+    var www_contents = shell.NameSpace(path + '\\www').Items();
+    for(i = 0; i < www_contents.Count; i++)
+    {
+        if(www_contents.Item(i).Name.match(/cordova\-(\d+)[.](\d+)[.](\d+)(rc\d)?[.]js/))
+        {
+            fso.DeleteFile(path + '\\www\\' + www_contents.Item(i).Name);
+        }
+    }
+    // update version file
+    copy_to(ROOT + "\\VERSION",  path + "\\VERSION");
+    // copy over new cordova.js
+    copy_to(ROOT + template_folder + "\\www\\cordova.js", path + "\\www\\cordova.js");
+
+    // update corodva references
+    var cordova_regex = /cordova-(\d+)[.](\d+)[.](\d+)(rc\d)?/g; //Matches *first* cordova-x.x.x[rcx] (just ad g at end to make global)
+    // update references in index.html
+    replaceInFile(path + '\\www\\index.html', cordova_regex,  "cordova");
+    version_regex = /return\s*\"(\d+)[.](\d+)[.](\d+)(rc\d)?/; //Matches return "x.x.x[rcx]
+    // update references in Device.cs
+    replaceInFile(path + '\\Plugins\\Device.cs', version_regex,  "return \"" + VERSION);
+}
+
+// Copies assets that need to be saved from source to desination.
+// TODO : Add all critical assets here
+function save_restore(source, destination) {
+    fso.CreateFolder(destination + '\\www');
+    copy_to(source + '\\www', destination + '\\www');
+    copy_to(source + '\\SplashScreenImage.jpg', destination + '\\SplashScreenImage.jpg');
+    copy_to(source + '\\Background.png', destination + '\\Background.png');
+    copy_to(source + '\\ApplicationIcon.png', destination + '\\ApplicationIcon.png');
+    copy_to(source + '\\config.xml', destination + '\\config.xml');
+}
+
+// deletes the path element if it exists
+function delete_if_exists(path) {
+    if (fso.FolderExists(path)) {
+        fso.DeleteFolder(path);
+    }
+    else if (fso.FileExists(path)) {
+        fso.DeleteFile(path);
+    }
+}
+
+// copies a folder or file from source to destination
+function copy_to(source, destination) {
+    // check that source exists
+    if (!fso.FolderExists(source)) {
+        if (!fso.FileExists(source)) {
+            Log("Error : Could not copy file/folder because it doesn't exist.", true);
+            Log("      File/Folder : " + source, true);
+            WScript.Quit(2);
+        }
+    }
+    // if source is a folder, then copy all folder contents
+    if (fso.FolderExists(source)) {
+        fso.CopyFolder(source, destination, true);
+    } 
+    // if it's a file, just copy it.
+    else { 
+        exec('%comspec% /c copy /Y /V ' + source + ' ' + destination);
+    }
+}
+
+// updates the cordova.js in project along with the cordova tooling.
+function update_project(path) {
+    // update cordova folder
+    delete_if_exists(path + '\\cordova');
+    fso.CreateFolder(path + '\\cordova');
+    copy_to(ROOT + template_folder + '\\cordova', path + '\\cordova');
+    // clean project (all generated files)
+    exec(path + '\\cordova\\clean.bat');
+
+    // update core cordovalib
+    delete_if_exists(path + '\\cordovalib');
+    fso.CreateFolder(path + '\\cordovalib');
+    copy_to(ROOT + template_folder + '\\cordovalib', path + '\\cordovalib');
+
+    // update core plugins
+    // TODO : Remove for 3.0.0
+    delete_if_exists(path + '\\Plugins');
+    fso.CreateFolder(path + '\\Plugins');
+    copy_to(ROOT + template_folder + '\\Plugins', path + '\\Plugins');
+
+    // update cordova.js
+    update_cordova_js(path);
+}
+
+// Replaces the current project with a newly created project, keeping important assets to preserve the app.
+// TODO: Things that need to be kept other then www
+// - WMAppManifest (capabilities etc...)
+// - GUID (for marketplace apps etc...)
+// - Splashscreen and other images etc...
+// - Find more things that should be kept
+function replace_project(path) {
+    //create new project and move www assets into it.
+    Log("WARNING : Upgrading your app with the \'-r\' flag will delete all native and plugin");
+    Log(" components of your application and replace them with the updated core components given");
+    Log(" by this platforms \'bin\\create\' script.  It is *HIGHLY RECOMMENDED* to back up your app");
+    Log(" before continuing. The name and package name along with all of the www assets will be");
+    Log(" preserved. Are you sure you wish to continue? (Y/N)");
+    var response;
+    while (response != 'Y') {
+        response = WScript.StdIn.ReadLine();
+        if (response == 'N') {
+            WScript.Quit(2);
+        } else if (response != "Y") {
+            Log("Error :  did not recognize '" + response + "'");
+            Log("Are you sure you wish to continue? (Y/N)");
+        }
+    }
+    // place all assets to be preserved in a temperary folder
+    delete_if_exists(ROOT + '\\temp');
+    fso.CreateFolder(ROOT + '\\temp');
+    save_restore(path, ROOT + '\\temp');
+
+    // get app name from WMAppManifest
+    var app_name = get_app_name(path);
+    // get package name from App.xaml
+    var package_name = get_package_name(path);
+    // get the GUID so that app stays the same
+    var app_GUID = get_app_GUID(path);
+    // delete previous project
+    delete_if_exists(path);
+    // create the new project from the current repository
+    exec(ROOT + '\\bin\\create.bat ' + path + ' ' + app_name + ' ' + package_name);
+    // remove default www assets
+    delete_if_exists(path + '\\www');
+    // move www assets back to project folder
+    save_restore(ROOT + '\\temp', path);
+    // cleanup temp folder
+    delete_if_exists(ROOT + '\\temp');
+}
+
+
+
+if (args.Count() > 0) {
+    if(args.Count() > 2) {
+        Log("Error : too many arguments provided.", true);
+        WScript.Quit(1);
+    }
+
+    if (args(0).indexOf("--help") > -1 ||
+          args(0).indexOf("/?") > -1 ) {
+        Usage();
+        WScript.Quit(1);
+    }
+    else if (fso.FolderExists(args(0)) && is_windows_phone_project(args(0))) {
+        if(args.Count() > 1) {
+            /*if(args(1) == '-f' || args(1) == '--force') {
+                //TODO: do something for this
+                Log("ERROR : NOT IMPLEMENTED", true);
+                WScript.Quit(2);
+            }
+            else if(args(1) == '-r' || args(1) == '--replace') {
+                replace_project(args(0));
+            }
+            else {
+                Log('Error : \'' + args(1) + '\' is not regognized as an update option', true);
+            }*/
+            Usage();
+            Log('Error : too many arguments', true);
+        } else if (args.Count() == 1) {
+            update_project(args(0));
+        }
+    }
+    else if (fso.FolderExists(args(0))) {
+        Log("The path provided is not a path to a cordova windows phone project.", true);
+        Log(" Please provide the path to the root folder of your cordova windows phone project.", true);
+        WScript.Quit(2);
+    }
+    else {
+        Log("The given path to the project does not exist.", true);
+        Log(" Please provide a path to the project you would like to update.", true);
+        Usage();
+        WScript.Quit(2);
+    }
+}
+else {
+    Usage();
+    WScript.Quit(1);
+}
\ No newline at end of file
diff --git a/templates/vs/MyTemplateStandAlone.vstemplate b/templates/vs/MyTemplateStandAlone.vstemplate
index 34b949d..0de2a0e 100644
--- a/templates/vs/MyTemplateStandAlone.vstemplate
+++ b/templates/vs/MyTemplateStandAlone.vstemplate
@@ -98,7 +98,7 @@
       <ProjectItem ReplaceParameters="false" TargetFileName="SplashScreenImage.jpg">SplashScreenImage.jpg</ProjectItem>
       <ProjectItem ReplaceParameters="false" TargetFileName="VERSION">VERSION</ProjectItem>
       <Folder Name="www" TargetFolderName="www">
-        <ProjectItem ReplaceParameters="true" TargetFileName="cordova-2.7.0.js">cordova-2.7.0.js</ProjectItem>
+        <ProjectItem ReplaceParameters="true" TargetFileName="cordova.js">cordova.js</ProjectItem>
         <Folder Name="css" TargetFolderName="css">
           <ProjectItem ReplaceParameters="true" TargetFileName="index.css">index.css</ProjectItem>
         </Folder>
@@ -110,6 +110,36 @@
           <ProjectItem ReplaceParameters="true" TargetFileName="index.js">index.js</ProjectItem>
         </Folder>
       </Folder>
+      <Folder Name="cordova" TargetFolderName="cordova">
+        <ProjectItem ReplaceParameters="false" TargetFileName="build.bat">build.bat</ProjectItem>
+        <ProjectItem ReplaceParameters="false" TargetFileName="clean.bat">clean.bat</ProjectItem>
+        <ProjectItem ReplaceParameters="false" TargetFileName="log.bat">log.bat</ProjectItem>
+        <ProjectItem ReplaceParameters="false" TargetFileName="run.bat">run.bat</ProjectItem>
+        <ProjectItem ReplaceParameters="false" TargetFileName="version.bat">version.bat</ProjectItem>
+        <Folder Name="lib" TargetFolderName="lib">
+          <ProjectItem ReplaceParameters="false" TargetFileName="build.js">build.js</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="clean.js">clean.js</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="deploy.js">deploy.js</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="install-device.bat">install-device.bat</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="install-emulator.bat">install-emulator.bat</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="list-devices.bat">list-devices.bat</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="list-emulator-images.bat">list-emulator-images.bat</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="list-started-emulators.bat">list-started-emulators.bat</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="log.js">log.js</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="start-emulator.bat">start-emulator.bat</ProjectItem>
+          <ProjectItem ReplaceParameters="false" TargetFileName="target-list.js">target-list.js</ProjectItem>
+          <Folder Name="CordovaDeploy" TargetFolderName="CordovaDeploy">
+            <ProjectItem ReplaceParameters="false" TargetFileName="CordovaDeploy.sln">CordovaDeploy.sln</ProjectItem>
+            <Folder Name="CordovaDeploy" TargetFolderName="CordovaDeploy">
+              <ProjectItem ReplaceParameters="false" TargetFileName="CordovaDeploy.csproj">CordovaDeploy.csproj</ProjectItem>
+              <ProjectItem ReplaceParameters="false" TargetFileName="Program.cs">Program.cs</ProjectItem>
+              <Folder Name="Properties" TargetFolderName="Properties">
+                <ProjectItem ReplaceParameters="false" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
+              </Folder>
+            </Folder>
+          </Folder>
+        </Folder>
+      </Folder>
     </Project>
   </TemplateContent>
 </VSTemplate>
\ No newline at end of file
diff --git a/tooling/scripts/buildjs.js b/tooling/scripts/buildjs.js
index b5c51ad..4bfba53 100644
--- a/tooling/scripts/buildjs.js
+++ b/tooling/scripts/buildjs.js
@@ -38,9 +38,6 @@
     VERSION = read(ROOT+'\\VERSION').replace(/\r\n/,'').replace(/\n/,''),
     BUILD_DESTINATION;
 
-function Log(msg) {
-    WScript.StdOut.WriteLine(msg);
-}
 
 // help function
 function Usage()
@@ -58,6 +55,16 @@
     Log("");
 }
 
+// logs messaged to stdout and stderr
+function Log(msg, error) {
+    if (error) {
+        WScript.StdErr.WriteLine(msg);
+    }
+    else {
+        WScript.StdOut.WriteLine(msg);
+    }
+}
+
 // returns the contents of a file
 function read(filename) {
     //Log('Reading in ' + filename);
@@ -101,7 +108,7 @@
     if(!oShell.StdErr.AtEndOfStream)
     {
         var err_line = oShell.StdErr.ReadAll();
-        WScript.StdErr.WriteLine(err_line);
+        Log(err_line, true);
         WScript.Quit(1);
     }
 }
@@ -134,8 +141,8 @@
 
     //copy the javascript wherever it needs to go.
     wscript_shell.CurrentDirectory = path + '\\temp\\cordova-js\\pkg';
-    exec('%comspec% /c copy /Y cordova.windowsphone.js ' + path + STANDALONE_PATH + '\\www\\cordova-' + VERSION + '.js');
-    exec('%comspec% /c copy /Y cordova.windowsphone.js ' + path + EXAMPLE_PATH + '\\www\\cordova-' + VERSION + '.js');
+    exec('%comspec% /c copy /Y cordova.windowsphone.js ' + path + STANDALONE_PATH + '\\www\\cordova.js');
+    exec('%comspec% /c copy /Y cordova.windowsphone.js ' + path + EXAMPLE_PATH + '\\www\\cordova.js');
 
     //TODO: Delete old cordova.js (done in reversion.js)
 
@@ -154,10 +161,10 @@
         }
         else
         {
-            Log("ERROR: The given path is not a cordova-wp7 repo, or");
-            Log(" does not exist. If your trying to reversion a");
-            Log(" cordova repo other then this one, please provide");
-            Log(" it's path in the form: -p:C:\\Path\\to\\repo");
+            Log("ERROR: The given path is not a cordova-wp7 repo, or", true);
+            Log(" does not exist. If your trying to reversion a", true);
+            Log(" cordova repo other then this one, please provide", true);
+            Log(" it's path in the form: -p:C:\\Path\\to\\repo", true);
             WScript.Quit(1);
         }
         
@@ -193,8 +200,8 @@
     else if(set_path(arg(0))) {} //do nothing
     else
     {
-        Log("The provided version number is invalid, please provide");
-        Log(" a version number in the format Major.Minor.Fix[rc#]");
+        Log("The provided version number is invalid, please provide", true);
+        Log(" a version number in the format Major.Minor.Fix[rc#]", true);
         Usage();
         WScript.Quit(1);
     }
diff --git a/tooling/scripts/dist.js b/tooling/scripts/dist.js
index 4303202..bca8b11 100644
--- a/tooling/scripts/dist.js
+++ b/tooling/scripts/dist.js
@@ -35,6 +35,9 @@
 var fso = WScript.CreateObject('Scripting.FileSystemObject'),
     wscript_shell = WScript.CreateObject("WScript.Shell");
 
+//Replace root directory or create new directory?
+var replace = false;
+
 //Set up directory structure of current release
     //arguments passed in
 var args = WScript.Arguments,
@@ -49,8 +52,6 @@
 var BUILD_DESTINATION;
 //current script that is running
 var current_script = "dist";
-// replace the directory
-var replace = false;
 
 
 /*************************************************/
@@ -59,13 +60,14 @@
 
 
 // help function
-function Usage() {
+function Usage()
+{
   Log("");
   Log("This is a command line tool for building new releases. It will package a new release");
   Log(" of a cordova-wp7 project, reversioning it to match the VERSION file in the root directory.");
-  Log("Usage: dist [ <NEW_PATH_FOR_BUILD> | -f ] ");
-  Log("                       -f : force tool to reversion the current repositoy.");
-  Log("     <NEW_PATH_FOR_BUILD> : path to create the new reversioned repositoy in.");
+  Log("Usage: dist [ <PATH_TO_NEW_REPO> | -f ] ");
+  Log("                       -f : reversion the repositoy this script is in.");
+  Log("       <PATH_TO_NEW_REPO> : path to create the new reversioned repositoy in.");
   Log("");
 }
 
@@ -79,17 +81,20 @@
     }
 }
 
+
 // returns the contents of a file
 function read(filename) {
     //Log('Reading in ' + filename);
-    if(fso.FileExists(filename)) {
+    if(fso.FileExists(filename))
+    {
         var f=fso.OpenTextFile(filename, 1,2);
         var s=f.ReadAll();
         f.Close();
         return s;
     }
-    else {
-        Log('Cannot read non-existant file : ' + filename, true);
+    else
+    {
+        Log('Cannot read non-existant file : ' + filename);
         WScript.Quit(1);
     }
     return null;
@@ -109,7 +114,8 @@
         }
     }
     //Check to make sure our scripts did not encounter an error
-    if(!oShell.StdErr.AtEndOfStream) {
+    if(!oShell.StdErr.AtEndOfStream)
+    {
         var err_line = oShell.StdErr.ReadAll();
         Log(err_line, true);
         Log("ERROR: Could not complete distribution, failed while running: " + current_script, true);
@@ -117,7 +123,8 @@
     }
 }
 
-function space() {
+function space()
+{
     Log("");
     Log("*****************************************************");
     Log("");
@@ -163,7 +170,6 @@
         Log("Error : too many arguments provided.", true);
         WScript.Quit(1);
     }
-    
 }
 else {
     Usage();
@@ -200,9 +206,10 @@
 /** - build cordova.js                          **/
 /** - windows.cordova.js -> templates + example **/
 /*************************************************/
-current_script = "buildjs.js";
-exec('cscript ' + BUILD_DESTINATION + SCRIPTS + '\\buildjs.js //nologo');
-space();
+// New Workflow does not require building the new js, it should already be in place.
+// current_script = "buildjs.js";
+// exec('cscript ' + BUILD_DESTINATION + SCRIPTS + '\\buildjs.js //nologo');
+// space();
 
 /*************************************************/
 /******************  Step 5  *********************/
diff --git a/tooling/scripts/package.js b/tooling/scripts/package.js
index f3970a8..b5f882d 100644
--- a/tooling/scripts/package.js
+++ b/tooling/scripts/package.js
@@ -43,7 +43,6 @@
 // build the dll?
 var BUILD_DLL = false;
 
-function Log(msg) { WScript.StdOut.WriteLine(msg); }
 
 // help function
 function Usage()
@@ -57,6 +56,16 @@
     Log("");
 }
 
+// logs messaged to stdout and stderr
+function Log(msg, error) {
+    if (error) {
+        WScript.StdErr.WriteLine(msg);
+    }
+    else {
+        WScript.StdOut.WriteLine(msg);
+    }
+}
+
 // returns the contents of a file
 function read(filename) {
     //Log('Reading in ' + filename);
@@ -100,7 +109,7 @@
     if(!oShell.StdErr.AtEndOfStream)
     {
         var err_line = oShell.StdErr.ReadAll();
-        WScript.StdErr.WriteLine(err_line);
+        Log(err_lin, true);
         WScript.Quit(1);
     }
 }
@@ -121,7 +130,7 @@
     exec('%comspec% /c copy /Y ' + BUILD_DESTINATION + TEMPLATES_PATH + '\\vs\\pg_templatePreview.jpg ' + BUILD_DESTINATION + STANDALONE_PATH + '\\__PreviewImage.jpg');
     exec('%comspec% /c copy /Y ' + BUILD_DESTINATION + '\\VERSION ' + BUILD_DESTINATION + STANDALONE_PATH);
 
-    exec_verbose('cscript ' + BUILD_DESTINATION + '\\tooling\\scripts\\win-zip.js ' + template_path + ' ' + BUILD_DESTINATION + STANDALONE_PATH + '\\ //nologo');
+    zip_project(template_path, BUILD_DESTINATION + STANDALONE_PATH);
 
 
     if(ADD_TO_VS)
@@ -139,6 +148,41 @@
   }
 }
 
+function zip_project(zip_path, project_path)
+{
+    // create empty ZIP file and open for adding
+    var file = fso.CreateTextFile(zip_path, true);
+
+    // create twenty-two byte "fingerprint" for .zip
+    file.write("PK");
+    file.write(String.fromCharCode(5));
+    file.write(String.fromCharCode(6));
+    file.write('\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0');
+    file.Close();
+
+    // open .zip foder and copy contents of project_path to zip_path
+    var zipFolder = shell.NameSpace(zip_path);
+    var sourceItems = shell.NameSpace(project_path).items();
+    if (zipFolder !== null) {
+        zipFolder.CopyHere(sourceItems, 4|20|16);
+        var maxTime = 5000;
+        while(zipFolder.items().Count < sourceItems.Count)
+        {
+            maxTime -= 100;
+            if(maxTime > 0 ) {
+                WScript.Sleep(100);
+            }
+            else {
+                Log('Failed to create .zip file.', true);
+                break;
+            }
+        }
+    }
+    else {
+        Log('Failed to create .zip file.', true);
+    }
+}
+
 // builds the new cordova dll and copys it to the full template (only done because of the version referance in Device.cs)
 function build_dll()
 {
diff --git a/tooling/scripts/reversion.js b/tooling/scripts/reversion.js
index 3b42fc4..8bf5ed1 100644
--- a/tooling/scripts/reversion.js
+++ b/tooling/scripts/reversion.js
@@ -24,6 +24,9 @@
     shell = WScript.CreateObject("shell.application"),
     wscript_shell = WScript.CreateObject("WScript.Shell");
 
+//Get new version from git or build off this version?
+var GET_NEW = false;
+
 //Set up directory structure of current release
     //arguments passed in
 var args = WScript.Arguments,
@@ -138,18 +141,9 @@
     // update standalone project
     exec('%comspec% /c copy /Y /V ' + BUILD_DESTINATION + "\\VERSION " + BUILD_DESTINATION + STANDALONE_PATH + "\\VERSION");
     var cordova_regex = /cordova-(\d+)[.](\d+)[.](\d+)(rc\d)?/g; //Matches *first* cordova-x.x.x[rcx] (just ad g at end to make global)
-    replaceInFile(BUILD_DESTINATION + STANDALONE_PATH + '\\CordovaAppProj.csproj', cordova_regex,  "cordova-" + VERSION);
-    replaceInFile(BUILD_DESTINATION + STANDALONE_PATH + '\\www\\index.html', cordova_regex,  "cordova-" + VERSION);
     version_regex = /return\s*\"(\d+)[.](\d+)[.](\d+)(rc\d)?/; //Matches return "x.x.x[rcx]
-
-    WScript.StdOut.WriteLine("path = " + BUILD_DESTINATION + CORDOVA_LIB + '\\Plugins\\Device.cs');
     replaceInFile(BUILD_DESTINATION + CORDOVA_LIB + '\\..\\Plugins\\Device.cs', version_regex,  "return \"" + VERSION);
 
-    // update example proj
-    replaceInFile(BUILD_DESTINATION + EXAMPLE_PATH + '\\CordovaExample.csproj', cordova_regex,  "cordova-" + VERSION);
-    version_regex = /VERSION\s*\=\s*\'(\d+)[.](\d+)[.](\d+)(rc\d)?/;  //Matches VERSION = x.x.x[rcx]
-    replaceInFile(BUILD_DESTINATION + EXAMPLE_PATH + '\\www\\cordova-current.js', version_regex,  "VERSION = \'" + VERSION);
-
     // update template discription
     version_regex = /Cordova\s*(\d+)[.](\d+)[.](\d+)(rc\d)?\s*Windows/g; //Matches version: x.x.x[rcx]
     replaceInFile(BUILD_DESTINATION + TEMPLATES_PATH + '\\vs\\description.txt', version_regex,  "Cordova " + VERSION + " Windows");
@@ -160,7 +154,6 @@
 
     replaceInFile(BUILD_DESTINATION + TEMPLATES_PATH + '\\vs\\MyTemplateStandAlone.vstemplate', name_regex,  'CordovaWP7_' + VERSION.replace(/\./g, '_'));
     replaceInFile(BUILD_DESTINATION + TEMPLATES_PATH + '\\vs\\MyTemplateStandAlone.vstemplate', discript_regex,  "Cordova " + VERSION);
-    replaceInFile(BUILD_DESTINATION + TEMPLATES_PATH + '\\vs\\MyTemplateStandAlone.vstemplate', cordova_regex,  "cordova-" + VERSION);
 }
 
 // delete all cordova.js and generated files (templates) from old version numbers
diff --git a/tooling/scripts/win-zip.js b/tooling/scripts/win-zip.js
deleted file mode 100644
index 3d8dc1a..0000000
--- a/tooling/scripts/win-zip.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Script for zipping the contents of a directory.
- */
-
-// get commman line arguments
-var objArgs = WScript.Arguments;
-var zipPath = objArgs(0);
-var sourcePath = objArgs(1);
-
-
-// create empty ZIP file and open for adding
-var fso = new ActiveXObject("Scripting.FileSystemObject");
-var file = fso.CreateTextFile(zipPath, true);
-
-// create twenty-two byte "fingerprint" for .zip
-file.write("PK");
-file.write(String.fromCharCode(5));
-file.write(String.fromCharCode(6));
-file.write('\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0');
-file.Close();
-
-// open .zip foder and copy contents of sourcePath
-var objShell = new ActiveXObject("shell.application");
-var zipFolder = objShell.NameSpace(zipPath);
-var sourceItems = objShell.NameSpace(sourcePath).items();
-if (zipFolder !== null) {
-    zipFolder.CopyHere(sourceItems, 4|20|16);
-    WScript.Sleep(4000);
-}
-else {
-	WScript.StdErr.WriteLine('Failed to create .zip file.');
-}
\ No newline at end of file
