diff --git a/www/i18n/locale-en-GB.json b/www/i18n/locale-en-GB.json
index adc3ddfc00b88ddd03361be311a9e112a7038b8a..c79263a8df87e024190c1f5da6e2b15c120a570c 100644
--- a/www/i18n/locale-en-GB.json
+++ b/www/i18n/locale-en-GB.json
@@ -31,7 +31,7 @@
     "BTN_ADD": "Add",
     "BTN_SEARCH": "Search",
     "BTN_REFRESH": "Refresh",
-    "BTN_RETRY": "Try again",
+    "BTN_RETRY": "Retry",
     "BTN_START": "Start",
     "BTN_CONTINUE": "Continue",
     "BTN_CREATE": "Create",
@@ -571,6 +571,8 @@
     "FIELD_TOO_SHORT_WITH_LENGTH": "This field value is too short.",
     "FIELD_TOO_LONG": "Value is exceeding max length.",
     "FIELD_TOO_LONG_WITH_LENGTH": "Value is too long (max {{maxLength}} characters).",
+    "FIELD_MIN": "Minimum value: {{min}}",
+    "FIELD_MAX": "Maximal value: {{max}}",
     "FIELD_ACCENT": "Commas and accent characters not allowed",
     "FIELD_NOT_NUMBER": "Value is not a number",
     "FIELD_NOT_INT": "Value is not an integer",
diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json
index ffec30a4f462bbcea29d657f70222d2aa88769a4..17dcd1510fd4a289133e354c18a8e2a1cf4becb3 100644
--- a/www/i18n/locale-en.json
+++ b/www/i18n/locale-en.json
@@ -571,6 +571,8 @@
     "FIELD_TOO_SHORT_WITH_LENGTH": "This field value is too short.",
     "FIELD_TOO_LONG": "Value is exceeding max length.",
     "FIELD_TOO_LONG_WITH_LENGTH": "Value is too long (max {{maxLength}} characters).",
+    "FIELD_MIN": "Minimum value: {{min}}",
+    "FIELD_MAX": "Maximal value: {{max}}",
     "FIELD_ACCENT": "Commas and accent characters not allowed",
     "FIELD_NOT_NUMBER": "Value is not a number",
     "FIELD_NOT_INT": "Value is not an integer",
diff --git a/www/i18n/locale-es-ES.json b/www/i18n/locale-es-ES.json
index ea791d926f3679e9954d0f1aaed3d57c4c25f64d..6741c10dea408981f2ee485904015a07e54dba6e 100644
--- a/www/i18n/locale-es-ES.json
+++ b/www/i18n/locale-es-ES.json
@@ -31,8 +31,10 @@
     "BTN_ADD": "Añadir",
     "BTN_SEARCH": "Buscar",
     "BTN_REFRESH": "Actualisar",
+    "BTN_RETRY": "Empezar de nuevo",
     "BTN_START": "Empezar",
     "BTN_CONTINUE": "Continuar",
+    "BTN_CREATE": "Crear",
     "BTN_UNDERSTOOD": "He entendido",
     "BTN_OPTIONS": "Opciónes",
     "BTN_HELP_TOUR": "Visita guiada",
@@ -40,6 +42,7 @@
     "BTN_DOWNLOAD": "Descargar",
     "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Descargar el estado de cuenta",
     "BTN_MODIFY": "Cambio",
+    "CHOOSE_FILE": "Publique archivo<br/>o haga clic para seleccionar la",
     "DAYS": "Dias",
     "NO_ACCOUNT_QUESTION": "Todavía no miembre ? Creer una cuenta !",
     "SEARCH_NO_RESULT": "Ninguno resultado encontrado",
@@ -84,7 +87,6 @@
     "HOME": "Recepción",
     "WOT": "Anuario",
     "CURRENCY": "Moneda",
-    "CURRENCIES": "Monnaies",
     "ACCOUNT": "Mi cuenta",
     "TRANSFER": "Transferencia",
     "SCAN": "Escáner",
@@ -274,6 +276,7 @@
     "CURRENT_BLOCK" : "Bloque #",
     "POPOVER_FILTER_TITLE": "Filtro",
     "OFFLINE": "Nodos fuera de línea",
