diff --git a/windows8/bin/create.js b/windows8/bin/create.js
index 2428cb4..6a4128a 100644
--- a/windows8/bin/create.js
+++ b/windows8/bin/create.js
@@ -149,6 +149,7 @@
     // replace the guid in the AppManifest and deploy script
     replaceInFile(destPath + "\\package.appxmanifest","$guid1$",newProjGuid);
     replaceInFile(destPath + "\\cordova\\lib\\deploy.js","$guid1$",newProjGuid);
+    replaceInFile(destPath + "\\cordova\\lib\\deploy.js","$namespace$",namespace);
 
     // replace $safeprojectname$ and $projectname$ in AppManifest
     replaceInFile(destPath + "\\package.appxmanifest",/\$safeprojectname\$/g,safeProjectName);
diff --git a/windows8/template/cordova/lib/WindowsStoreAppUtils b/windows8/template/cordova/lib/WindowsStoreAppUtils
new file mode 100644
index 0000000..ded93cf
--- /dev/null
+++ b/windows8/template/cordova/lib/WindowsStoreAppUtils
@@ -0,0 +1,92 @@
+<#
+       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.
+#>
+$code = @"
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+namespace StoreAppRunner 
+{
+    public enum ActivateOptions
+    {
+        None = 0,
+        DesignMode = 0x1,
+        NoErrorUI = 0x2,
+        NoSplashScreen = 0x4
+    }
+
+    [ComImport]
+    [Guid("2e941141-7f97-4756-ba1d-9decde894a3d")]
+    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+    public interface IApplicationActivationManager
+    {
+        IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ActivateOptions options, [Out] out UInt32 processId);
+        IntPtr ActivateForFile([In] String appUserModelId, [In] IntPtr itemArray, [In] String verb, [Out] out UInt32 processId);
+        IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr itemArray, [Out] out UInt32 processId);
+    }
+    [ComImport]
+    [Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")]
+    public class ApplicationActivationManager : IApplicationActivationManager
+    {
+        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
+        public extern IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ActivateOptions options, [Out] out UInt32 processId);
+        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
+        public extern IntPtr ActivateForFile([In] String appUserModelId, [In] IntPtr itemArray, [In] String verb, [Out] out UInt32 processId);
+        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
+        public extern IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr itemArray, [Out] out UInt32 processId);
+    }
+}
+"@
+
+function Uninstall-App {
+    param(
+        [Parameter(Mandatory=$true, Position=0, ValueFromPipelineByPropertyName=$true)]
+        [string] $ID <# package.appxmanifest//Identity@name #>
+    )
+
+    $package = Get-AppxPackage $ID
+
+    if($package) {
+        Remove-AppxPackage $package.PackageFullName
+    }
+}
+
+function Install-App {
+    param(
+        [Parameter(Mandatory=$true, Position=0, ValueFromPipelineByPropertyName=$true)]
+        [string] $Path <# Full path to Add-AppDevPackage.ps1 #>
+    )
+    Invoke-Expression ($Path + " -force")
+}
+
+function Start-Locally {
+    param(
+        [Parameter(Mandatory=$true, Position=0, ValueFromPipelineByPropertyName=$true)]
+        [string] $ID <# package.appxmanifest//Identity@name #>
+    )
+
+    $package = Get-AppxPackage $ID
+    $manifest = Get-appxpackagemanifest $package
+    $applicationUserModelId = $package.PackageFamilyName + "!" + $manifest.package.applications.application.id
+
+    Write-Host "ActivateApplication: " $applicationUserModelId
+
+    add-type -TypeDefinition $code
+    $appActivator = new-object StoreAppRunner.ApplicationActivationManager
+    $appActivator.ActivateApplication($applicationUserModelId,$null,[StoreAppRunner.ActivateOptions]::None,[ref]0)
+}
\ No newline at end of file
diff --git a/windows8/template/cordova/lib/build.js b/windows8/template/cordova/lib/build.js
index 9499eb6..87fd42c 100644
--- a/windows8/template/cordova/lib/build.js
+++ b/windows8/template/cordova/lib/build.js
@@ -110,11 +110,8 @@
             {
                 if(fso.GetExtensionName(files.item()) == "ps1")
                 {
-                    var command = "PowerShell " + files.item();
-                    Log("\nRunning Command :: " + command);
-                    // run it and wait for the result
-                    var retCode = wscript_shell.Run(command, 1, true);
-                    return retCode == 0 ? "Success" : "Error running PowerShell script : " + retCode;
+                    // app was built, installation script exists
+                    return "Success";
                 }
 
             }
diff --git a/windows8/template/cordova/lib/deploy.js b/windows8/template/cordova/lib/deploy.js
index d079253..c771f12 100644
--- a/windows8/template/cordova/lib/deploy.js
+++ b/windows8/template/cordova/lib/deploy.js
@@ -17,17 +17,15 @@
        under the License.
 */
 
