diff --git a/.travis.yml b/.travis.yml
index 14abb83f61a29140e7a8d22b91461ebfcb8330c6..7f17ff9a58bf0c8e39f602053bc0a9679b4921bc 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -63,7 +63,6 @@ before_deploy:
   - cd ../nw
   - zip -qr ../nw.nwb *
   - cd ../..
-  - rm -Rf .git
   - mv ucoin_release/duniter-desktop.nw duniter-x64/opt/duniter/
   - mv ucoin_release/nw.nwb duniter-x64/opt/duniter/
   - fakeroot dpkg-deb --build duniter-x64
diff --git a/app/lib/cfs.js b/app/lib/cfs.js
index 016ecf020cf5477fe74947825eb9490820e4d851..e7ed023a35297c9e1cc8ee4852d2f1a70c2b2be7 100644
--- a/app/lib/cfs.js
+++ b/app/lib/cfs.js
@@ -27,7 +27,7 @@ function CFSCore(rootPath, qfs, parent) {
    * @returns {*|any|Q.Promise<void>} Promise of creation.
    */
   function createDeletionFolder() {
-    return deletionFolderPromise || (deletionFolderPromise = qfs.makeTree(path.join(rootPath, '.deleted')));
+    return deletionFolderPromise || (deletionFolderPromise = that.makeTree('.deleted'));
   }
 
   /**
@@ -154,7 +154,23 @@ function CFSCore(rootPath, qfs, parent) {
    * Create a directory tree.
    * @param treePath Tree path to create.
    */
-  this.makeTree = (treePath) => qfs.makeTree(path.join(rootPath, treePath));
+  this.makeTree = (treePath) => co(function*(){
+    // Note: qfs.makeTree does not work on windows, so we implement it manually
+    try {
+      let normalized = path.normalize(treePath);
+      let folders = normalized.split(path.sep);
+      let folder = rootPath;
+      for (let i = 0, len = folders.length; i < len; i++) {
+        folder = folder ? path.join(folder, folders[i]) : folders[i];
+        let exists = yield qfs.exists(folder);
+        if (!exists) {
+          yield qfs.makeDirectory(folder);
+        }
+      }
+    } catch (e) {
+      if (e && e.code !== "EISDIR") throw e;
+    }
+  });
 
   /**
    * Write JSON object to given file.
diff --git a/app/lib/crypto.js b/app/lib/crypto.js
index 654f7c39cb831627bad54db3dfb4e71ddf7f2c93..41c828f9ba107db722b0b097c9eae7c0695f9772 100644
--- a/app/lib/crypto.js
+++ b/app/lib/crypto.js
@@ -1,7 +1,7 @@
 "use strict";
 var _           = require('underscore');
 var nacl        = require('tweetnacl');
-var scrypt      = require('scrypt');
+var scrypt      = require('scryptb');
 var base58      = require('./base58');
 var rawer       = require('./rawer');
 var naclBinding = require('naclb');
diff --git a/app/lib/dal/fileDAL.js b/app/lib/dal/fileDAL.js
index 5a80b6db48fb10e8f305798f9f7dae8420818a2f..ed195524de143599cbe1f5cc40191ff24c076dba 100644
--- a/app/lib/dal/fileDAL.js
+++ b/app/lib/dal/fileDAL.js
@@ -15,7 +15,7 @@ var ConfDAL = require('./fileDALs/confDAL');
 var StatDAL = require('./fileDALs/statDAL');
 var IndicatorsDAL = require('./fileDALs/IndicatorsDAL');
 var CFSStorage = require('./fileDALs/AbstractCFS');
-var sqlite3 = require("sqlite3").verbose();
+var sqlite3 = require("sqlite3b").verbose();
 var logger = require('../../lib/logger')('database');
 
 const UCOIN_DB_NAME = 'ucoin';
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000000000000000000000000000000000000..caec30b72636a2a1dbdb1af2b367259e77c69cfc
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,87 @@
+environment:
+  matrix:
+    - nodejs_version: "5.8.0"
+
+platform:
+  - x64
+
+install:
+  - ps: Install-Product node $env:nodejs_version $env:platform
+  - node -v
+  - npm install -g npm
+  - npm install -g nw-gyp node-pre-gyp
+  - npm install
+
+test_script:
+  - npm test
+
+build: off
+
+after_test:
+  - choco install -y wget 7zip InnoSetup
+  - set PATH="C:\Program Files\7-Zip";"C:\Program Files (x86)\Inno Setup 5";%PATH%
+  # GUI Version
+  - set SRC=%cd%
+  - echo %SRC%
+  - copy misc\MSVSVersion.py %APPDATA%\npm\node_modules\nw-gyp\gyp\pylib\gyp\MSVSVersion.py
+  - set NW_VERSION=0.13.0-rc3
+  - set NW_RELEASE=v0.13.0-rc3
+  - echo %NW_RELEASE%
+  - cd node_modules/wotb
+  - npm install --build-from-source
+  - node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 configure
+  - node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 build
+  - copy %cd%\lib\binding\Release\node-webkit-%NW_RELEASE%-win32-x64\wotb.node %cd%\lib\binding\Release\node-v47-win32-x64\wotb.node /Y
+  - cd ../naclb
+  - npm install --build-from-source
+  - node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 configure
+  - node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 build
+  - copy %cd%\lib\binding\Release\node-webkit-%NW_RELEASE%-win32-x64\naclb.node %cd%\lib\binding\Release\node-v47-win32-x64\naclb.node /Y
+  - cd ../scryptb
+  - npm install --build-from-source
+  - node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 configure
+  - node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 build
+  - copy %cd%\lib\binding\Release\node-webkit-%NW_RELEASE%-win32-x64\scryptb.node %cd%\lib\binding\Release\node-v47-win32-x64\scryptb.node /Y
+  - cd ../sqlite3b
+  - npm install --build-from-source
+  - node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 configure
+  - node-pre-gyp --runtime=node-webkit --target=%NW_VERSION% --msvs_version=2015 build
+  - copy %cd%\lib\binding\node-webkit-%NW_RELEASE%-win32-x64\node_sqlite3.node %cd%\lib\binding\node-v47-win32-x64\node_sqlite3.node /Y
+  - cd ../..
+  - npm prune --production
+  - cd ..
+  - mkdir ucoin_release
+  - set NW=nwjs-%NW_RELEASE%-win-x64
+  - echo %NW%
+  - set NW_GZ=%NW%.zip
+  - echo %NW_GZ%
+  - wget http://dl.nwjs.io/%NW_RELEASE%/%NW_GZ%
+  - 7z x %NW_GZ% 1> null
+  - move %NW% %cd%\ucoin_release\nw
+  - mkdir %cd%\ucoin_release\sources
+  - xcopy %SRC%\gui\* %cd%\ucoin_release\nw\ /s /e
+  - xcopy %SRC%\* %cd%\ucoin_release\sources\ /s /e
+  - rd /s /q %cd%\ucoin_release\sources\ui\package\node_modules
+  - rd /s /q %cd%\ucoin_release\sources\ui\package\bower_components
+  - 7z a -tzip duniter-win-x64.zip %cd%\ucoin_release\* 1> null
+  - move duniter-win-x64.zip %cd%\ucoin\duniter-%APPVEYOR_REPO_TAG_NAME%-windows-x64.zip
+  - iscc %cd%\ucoin_release\sources\duniter.iss /DROOT_PATH=%cd%\ucoin_release
+  - move %cd%\ucoin_release\Duniter.exe %cd%\ucoin\duniter-%APPVEYOR_REPO_TAG_NAME%-windows-x64.exe
+
+artifacts:
+  - path: duniter*.exe
+    name: DuniterEXE
+  - path: duniter*.zip
+    name: Duniter
+
+deploy:
+  release: v0.20.0a18
+  provider: GitHub
+  auth_token:
+    secure: Vp/M0r0i1yhGR2nhrPWEbTiDIF6r0cmwbNDFZUzdFe5clWxPXtuC0lgIpOQI78zt
+  artifact: /Duniter/
+  draft: true
+  prerelease: true
+  on:
+    branch: master
+    appveyor_repo_tag: true
diff --git a/duniter.iss b/duniter.iss
new file mode 100644
index 0000000000000000000000000000000000000000..d650679fbbe945c59c195d88697e6927824dab70
--- /dev/null
+++ b/duniter.iss
@@ -0,0 +1,61 @@
+#define MyAppName "Duniter"
+#define MyAppPublisher "Duniter team"
+#define MyAppURL "http://duniter.org"
+#define MyAppExeName "nw.exe"
+
+#if !Defined(ROOT_PATH)
+#define ROOT_PATH "."
+#endif
+
+#define MyAppSrc ROOT_PATH
+#define MyAppExe ROOT_PATH + "\nw\" + MyAppExeName
+#pragma message MyAppSrc
+
+#if !FileExists(MyAppExe)
+#error "Unable to find MyAppExe"
+#endif
+
+#define MyAppVerStr "v0.20.0a18"
+
+[Setup]
+AppName={#MyAppName}
+AppVersion={#MyAppVerStr}
+AppPublisher={#MyAppPublisher}
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+DefaultDirName={pf}\{#MyAppName}
+DisableDirPage=yes
+DefaultGroupName={#MyAppName}
+DisableProgramGroupPage=yes
+OutputDir={#ROOT_PATH}
+OutputBaseFilename={#MyAppName}
+Compression=lzma
+SolidCompression=yes
+UninstallDisplayIcon={app}\nw\{#MyAppExeName}
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+Name: "french"; MessagesFile: "compiler:Languages\French.isl"
+
+[Tasks]
+Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
+
+[Files]
+Source: "{#MyAppSrc}\nw\*"; DestDir: "{app}\nw\"; Flags: ignoreversion recursesubdirs
+Source: "{#MyAppSrc}\sources\*"; DestDir: "{app}\sources\"; Flags: ignoreversion recursesubdirs
+
+[Icons]
+Name: "{group}\{#MyAppName}"; IconFilename: "{app}\nw\duniter.ico"; Filename: "{app}\nw\{#MyAppExeName}"
+Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
+Name: "{commondesktop}\{#MyAppName}"; IconFilename: "{app}\nw\duniter.ico"; Filename: "{app}\nw\{#MyAppExeName}"; Tasks: desktopicon
+
+[Run]
+Filename: "{app}\nw\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
+
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application.
+; Do not use the same AppId value in installers for other applications.
+; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
+AppId={{E01B0960-74D2-8ACD-734E-8B3CB033B07F}
+LicenseFile="{#MyAppSrc}\sources\LICENSE"
diff --git a/gui/duniter.ico b/gui/duniter.ico
new file mode 100644
index 0000000000000000000000000000000000000000..dcf7bfc7e07b5caafc1bc2ba8470303a7578858c
Binary files /dev/null and b/gui/duniter.ico differ
diff --git a/gui/duniter.png b/gui/duniter.png
index e364a651a47c4faa6ae6a38b60ab8cd321b23324..e9565045f4110241c2cbaa4a7dd68c3786e58f93 100644
Binary files a/gui/duniter.png and b/gui/duniter.png differ
diff --git a/misc/MSVSVersion.py b/misc/MSVSVersion.py
new file mode 100644
index 0000000000000000000000000000000000000000..42c034b6ebc33e111fb063fc7904163a7289f11d
--- /dev/null
+++ b/misc/MSVSVersion.py
@@ -0,0 +1,429 @@
+# Copyright (c) 2013 Google Inc. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Handle version information related to Visual Stuio."""
+
+import errno
+import os
+import re
+import subprocess
+import sys
+import gyp
+import glob
+
+
+class VisualStudioVersion(object):
+  """Information regarding a version of Visual Studio."""
+
+  def __init__(self, short_name, description,
+               solution_version, project_version, flat_sln, uses_vcxproj,
+               path, sdk_based, default_toolset=None):
+    self.short_name = short_name
+    self.description = description
+    self.solution_version = solution_version
+    self.project_version = project_version
+    self.flat_sln = flat_sln
+    self.uses_vcxproj = uses_vcxproj
+    self.path = path
+    self.sdk_based = sdk_based
+    self.default_toolset = default_toolset
+
+  def ShortName(self):
+    return self.short_name
+
+  def Description(self):
+    """Get the full description of the version."""
+    return self.description
+
+  def SolutionVersion(self):
+    """Get the version number of the sln files."""
+    return self.solution_version
+
+  def ProjectVersion(self):
+    """Get the version number of the vcproj or vcxproj files."""
+    return self.project_version
+
+  def FlatSolution(self):
+    return self.flat_sln
+
+  def UsesVcxproj(self):
+    """Returns true if this version uses a vcxproj file."""
+    return self.uses_vcxproj
+
+  def ProjectExtension(self):
+    """Returns the file extension for the project."""
+    return self.uses_vcxproj and '.vcxproj' or '.vcproj'
+
+  def Path(self):
+    """Returns the path to Visual Studio installation."""
+    return self.path
+
+  def ToolPath(self, tool):
+    """Returns the path to a given compiler tool. """
+    return os.path.normpath(os.path.join(self.path, "VC/bin", tool))
+
+  def DefaultToolset(self):
+    """Returns the msbuild toolset version that will be used in the absence
+    of a user override."""
+    return self.default_toolset
+
+  def SetupScript(self, target_arch):
+    """Returns a command (with arguments) to be used to set up the
+    environment."""
+    # Check if we are running in the SDK command line environment and use
+    # the setup script from the SDK if so. |target_arch| should be either
+    # 'x86' or 'x64'.
+    assert target_arch in ('x86', 'x64')
+    sdk_dir = os.environ.get('WindowsSDKDir')
+    if self.sdk_based and sdk_dir:
+      return [os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.Cmd')),
+              '/' + target_arch]
+    else:
+      # We don't use VC/vcvarsall.bat for x86 because vcvarsall calls
+      # vcvars32, which it can only find if VS??COMNTOOLS is set, which it
+      # isn't always.
+      if target_arch == 'x86':
+        if self.short_name == '2013' and (
+            os.environ.get('PROCESSOR_ARCHITECTURE') == 'AMD64' or
+            os.environ.get('PROCESSOR_ARCHITEW6432') == 'AMD64'):
+          # VS2013 non-Express has a x64-x86 cross that we want to prefer.
+          return [os.path.normpath(
+             os.path.join(self.path, 'VC/vcvarsall.bat')), 'amd64_x86']
+        # Otherwise, the standard x86 compiler.
+        return [os.path.normpath(
+          os.path.join(self.path, 'Common7/Tools/vsvars32.bat'))]
+      else:
+        assert target_arch == 'x64'
+        arg = 'x86_amd64'
+        if (os.environ.get('PROCESSOR_ARCHITECTURE') == 'AMD64' or
+            os.environ.get('PROCESSOR_ARCHITEW6432') == 'AMD64'):
+          # Use the 64-on-64 compiler if we can.
+          arg = 'amd64'
+        return [os.path.normpath(
+            os.path.join(self.path, 'VC/vcvarsall.bat')), arg]
+
+
+def _RegistryQueryBase(sysdir, key, value):
+  """Use reg.exe to read a particular key.
+
+  While ideally we might use the win32 module, we would like gyp to be
+  python neutral, so for instance cygwin python lacks this module.
+
+  Arguments:
+    sysdir: The system subdirectory to attempt to launch reg.exe from.
+    key: The registry key to read from.
+    value: The particular value to read.
+  Return:
+    stdout from reg.exe, or None for failure.
+  """
+  # Skip if not on Windows or Python Win32 setup issue
+  if sys.platform not in ('win32', 'cygwin'):
+    return None
+  # Setup params to pass to and attempt to launch reg.exe
+  cmd = [os.path.join(os.environ.get('WINDIR', ''), sysdir, 'reg.exe'),
+         'query', key]
+  if value:
+    cmd.extend(['/v', value])
+  p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+  # Obtain the stdout from reg.exe, reading to the end so p.returncode is valid
+  # Note that the error text may be in [1] in some cases
+  text = p.communicate()[0]
+  # Check return code from reg.exe; officially 0==success and 1==error
+  if p.returncode:
+    return None
+  return text
+
+
+def _RegistryQuery(key, value=None):
+  """Use reg.exe to read a particular key through _RegistryQueryBase.
+
+  First tries to launch from %WinDir%\Sysnative to avoid WoW64 redirection. If
+  that fails, it falls back to System32.  Sysnative is available on Vista and
+  up and available on Windows Server 2003 and XP through KB patch 942589. Note
+  that Sysnative will always fail if using 64-bit python due to it being a
+  virtual directory and System32 will work correctly in the first place.
+
+  KB 942589 - http://support.microsoft.com/kb/942589/en-us.
+
+  Arguments:
+    key: The registry key.
+    value: The particular registry value to read (optional).
+  Return:
+    stdout from reg.exe, or None for failure.
+  """
+  text = None
+  try:
+    text = _RegistryQueryBase('Sysnative', key, value)
+  except OSError, e:
+    if e.errno == errno.ENOENT:
+      text = _RegistryQueryBase('System32', key, value)
+    else:
+      raise
+  return text
+
+
+def _RegistryGetValue(key, value):
+  """Use reg.exe to obtain the value of a registry key.
+
+  Args:
+    key: The registry key.
+    value: The particular registry value to read.
+  Return:
+    contents of the registry key's value, or None on failure.
+  """
+  text = _RegistryQuery(key, value)
+  if not text:
+    return None
+  # Extract value.
+  match = re.search(r'REG_\w+\s+([^\r]+)\r\n', text)
+  if not match:
+    return None
+  return match.group(1)
+
+
+def _RegistryKeyExists(key):
+  """Use reg.exe to see if a key exists.
+
+  Args:
+    key: The registry key to check.
+  Return:
+    True if the key exists
+  """
+  if not _RegistryQuery(key):
+    return False
+  return True
+
+
+def _CreateVersion(name, path, sdk_based=False):
+  """Sets up MSVS project generation.
+
+  Setup is based off the GYP_MSVS_VERSION environment variable or whatever is
+  autodetected if GYP_MSVS_VERSION is not explicitly specified. If a version is
+  passed in that doesn't match a value in versions python will throw a error.
+  """
+  if path:
+    path = os.path.normpath(path)
+  versions = {
+      '2015': VisualStudioVersion('2015',
+                                  'Visual Studio 2015',
+                                  solution_version='12.00',
+                                  project_version='14.0',
+                                  flat_sln=False,
+                                  uses_vcxproj=True,
+                                  path=path,
+                                  sdk_based=sdk_based,
+                                  default_toolset='v140'),
+      '2015e': VisualStudioVersion('2015e',
+                                  'Visual Studio 2015',
+                                  solution_version='12.00',
+                                  project_version='14.0',
+                                  flat_sln=True,
+                                  uses_vcxproj=True,
+                                  path=path,
+                                  sdk_based=sdk_based,
+                                  default_toolset='v140'),
+      '2013': VisualStudioVersion('2013',
+                                  'Visual Studio 2013',
+                                  solution_version='13.00',
+                                  project_version='12.0',
+                                  flat_sln=False,
+                                  uses_vcxproj=True,
+                                  path=path,
+                                  sdk_based=sdk_based,
+                                  default_toolset='v120'),
+      '2013e': VisualStudioVersion('2013e',
+                                   'Visual Studio 2013',
+                                   solution_version='13.00',
+                                   project_version='12.0',
+                                   flat_sln=True,
+                                   uses_vcxproj=True,
+                                   path=path,
+                                   sdk_based=sdk_based,
+                                   default_toolset='v120'),
+      '2012': VisualStudioVersion('2012',
+                                  'Visual Studio 2012',
+                                  solution_version='12.00',
+                                  project_version='4.0',
+                                  flat_sln=False,
+                                  uses_vcxproj=True,
+                                  path=path,
+                                  sdk_based=sdk_based,
+                                  default_toolset='v110'),
+      '2012e': VisualStudioVersion('2012e',
+                                   'Visual Studio 2012',
+                                   solution_version='12.00',
+                                   project_version='4.0',
+                                   flat_sln=True,
+                                   uses_vcxproj=True,
+                                   path=path,
+                                   sdk_based=sdk_based,
+                                   default_toolset='v110'),
+      '2010': VisualStudioVersion('2010',
+                                  'Visual Studio 2010',
+                                  solution_version='11.00',
+                                  project_version='4.0',
+                                  flat_sln=False,
+                                  uses_vcxproj=True,
+                                  path=path,
+                                  sdk_based=sdk_based),
+      '2010e': VisualStudioVersion('2010e',
+                                   'Visual C++ Express 2010',
+                                   solution_version='11.00',
+                                   project_version='4.0',
+                                   flat_sln=True,
+                                   uses_vcxproj=True,
+                                   path=path,
+                                   sdk_based=sdk_based),
+      '2008': VisualStudioVersion('2008',
+                                  'Visual Studio 2008',
+                                  solution_version='10.00',
+                                  project_version='9.00',
+                                  flat_sln=False,
+                                  uses_vcxproj=False,
+                                  path=path,
+                                  sdk_based=sdk_based),
+      '2008e': VisualStudioVersion('2008e',
+                                   'Visual Studio 2008',
+                                   solution_version='10.00',
+                                   project_version='9.00',
+                                   flat_sln=True,
+                                   uses_vcxproj=False,
+                                   path=path,
+                                   sdk_based=sdk_based),
+      '2005': VisualStudioVersion('2005',
+                                  'Visual Studio 2005',
+                                  solution_version='9.00',
+                                  project_version='8.00',
+                                  flat_sln=False,
+                                  uses_vcxproj=False,
+                                  path=path,
+                                  sdk_based=sdk_based),
+      '2005e': VisualStudioVersion('2005e',
+                                   'Visual Studio 2005',
+                                   solution_version='9.00',
+                                   project_version='8.00',
+                                   flat_sln=True,
+                                   uses_vcxproj=False,
+                                   path=path,
+                                   sdk_based=sdk_based),
+  }
+  return versions[str(name)]
+
+
+def _ConvertToCygpath(path):
+  """Convert to cygwin path if we are using cygwin."""
+  if sys.platform == 'cygwin':
+    p = subprocess.Popen(['cygpath', path], stdout=subprocess.PIPE)
+    path = p.communicate()[0].strip()
+  return path
+
+
+def _DetectVisualStudioVersions(versions_to_check, force_express):
+  """Collect the list of installed visual studio versions.
+
+  Returns:
+    A list of visual studio versions installed in descending order of
+    usage preference.
+    Base this on the registry and a quick check if devenv.exe exists.
+    Only versions 8-10 are considered.
+    Possibilities are:
+      2005(e) - Visual Studio 2005 (8)
+      2008(e) - Visual Studio 2008 (9)
+      2010(e) - Visual Studio 2010 (10)
+      2012(e) - Visual Studio 2012 (11)
+      2013(e) - Visual Studio 2013 (11)
+      2015(e) - Visual Studio 2015 (14)
+    Where (e) is e for express editions of MSVS and blank otherwise.
+  """
+  version_to_year = {
+    '8.0': '2005',
+    '9.0': '2008',
+    '10.0': '2010',
+    '11.0': '2012',
+    '12.0': '2013',
+    '14.0': '2015',
+  }
+  versions = []
+  for version in versions_to_check:
+    # Old method of searching for which VS version is installed
+    # We don't use the 2010-encouraged-way because we also want to get the
+    # path to the binaries, which it doesn't offer.
+    keys = [r'HKLM\Software\Microsoft\VisualStudio\%s' % version,
+            r'HKLM\Software\Wow6432Node\Microsoft\VisualStudio\%s' % version,
+            r'HKLM\Software\Microsoft\VCExpress\%s' % version,
+            r'HKLM\Software\Wow6432Node\Microsoft\VCExpress\%s' % version]
+    for index in range(len(keys)):
+      path = _RegistryGetValue(keys[index], 'InstallDir')
+      if not path:
+        continue
+      path = _ConvertToCygpath(path)
+      # Check for full.
+      full_path = os.path.join(path, 'devenv.exe')
+      express_path = os.path.join(path, '*express.exe')
+      if not force_express and os.path.exists(full_path):
+        # Add this one.
+        versions.append(_CreateVersion(version_to_year[version],
+            os.path.join(path, '..', '..')))
+      # Check for express.
+      elif glob.glob(express_path):
+        # Add this one.
+        versions.append(_CreateVersion(version_to_year[version] + 'e',
+            os.path.join(path, '..', '..')))
+
+    # The old method above does not work when only SDK is installed.
+    keys = [r'HKLM\Software\Microsoft\VisualStudio\SxS\VC7',
+            r'HKLM\Software\Wow6432Node\Microsoft\VisualStudio\SxS\VC7']
+    for index in range(len(keys)):
+      path = _RegistryGetValue(keys[index], version)
+      if not path:
+        continue
+      path = _ConvertToCygpath(path)
+      versions.append(_CreateVersion(version_to_year[version] + 'e',
+          os.path.join(path, '..'), sdk_based=True))
+
+  return versions
+
+
+def SelectVisualStudioVersion(version='auto'):
+  """Select which version of Visual Studio projects to generate.
+
+  Arguments:
+    version: Hook to allow caller to force a particular version (vs auto).
+  Returns:
+    An object representing a visual studio project format version.
+  """
+  # In auto mode, check environment variable for override.
+  if version == 'auto':
+    version = os.environ.get('GYP_MSVS_VERSION', 'auto')
+  version_map = {
+    'auto': ('14.0', '12.0', '10.0', '9.0', '8.0', '11.0'),
+    '2005': ('8.0',),
+    '2005e': ('8.0',),
+    '2008': ('9.0',),
+    '2008e': ('9.0',),
+    '2010': ('10.0',),
+    '2010e': ('10.0',),
+    '2012': ('11.0',),
+    '2012e': ('11.0',),
+    '2013': ('12.0',),
+    '2013e': ('12.0',),
+    '2015': ('14.0',),
+    '2015e': ('14.0',),
+  }
+  override_path = os.environ.get('GYP_MSVS_OVERRIDE_PATH')
+  if override_path:
+    msvs_version = os.environ.get('GYP_MSVS_VERSION')
+    if not msvs_version:
+      raise ValueError('GYP_MSVS_OVERRIDE_PATH requires GYP_MSVS_VERSION to be '
+                       'set to a particular version (e.g. 2010e).')
+    return _CreateVersion(msvs_version, override_path, sdk_based=True)
+  version = str(version)
+  versions = _DetectVisualStudioVersions(version_map[version], 'e' in version)
+  if not versions:
+    if version == 'auto':
+      # Default to 2005 if we couldn't find anything
+      return _CreateVersion('2005', None)
+    else:
+      return _CreateVersion(version, None)
+  return versions[0]
diff --git a/package.json b/package.json
index aa1a025f432c2dc9a28095974c190a79af7a9798..0654d1d088c47419a60220d6348404202081085d 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,7 @@
     "test": "mocha --growl --timeout 20000 test test/fast test/fast/block test/integration test/",
     "start": "node bin/ucoind start",
     "test-travis": "node ./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec --timeout 20000 test test/fast test/fast/block test/integration test/",
-    "postinstall": "mkdir -p ui && cd ui && npm pack ucoin-ui@0.1.2 && tar xzf ucoin-ui-0.1.2.tgz && cd package && npm install && cd .. && rm ucoin-ui-0.1.2.tgz"
+    "postinstall": "mkdir ui && cd ui && npm pack ucoin-ui@0.1.3 && tar xzf ucoin-ui-0.1.3.tgz && cd package && npm install && cd .. && rm ucoin-ui-0.1.3.tgz"
   },
   "repository": {
     "type": "git",
@@ -46,28 +46,27 @@
     "event-stream": "3.1.5",
     "express": "4.13.4",
     "express-cors": "0.0.3",
-    "express-ws": "0.2.6",
     "inquirer": "0.8.5",
     "jison": "0.4.17",
     "merkle": "0.4.0",
     "moment": "2.6.0",
     "morgan": "1.6.1",
     "multimeter": "0.1.1",
-    "naclb": "1.0.0",
+    "naclb": "1.2.9",
     "nnupnp": "1.0.1",
     "optimist": "0.6.1",
     "q": "1.1.2",
     "q-io": "1.13.2",
     "request": "2.31.0",
-    "scrypt": "5.4.1",
+    "scryptb": "6.0.4",
     "sha1": "1.1.0",
-    "sqlite3": "3.1.1",
+    "sqlite3b": "3.1.1",
     "superagent": "1.4.0",
     "tweetnacl": "0.14.1",
     "underscore": "1.8.3",
-    "vucoin": "0.29.1",
+    "vucoin": "0.30.1",
     "winston": "2.1.1",
-    "wotb": "0.3.2",
+    "wotb": "0.4.5",
     "ws": "1.0.1"
   },
   "devDependencies": {