+    "BTN_SHOW_PEER": "Ver nodo",
     "VIEW": {
       "TITLE": "Nodo",
       "OWNER": "Propiedad de ",
@@ -360,6 +363,7 @@
     "SHOW_SALT": "Visualizar el identificador secreto ?",
     "PASSWORD": "Contraseña",
     "PASSWORD_HELP": "Contraseña",
+    "PUBKEY_HELP": "Ejemplo : « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",
     "NO_ACCOUNT_QUESTION": "Ahora no tiene cuenta ?",
     "CREATE_ACCOUNT": "Creer una cuenta",
     "FORGOTTEN_ID": "Contraseña olvidada ?",
@@ -382,7 +386,7 @@
     "PENDING_TX": "Transacciónes en proceso de tratamiento",
     "ERROR_TX": "Transacciónes no ejecutadas",
     "ERROR_TX_SENT": "Transacciónes mandadas",
-    "ERROR_TX_RECEIVED": "Transacciónes recibidas",
+    "PENDING_TX_RECEIVED": "Tansacciones en espera de la recepción",
     "EVENTS": "Eventos",
     "WAITING_MEMBERSHIP": "Solicitud de adhesión mandada. En espera de aceptación.",
     "WAITING_CERTIFICATIONS": "Debe obtener {{needCertificationCount}} certificación(es) para estar miembro.",
@@ -416,8 +420,10 @@
       "REGISTRATION_NODE_HELP": "Si usted no confía en este nodo, <a ng-click=\"doQuickFix('settings')\">cambie la configuración</a> de Cesium.",
       "SELECT_ACCOUNT_TYPE": "Elegir el tipo de cuenta para crear:",
       "MEMBER_ACCOUNT": "Cuenta miembro",
+      "MEMBER_ACCOUNT_TITLE": "Crear de un cuenta de miembro",
       "MEMBER_ACCOUNT_HELP": "Si ya no está inscrito como un individuo (Solamente una cuenta posible por individuo).",
       "WALLET_ACCOUNT": "Simple monedero",
+      "WALLET_ACCOUNT_TITLE": "Crear de un simple cuenta",
       "WALLET_ACCOUNT_HELP": "Simple cartera por todos otros casos, por ejemplo si necesita una cuenta suplementaria.<br/>No Dividendo Universal sera creido por esta cuenta.",
       "SALT_WARNING": "Elige su identificador secreto.<br/>Se solicitará cada vez se conectará con esta cuenta.<br/><br/><b>Retiene bien este identificador secreto</b>.<br/>En caso de pérdida, nadie podrá acceder su cuenta !",
       "PASSWORD_WARNING": "Elige su contraseña.<br/>Se solicitará cada vez se conectará con esta cuenta.<br/><br/><b>Retiene bien esta contraseña</b>.<br/>En caso de pérdida, nadie podrá acceder su cuenta !",
@@ -448,8 +454,6 @@
       "ADD_QUESTION": "Añadir una pregunta personalizada ",
       "BTN_CLEAN": "Vaciar",
       "BTN_RESET": "Reinicializar",
-      "CHOOSE_FILE": "Dejar su fichero <br/>o hace un clic para seleccionarlo",
-      "DEFINITELY_REVOKE": "Revocar definitivamente esta identidad",
       "DOWNLOAD_REVOKE": "Salvar un fichero de revocación",
       "HELP_LEVEL": "Para generar un fichero de salvaguarda de sus identificadores, elige <strong> al menos {{nb}} preguntas :</strong>",
       "LEVEL": "Nivel de seguridad",
@@ -475,10 +479,9 @@
       "QUESTION_18": "Cuál es el nombre de su equipo de deporte preferido ?",
       "QUESTION_19": "Cuál fue el oficio de su abuelo ?",
       "RECOVER_ID": "Recuperar sus identificadores",
-      "REVOCATION": "Revocación ...",
+      "REVOCATION_WITH_FILE": "Revocar una identidad a partir de un fichero",
       "REVOCATION_FILENAME": "revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",
-      "REVOKE": "Revocar esta identidad",
-      "REVOKE_WITH_FILE": "Revocar una identidad a partir de un fichero",
+      "REVOCATION_WALLET": "Revocar esta identidad",
       "SAVE_ID": "Salvar sus identificadores",
       "STRONG_LEVEL": "Alto <span class=\"hidden-xs \">(6 preguntas mínimo)</span>",
       "TITLE": "Cuenta y seguridad"
@@ -514,6 +517,8 @@
     "FIELD_TOO_SHORT_WITH_LENGTH": "Valor demasiado corta ({{minLength}} carácteres mín)",
     "FIELD_TOO_LONG": "Valor demasiado larga",
     "FIELD_TOO_LONG_WITH_LENGTH": "Valor demasiado larga ({{maxLength}} carácteres máx)",
+    "FIELD_MIN": "Valor mínimo : {{min}}",
+    "FIELD_MAX": "Valor máximo : {{max}}",
     "FIELD_ACCENT": "Carácteres acentuados y comas no autorizados",
     "FIELD_NOT_NUMBER": "Valor numérica esperada",
     "FIELD_NOT_INT": "Valor entera esperada",
@@ -574,11 +579,14 @@
     "ONLY_SELF_CAN_EXECUTE_THIS_ACTION": "Debe haber <b>publicado su identidad</b> para poder realizar esta acción.",
     "GET_BLOCK_FAILED": "Fracaso en la recuperación del bloque",
     "INVALID_BLOCK_HASH": "Bloque no encontrado (hash diferente)",
+    "DOWNLOAD_REVOCATION_FAILED": "Debe seleccionar un fichero texto",
     "REVOCATION_FAILED": "Fracas en la revocación.",
     "SALT_OR_PASSWORD_NOT_CONFIRMED": "Identificador secreto o contraseña incorrectos",
     "RECOVER_ID_FAILED": "Fracaso en la recuperación de los identificadores",
     "LOAD_FILE_FAILED" : "Fracaso en la carga del fichero",
-    "ONLY_TEXT_FILE": "Debe seleccionar un fichero texto",
+    "NOT_VALID_REVOCATION_FILE": "Revocación archivo no válido (formato de archivo malo)",
+    "NOT_VALID_SAVE_ID_FILE": "Archivo no válido (formato de archivo malo)",
+    "NOT_VALID_KEY_FILE": "Archivo no válido (formato de archivo malo)",
     "EXISTING_ACCOUNT": "Su contraseña corresponde a una cuenta existente, la <a ng-click=\"showHelpModal('pubkey')\">clave pública</a> es:",
     "EXISTING_ACCOUNT_REQUEST": "Por favor, cambie su contraseña para que coincida con una cuenta sin usar.",
     "GET_LICENSE_FILE_FAILED": "Obtener el archivo de licencia no puede",
diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json
index 7ccee6f2356d570c134d3e0f081b95a8e3c1bb88..5c92c4295f2b1c0276d7dfc45815bbcca5aef600 100644
--- a/www/i18n/locale-fr-FR.json
+++ b/www/i18n/locale-fr-FR.json
@@ -86,9 +86,7 @@
   "MENU": {
     "HOME": "Accueil",
     "WOT": "Annuaire",
-    "MARKET": "Annonces",
     "CURRENCY": "Monnaie",
-    "CURRENCIES": "Monnaies",
     "ACCOUNT": "Mon compte",
     "TRANSFER": "Virement",
     "SCAN": "Scanner",
@@ -571,6 +569,8 @@
     "FIELD_TOO_SHORT_WITH_LENGTH": "Valeur trop courte ({{minLength}} caractères min)",
     "FIELD_TOO_LONG": "Valeur trop longue",
     "FIELD_TOO_LONG_WITH_LENGTH": "Valeur trop longue ({{maxLength}} caractères max)",
+    "FIELD_MIN": "Valeur minimale : {{min}}",
+    "FIELD_MAX": "Valeur maximale : {{max}}",
     "FIELD_ACCENT": "Caractères accentués et virgules non autorisés",
     "FIELD_NOT_NUMBER": "Valeur numérique attendue",
     "FIELD_NOT_INT": "Valeur entière attendue",
diff --git a/www/plugins/es/js/controllers/profile-controllers.js b/www/plugins/es/js/controllers/profile-controllers.js
index af5743f350b46fe2791ade8f88c8af664de68679..218ddd2f014d85a19d1b724bf6dcde42b934fcf9 100644
--- a/www/plugins/es/js/controllers/profile-controllers.js
+++ b/www/plugins/es/js/controllers/profile-controllers.js
@@ -76,15 +76,31 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $
           .then(function(confirmSave) {
             $scope.loading = false;
             if (confirmSave) {
-              return $scope.save();
+              $scope.form.$submitted=true;
+              return $scope.save(false/*silent*/, true/*haswait debounce*/)
+                .then(function(saved){
+                  if (saved) {
+                    $scope.dirty = false;
+                  }
+                  return saved; // change state only if not error
+                });
+            }
+            else {
+              $scope.dirty = false;
+              return true; // ok, change state
             }
           })
-          .then(function() {
-            $scope.dirty = false;
-            $ionicHistory.nextViewOptions({
-              historyRoot: true
-            });
-            $state.go(next.name, nextParams);
+          .then(function(confirmGo) {
+            if (confirmGo) {
+              // continue to the order state
+              $ionicHistory.nextViewOptions({
+                historyRoot: true
+              });
+              $state.go(next.name, nextParams);
+            }
+          })
+          .catch(function(err) {
+
           });
       }
     }
@@ -125,6 +141,8 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $
     if (profile.avatar) {
       $scope.avatarStyle={'background-image':'url("'+$scope.avatar.src+'")'};
     }
+    $scope.formData.geoPoint = $scope.formData.geoPoint || {};
+
     $scope.motion.show();
     UIUtils.loading.hide();
 
@@ -208,12 +226,12 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $
       if (formData.position) {
         delete formData.position;
       }
-      if ($scope.formData.geoPoint && $scope.formData.geoPoint.lat && $scope.formData.geoPoint.lon) {
-        $scope.formData.geoPoint.lat =  parseFloat($scope.formData.geoPoint.lat);
-        $scope.formData.geoPoint.lon =  parseFloat($scope.formData.geoPoint.lon);
+      if (formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon) {
+        formData.geoPoint.lat =  parseFloat(formData.geoPoint.lat);
+        formData.geoPoint.lon =  parseFloat(formData.geoPoint.lon);
       }
       else{
-        $scope.formData.geoPoint = null;
+        formData.geoPoint = null;
       }
 
       if (!$scope.existing) {
@@ -225,6 +243,7 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $
             $scope.dirty = false;
             updateWallet(formData);
             showSuccessToast();
+            return true;
           })
           .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED'));
       }
@@ -236,16 +255,17 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $
             $scope.dirty = false;
             updateWallet(formData);
             showSuccessToast();
+            return true;
           })
           .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED'));
       }
