diff --git a/platforms/desktop b/platforms/desktop
index 473c109b8e46634378c5f932702a86be060cfa46..e4eebd2e152b44e0ef5037a9fa8b14066c490e72 160000
--- a/platforms/desktop
+++ b/platforms/desktop
@@ -1 +1 @@
-Subproject commit 473c109b8e46634378c5f932702a86be060cfa46
+Subproject commit e4eebd2e152b44e0ef5037a9fa8b14066c490e72
diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json
index 784c0db12635468ecaa1ebbf9767a5f732aa1cda..ddc262e785d66e60caadc0cc3799a9490fd73897 100644
--- a/www/i18n/locale-fr-FR.json
+++ b/www/i18n/locale-fr-FR.json
@@ -633,7 +633,8 @@
           "PASSWORD_HELP": "Phrase secrète"
         },
         "ERROR": {
-          "BAD_PASSWORD": "Phrase secrète incorrecte"
+          "BAD_PASSWORD": "Phrase secrète incorrecte",
+          "BAD_CHECKSUM": "Somme de contrôle incorrecte"
         }
       }
     },
diff --git a/www/js/controllers/login-controllers.js b/www/js/controllers/login-controllers.js
index 2878bf32de37e258b654adb47060e6b31d33ab75..744b9cb960e7880d9479e3980a123732d7b70868 100644
--- a/www/js/controllers/login-controllers.js
+++ b/www/js/controllers/login-controllers.js
@@ -376,6 +376,7 @@ function LoginModalController($scope, $timeout, $q, $ionicPopover, CryptoUtils,
           });
       })
       .then(function(data) {
+        if (!data) return;
         // Parse success: continue
         if (data && data.pubkey) return data;
 
diff --git a/www/js/platform.js b/www/js/platform.js
index cfda3b040f421a536f03fa825d3cf151b8e8fdc3..52fa3d0a75907b5eb504924a9a0c1474fe5f038f 100644
--- a/www/js/platform.js
+++ b/www/js/platform.js
@@ -77,12 +77,18 @@ angular.module('cesium.platform', ['ngIdle', 'cesium.config', 'cesium.services']
     IdleProvider.timeout(csConfig.logoutTimeout||15); // display warning during 15s
   })
 
-  .factory('$exceptionHandler', function() {
+  .factory('$exceptionHandler', function($log) {
     'ngInject';
 
+    function stacktrace(f) {
+      return !f ? [] :
+        stacktrace(f.caller).concat([f.toString().split('(')[0].substring(9) + '(' + Array.prototype.slice.call(f.arguments).join(',') + ')']);
+    }
+
     return function(exception, cause) {
-      if (cause) console.error(exception, cause);
-      else console.error(exception);
+      //console.error(stacktrace(arguments.callee.caller));
+      if (cause) $log.error(exception, cause);
+      else $log.error(exception);
     };
   })
 
diff --git a/www/js/services/crypto-services.js b/www/js/services/crypto-services.js
index c0e9a4f5386b23c530fd2c0475ea356e000d5f8a..6d78bff70b56ab6516d110fd57672b6f7fca817c 100644
--- a/www/js/services/crypto-services.js
+++ b/www/js/services/crypto-services.js
@@ -801,11 +801,11 @@ angular.module('cesium.crypto.services', ['cesium.utils.services'])
 
       // Use Cordova plugin implementation, when exists
       if (isDevice && window.plugins && window.plugins.MiniSodium && crypto && crypto.getRandomValues) {
-        console.debug('[crypto] Loading Cordova MiniSodium implementation...');
+        console.debug('[crypto] Loading \'MiniSodium\' implementation...');
         serviceImpl = new CordovaServiceFactory();
       }
       else {
-        console.debug('[crypto] Loading FullJS implementation...');
+        console.debug('[crypto] Loading \'FullJS\' implementation...');
         serviceImpl = new FullJSServiceFactory();
       }
 
@@ -822,7 +822,6 @@ angular.module('cesium.crypto.services', ['cesium.utils.services'])
 
     });
 
-
     return service;
   })
 
@@ -831,7 +830,7 @@ angular.module('cesium.crypto.services', ['cesium.utils.services'])
      Crypto advanced service for Cesium
    */
 