-
 var fso = WScript.CreateObject('Scripting.FileSystemObject');
 var wscript_shell = WScript.CreateObject("WScript.Shell");
 
 var args = WScript.Arguments;
 // working dir
 var ROOT = WScript.ScriptFullName.split('\\cordova\\lib\\deploy.js').join('');
-    // path to CordovaDeploy.exe
-var CORDOVA_DEPLOY_EXE = '\\cordova\\lib\\CordovaDeploy\\CordovaDeploy\\bin\\Debug\\CordovaDeploy.exe';
-    // path to CordovaDeploy
-var CORDOVA_DEPLOY = '\\cordova\\lib\\CordovaDeploy';
+// path to WindowsStoreAppUtils.ps1; provides helper functions to install/unistall/start Windows Store app
+var WINDOWS_STORE_UTILS = '\\cordova\\lib\\WindowsStoreAppUtils.ps1';
+var WINDOWS_STORE_UTILS_SRC = '\\cordova\\lib\\WindowsStoreAppUtils';
 
 //build types
 var NONE = 0,
@@ -36,6 +34,7 @@
     NO_BUILD = 3;
 var build_type = NONE;
 
+var PACKAGE_NAME = '$namespace$';
 
 // help function
 function Usage() {
@@ -115,114 +114,101 @@
     return null;
 }
 