-    };
+    }; // end of doFinishSave
 
     if ($scope.avatar && $scope.avatar.src) {
       return UIUtils.image.resizeSrc($scope.avatar.src, true) // resize to thumbnail
         .then(function(imageSrc) {
           $scope.formData.avatar = esHttp.image.toAttachment({src: imageSrc});
-          doFinishSave($scope.formData);
+          return doFinishSave($scope.formData);
         });
     }
     else {
@@ -255,9 +275,9 @@ function ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $
   };
 
   $scope.saveAndClose = function() {
-    $scope.save()
-      .then(function() {
-        $scope.close();
+    return $scope.save()
+      .then(function(saved) {
+        if (saved) $scope.close();
       });
   };
 
diff --git a/www/plugins/es/templates/user/edit_profile.html b/www/plugins/es/templates/user/edit_profile.html
index 7fc1f170b2c79b9ce6dcdafa903f043f5b4e9622..5217f28dc80190ccf4531c790d6960c8fd97ef4b 100644
--- a/www/plugins/es/templates/user/edit_profile.html
+++ b/www/plugins/es/templates/user/edit_profile.html
@@ -118,13 +118,27 @@
 
               <!-- lat -->
               <div class="col no-padding">
-                <label class="item item-input item-floating-label">
+                <label class="item item-input item-floating-label"
+                       ng-class="{'item-input-error': form.$submitted && form.latitude.$invalid}">
                   <span class="input-label" translate>PROFILE.LATITUDE</span>
-                  <input class="no-padding-right" type="number" placeholder="{{'PROFILE.LATITUDE_HELP'|translate}}"
+                  <input class="no-padding-right"
+                         name="latitude"
+                         type="number" placeholder="{{'PROFILE.LATITUDE_HELP'|translate}}"
                          ng-model="formData.geoPoint.lat"
                          ng-model-options="{ debounce: 350 }"
-                         ng-change="onGeoPointChanged()">
+                         ng-change="onFormDataChanged()"
+                         min="-90" max="90">
                 </label>
+                <div class="form-errors"
+                     ng-show="form.$submitted && form.latitude.$error"
+                     ng-messages="form.latitude.$error">
+                  <div class="form-error" ng-message="min">
+                    <span translate="ERROR.FIELD_MIN" translate-values="{min: -90}"></span>
+                  </div>
+                  <div class="form-error" ng-message="max">
+                    <span translate="ERROR.FIELD_MAX" translate-values="{max: 90}"></span>
+                  </div>
+                </div>
               </div>
 
               <div class="col-10 no-padding hidden-xs">
@@ -133,13 +147,27 @@
 
               <!-- lon -->
               <div class="col no-padding">
-                <label class="item item-input item-floating-label">
+                <label class="item item-input item-floating-label"
+                       ng-class="{'item-input-error': form.$submitted && form.longitude.$invalid}">
                   <span class="input-label" translate>PROFILE.LONGITUDE</span>
-                  <input class="no-padding-right" type="number" placeholder="{{'PROFILE.LONGITUDE_HELP'|translate}}"
+                  <input class="no-padding-right"
+                         name="longitude"
+                         type="number" placeholder="{{'PROFILE.LONGITUDE_HELP'|translate}}"
                          ng-model="formData.geoPoint.lon"
                          ng-model-options="{ debounce: 350 }"
-                         ng-change="onGeoPointChanged()">
+                         ng-change="onFormDataChanged()"
+                         min="-180" max="180">
                 </label>
+                <div class="form-errors"
+                     ng-show="form.$submitted && form.longitude.$error"
+                     ng-messages="form.longitude.$error">
+                  <div class="form-error" ng-message="min">
+                    <span translate="ERROR.FIELD_MIN" translate-values="{min: -180}"></span>
+                  </div>
+                  <div class="form-error" ng-message="max">
+                    <span translate="ERROR.FIELD_MAX" translate-values="{max: 180}"></span>
+                  </div>
+                </div>
               </div>
 
               <div class="col col-40 no-padding">