-  .factory('csCrypto', function($q, $rootScope, CryptoUtils, UIUtils, Modals) {
+  .factory('csCrypto', function($q, $rootScope, $timeout, CryptoUtils, UIUtils, Modals) {
     'ngInject';
 
     function test(regexpContent) {
@@ -989,8 +988,8 @@ angular.module('cesium.crypto.services', ['cesium.utils.services'])
     function parseWIF_or_EWIF(data_base58, options) {
       options = options || {};
 
-      var data_int8 = CryptoUtils.base58.decode(data_base58);
-      if (data_int8.length != constants.EWIF.DATA_LENGTH && data_int8.length != constants.WIF.DATA_LENGTH) {
+      var data_int8 = data_base58 && CryptoUtils.base58.decode(data_base58);
+      if (!data_int8 || data_int8.length != constants.EWIF.DATA_LENGTH && data_int8.length != constants.WIF.DATA_LENGTH) {
         return $q.reject('Invalid WIF or EWIF format (invalid bytes count).');
       }
 
@@ -1121,13 +1120,13 @@ angular.module('cesium.crypto.services', ['cesium.utils.services'])
           // Check salt
           var expectedSalt = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(keypair.signPk)).slice(0,4);
           if(CryptoUtils.util.encode_base58(salt) !== CryptoUtils.util.encode_base58(expectedSalt)) {
-            throw {ucode: errorCodes.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD'};
+            throw {ucode: errorCodes.BAD_PASSWORD, message: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'};
           }
 
           // Check checksum
           var expectedChecksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(ewif_int8_no_checksum)).slice(0,2);
           if (CryptoUtils.util.encode_base58(checksum) != CryptoUtils.util.encode_base58(expectedChecksum)) {
-            throw {ucode: errorCodes.BAD_CHECKSUM, message: 'ERROR.BAD_CHECKSUM'};
+            throw {ucode: errorCodes.BAD_CHECKSUM, message: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_CHECKSUM'};
           }
 
           return keypair;
@@ -1408,13 +1407,15 @@ angular.module('cesium.crypto.services', ['cesium.utils.services'])
       options.withSecret = angular.isDefined(options.withSecret) ? options.withSecret : true;
       options.silent = angular.isDefined(options.withSecret) ? options.silent : false;
       options.password = function() {
-        UIUtils.loading.hide();
-        return Modals.showPassword({
-          title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',
-          subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP',
-          error: options.error,
-          scope: $scope
-        })
+        return UIUtils.loading.hide(100)
+          .then(function() {
+            return Modals.showPassword({
+              title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',
+              subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP',
+              error: options.error,
+              scope: options.scope
+            })
+          })
           .then(function(password) {
             // Timeout is need to force popup to be hide
             return $timeout(function() {
@@ -1433,8 +1434,8 @@ angular.module('cesium.crypto.services', ['cesium.utils.services'])
           return res;
         })
         .catch(function(err) {
-          if (err && err == 'CANCELLED') return;
-          if (err && err.ucode == csCrypto.errorCodes.BAD_PASSWORD) {
+          if (err && err === 'CANCELLED') return;
+          if (err && err.ucode == errorCodes.BAD_PASSWORD) {
             // recursive call
             return parseKeyFileData(data, {withSecret: options.withSecret, error: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'});
           }
diff --git a/www/js/services/storage-services.js b/www/js/services/storage-services.js
index bc13a90c230a0f1ad38a997b69f12b13e22a9ec8..7517e6c15f6ace78adcf440fc33d8763e9b02553 100644
--- a/www/js/services/storage-services.js
+++ b/www/js/services/storage-services.js
@@ -30,7 +30,7 @@ angular.module('cesium.storage.services', [ 'cesium.config'])
     return exports;
   })
 
-  .factory('localStorage', function($window, $q, sessionStorage) {
+  .factory('localStorage', function($window, $q, $log, sessionStorage) {
     'ngInject';
 
     var
@@ -100,32 +100,48 @@ angular.module('cesium.storage.services', [ 'cesium.config'])
 
     // Get a value from the secure storage
     exports.secure.get = function(key, defaultValue) {
-      var deferred = $q.defer();
-      exports.secure.storage.get(
-        function (value) {
-          if (!value && defaultValue) {
-            deferred.resolve(defaultValue);
-          }
-          else {
-            deferred.resolve(value);
-          }
-        },
-        function (err) { deferred.reject(err); },
-        key);
-      return deferred.promise;
+      return $q(function(resolve, reject) {
+        exports.secure.storage.get(
+          function (value) {
+            if (!value && defaultValue) {
+              resolve(defaultValue);
+            }
+            else {
+              resolve(value);
+            }
+          },
+          function (err) {
+            $log.error(err);
+            resolve(); // Error = not found
+          },
+          key);
+      });
     };
 
     // Set a object to the secure storage
     exports.secure.setObject = function(key, value) {
-      return exports.secure.put(key, value ? JSON.stringify(value) : undefined);
+      $log.debug("[storage] Setting object into secure storage, using key=" + key);
+      return $q(function(resolve, reject){
+        exports.secure.storage.set(
+          resolve,
+          reject,
+          key,
+          value ? JSON.stringify(value) : undefined);
+      });
     };
 
     // Get a object from the secure storage
     exports.secure.getObject = function(key) {
-      return exports.secure.storage.get(key)
-        .then(function(value) {
-          return JSON.parse(value||'null');
-        });
+      $log.debug("[storage] Getting object from secure storage, using key=" + key);
+      return $q(function(resolve, reject){
+        exports.secure.storage.get(
+          function(value) {resolve(JSON.parse(value||'null'));},
+          function(err) {
+            $log.error(err);
+            resolve(); // Error = not found
+          },
+          key);
+      });
     };
 
     function initStandardStorage() {
@@ -196,7 +212,6 @@ angular.module('cesium.storage.services', [ 'cesium.config'])
 
       // Use Cordova secure storage plugin
       if (isDevice) {
-        console.debug("[storage] Starting secure storage...");
         startPromise = initSecureStorage();
       }