-// builds the CordovaDeploy.exe if it does not already exist 
-function cordovaDeploy(path) {
-    if (fso.FileExists(path + CORDOVA_DEPLOY_EXE)) {
-        return;
-    }
+// writes content to a file
+function write(filename, content) {
+    var f=fso.OpenTextFile(filename, 2,2);
+    f.Write(content);
+    f.Close();
+}
 
-    Log('CordovaDeploy.exe not found, attempting to build CordovaDeploy.exe...');
+function localMachine(path) {
+    Log('Deploying to local machine ...');
+    makeAppStoreUtils(path);
+    uninstallApp(path);
+    installApp(path);
 
-    // build CordovaDeploy.exe
-    if (fso.FolderExists(path + '\\cordova') && fso.FolderExists(path + CORDOVA_DEPLOY) && 
-        fso.FileExists(path + CORDOVA_DEPLOY + '\\CordovaDeploy.sln')) {
-        // delete any previously generated files
-        if (fso.FolderExists(path + CORDOVA_DEPLOY + '\\CordovaDeploy\\obj')) {
-            fso.DeleteFolder(path + CORDOVA_DEPLOY + '\\CordovaDeploy\\obj');
-        }
-        if (fso.FolderExists(path + CORDOVA_DEPLOY + '\\CordovaDeploy\\Bin')) {
-            fso.DeleteFolder(path + CORDOVA_DEPLOY + '\\CordovaDeploy\\Bin');
-        }
-        exec_verbose('msbuild ' + path + CORDOVA_DEPLOY + '\\CordovaDeploy.sln');
-
-        if (fso.FileExists(path + CORDOVA_DEPLOY_EXE)) {
-            Log('CordovaDeploy.exe compiled, SUCCESS.');
-        }
-        else {
-            Log('ERROR: MSBUILD FAILED TO COMPILE CordovaDeploy.exe', true);
-            WScript.Quit(2);
-        }
-    }
-    else {
-        Log('ERROR: CordovaDeploy.sln not found, unable to compile CordovaDeploy tool.', true);
-        WScript.Quit(2);
-    }
+    var command = "powershell \". .\\" + WINDOWS_STORE_UTILS + "; Start-Locally " + PACKAGE_NAME;
+    Log(command);
+    exec_verbose(command);
 }
 
 // launches project on device
 function device(path)
 {
-    cordovaDeploy(path);
-    if (fso.FileExists(path + CORDOVA_DEPLOY_EXE)) {
-        Log('Deploying to device ...');
-        //TODO: get device ID from list-devices and deploy to first one
-        exec_verbose('%comspec% /c ' + path + CORDOVA_DEPLOY_EXE + ' ' + path + ' -d:0');
-    }
-    else
-    {
-        Log('Error: Failed to find CordovaDeploy.exe in ' + path, true);
-        Log('DEPLOY FAILED.', true);
-        WScript.Quit(2);
-    }
+    // on windows8 platform we treat this command as running application on local machine
+    localMachine(path);
 }
 
 // launches project on emulator
 function emulator(path)
 {
-    cordovaDeploy(path);
-    if (fso.FileExists(path + CORDOVA_DEPLOY_EXE)) {
-        Log('Deploying to emulator ...');
-        //TODO: get emulator ID from list-emulators and deploy to first one
-        exec_verbose('%comspec% /c ' + path + CORDOVA_DEPLOY_EXE + ' ' + path + ' -d:1');
-    }
-    else
-    {
-        Log('Error: Failed to find CordovaDeploy.exe in ' + path, true);
-        Log('DEPLOY FAILED.', true);
-        WScript.Quit(2);
-    }
+    // TODO: currently we can run application on local machine only
+    localMachine(path);
 }
 
 // builds and launches the project on the specified target
 function target(path, device_id) {
-    if (!fso.FileExists(path + CORDOVA_DEPLOY_EXE)) {
-        cordovaDeploy(path);
+    Log('ERROR: not supported yet', true);
+    Log('DEPLOY FAILED.', true);
+    WScript.Quit(2);
+    
+}
+
+function makeAppStoreUtils(path) {
+
+    if (fso.FileExists(path + WINDOWS_STORE_UTILS)) {
+        return;
     }
-    wscript_shell.CurrentDirectory = path + CORDOVA_DEPLOY + '\\CordovaDeploy\\bin\\Debug';
-    var cmd = 'CordovaDeploy -devices';
-    var out = wscript_shell.Exec(cmd);
-    while(out.Status == 0) {
-        WScript.Sleep(100);
-    }
-    if (!out.StdErr.AtEndOfStream) {
-        var line = out.StdErr.ReadAll();
-        Log("Error calling CordovaDeploy : ", true);
-        Log(line, true);
-        WScript.Quit(2);
-    }
-    else {
-        if (!out.StdOut.AtEndOfStream) {
-            var line = out.StdOut.ReadAll();
-            var targets = line.split('\r\n');
-            var check_id = new RegExp(device_id);
-            for (target in targets) {
-                if (targets[target].match(check_id)) {
-                    //TODO: this only gets single digit index, account for device index of 10+?
-                    var index = targets[target].substr(0,1);
-                    exec_verbose(path + CORDOVA_DEPLOY_EXE + ' ' + path + ' -d:' + index);
+
+    Log("Making PowerShell script for Windows Store Apps..");
+
+    write(path + WINDOWS_STORE_UTILS, read(path + WINDOWS_STORE_UTILS_SRC));
+}
+
+// uninstalls previous application instance (if exists)
+function uninstallApp(path) {
+    Log("Attempt to uninstall previous application version...");
+    Log("\tDirectory : " + path);
+
+    wscript_shell.CurrentDirectory = path;
+    var command = "powershell \". .\\" + WINDOWS_STORE_UTILS + "; Uninstall-App " + PACKAGE_NAME;
+    Log(command);
+    exec_verbose(command);
+}
+
+// executes store application installation script (Add-AppDevPackage.ps1)
+function installApp(path) {
+
+    Log("Attempt to install application...");
+    Log("\tDirectory : " + path);
+    
+    wscript_shell.CurrentDirectory = path;
+
+    // TODO: there could be multiple AppPackages
+    // check if AppPackages created
+    if (fso.FolderExists(path + '\\AppPackages')) {
+        var out_folder = fso.GetFolder(path + '\\AppPackages');
+        var subFolders = new Enumerator(out_folder.SubFolders);
+        for(;!subFolders.atEnd();subFolders.moveNext())
+        {
+            var subFolder = subFolders.item();
+            var files = new Enumerator(subFolder.Files);
+            for(;!files.atEnd();files.moveNext())
+            {
+                if(fso.GetExtensionName(files.item()) == "ps1")
+                {
+                    var command = "powershell \". .\\" + WINDOWS_STORE_UTILS + "; Install-App " + files.item();
+                    Log(command);
+                    exec_verbose(command);
                     return;
                 }
+
             }
-            Log('Error : target ' + device_id + ' was not found.', true);
-            Log('DEPLOY FAILED.', true);
-            WScript.Quit(2);
         }
-        else {
-            Log('Error : CordovaDeploy Failed to find any devices', true);
-            Log('DEPLOY FAILED.', true);
-            WScript.Quit(2);
-        }
+
     }
+    Log('Error : AppPackages were not built or Add-AppDevPackage.ps1 was not found', true);
+    WScript.Quit(2);
 }
 
 function build(path) {
@@ -246,18 +232,6 @@
     }
 }
 
-function getPackageFamilyName(srcId) {
-    var outShell = wscript_shell.Exec('powershell -executionpolicy bypass -Command write-output((Get-AppxPackage ' + srcId + ').PackageFamilyName)');
-    var result = outShell.StdOut.ReadAll();
-    return result;
-}
-
-
-var res = getPackageFamilyName('$guid1$');
-Log("Res = " + res);
-WScript.Quit(0);
-
-
 if (args.Count() > 0) {
     // support help flags
     if (args(0) == "--help" || args(0) == "/?" ||
