diff --git a/neosensor/libraries/neocampus/sensocampus.cpp b/neosensor/libraries/neocampus/sensocampus.cpp
index a503f647851b6342dc5fb674f1dd44b4a8910179..d148f08893c0efc9bf5d8559f838d9cea701b336 100644
--- a/neosensor/libraries/neocampus/sensocampus.cpp
+++ b/neosensor/libraries/neocampus/sensocampus.cpp
@@ -9,6 +9,7 @@
  *  duplication in 'loadSensoConfig()
  * ---
  * Notes:
+ * - BASE_TOPIC is not taken from http credentials but from 1st topic of config !
  * ---
  * F.Thiebolt   may.23  add NVS support to save sensOCampus given credentials
  * F.Thiebolt   aug.20  removed EEPROM support
@@ -367,6 +368,33 @@ bool senso::_saveConfig( JsonObject root ) {
     /*
      * add additional parameters to save here
      */
+
+
+    /*
+     * NVS: saving mqtt credentials
+     */
+#ifdef ESP32
+    // save SENSO MQTT credentials to NVS
+    Preferences _nvs;
+
+    if( _nvs.begin(SENSO_NVS_NAMESPACE,false) ) {  // R/W mode
+
+      if( _nvs.putBytes(SENSO_MQTT_LOGIN_KEY,_mqtt_login,strlen(_mqtt_login)+1) != strlen(_mqtt_login)+1 ) {
+        log_error(F("\n[senso] ERROR while saving MQTT_LOGIN to NVS ?!?!"));log_flush();
+      }
+      if( _nvs.putBytes(SENSO_MQTT_PASS_KEY,_mqtt_passwd,strlen(_mqtt_passwd)+1) != strlen(_mqtt_passwd)+1 ) {
+        log_error(F("\n[senso] ERROR while saving MQTT_PASSWD to NVS ?!?!"));log_flush();
+      }
+      // close NVS namespace
+      _nvs.end();
+      log_debug(F("\n[senso] successfully saved MQTT credentials to NVS namespace '"));log_debug(SENSO_NVS_NAMESPACE);log_debug(F("' ... "));log_flush();
+    }
+    else {
+      log_error(F("\n[senso] unable to save sensOCampus MQTT credentials in NVS ?!?!"));log_flush();
+    }
+
+#endif /* ESP32 */
+
   }
   else {
     log_debug(F("\n[senso] no change in options to save ..."));log_flush();
@@ -541,9 +569,14 @@ bool senso::_parseCredentials( char *json ) {
     // no password provided but login matches ours ==> we also have the right password :)
     log_info(F("\n[senso] found SAME 'login' = "));log_info(_mqtt_login); log_flush();
   }
-  // no password provided and login does not match ... but will it match login from NVS ?
-  else if( ) {
-    to be continued
+  /* so far, no password provided and login does not match
+   * trying to get credentials from NVS ... if it matches JSON login
+   */
+  else if( _getNVScredentials( (const char *)(root[F("login")]) ) ) {
+    // ok, JSON['login']==NVS['login'] ==> NVS has valid credentials :)
+    // ... probably cause SPIFFS SENSO file has been deleted by new SPIFFS format
+    log_info(F("\n[senso] found NVS'login' = "));log_info(_mqtt_login); log_flush();
+    log_info(F("\n[senso] found NVS'password' = "));log_info(_mqtt_passwd); log_flush();    
     _updated = true;  // to save config
   }
   else {
@@ -607,6 +640,62 @@ bool senso::_parseConfig( const char *json ) {
 }
 
 
+/*
+ * [NVS] retrieve sensOCampus mqtt login/passwd from Non Volatile Storage
+ * if NVS_login matches the jsonLogin parameter, mqtt credentials will get
+ * copied to senso object + return true; return false otherwise
+ * Note: only for ESP32
+ */
+bool senso::_getNVScredentials( const char * jsonMQTTlogin ) {
+#ifndef ESP32
+  log_info(F("\n[senso] sensOCampus NVS credentials not available on this system ..."));log_flush();
+  return false;
+#else
+  // ESP32
+  Preferences _nvs;
+  
+  // open NVS sensOCampus namespace
+  if( not _nvs.begin(SENSO_NVS_NAMESPACE,true) ) {  // readonly mode
+    log_debug(F("\n[senso] NVS sensOCampus namespace does not exists ..."));log_flush();
+    return false;
+  }
+
+  // ok, NVS sensOCampus namespace exists ...
+  log_debug(F("\n[senso] opened NVS sensOCampus credentials namespace ..."));log_flush();
+
+  // check if NVS mqtt_login exists 
+  if( not _nvs.isKey(SENSO_MQTT_LOGIN_KEY) ) {
+    _nvs.end();
+    return false;
+  }
+
+  // ok NVS mqtt_login exists ... but does it matches the parameter
+  char _nvs_mqtt_login[SENSO_MQTT_LOGIN_LENGTH];
+  _nvs.getBytes(SENSO_MQTT_LOGIN_KEY, _nvs_mqtt_login, sizeof(_nvs_mqtt_login));
+  _nvs_mqtt_login[sizeof(_nvs_mqtt_login)-1]='\0';  // just to get sure ...
+  if( strncmp(_nvs_mqtt_login,jsonMQTTlogin,sizeof(_nvs_mqtt_login)) !=0 ) {
+    // NVS mqtt_login does not matches JsonMQTTlogin !
+    log_debug(F("\n[senso] NVS mqtt_login does NOT matches the one provided by sensOCampus ..."));log_flush();
+    _nvs.end();
+    return false;
+  }
+
+  // excellent, NVS mqtt_login == JsonMQTTlogin ... check passwd exists
+  if( not _nvs.isKey(SENSO_MQTT_PASS_KEY) ) {
+    log_error(F("\n[senso] NVS mqtt_password does not exists while NVS mqtt_login exists ?!?!"));log_flush();
+    _nvs.end();
+    return false;
+  }
+  // now set credentials from NVS
+  strncpy(_mqtt_login,_nvs_mqtt_login,sizeof(_mqtt_login));
+  _nvs.getBytes(SENSO_MQTT_PASS_KEY, _mqtt_passwd, sizeof(_mqtt_passwd));
+
+  _nvs.end();
+  return true;
+#endif /* ESP32 */  
+}
+
+
 /*
  * Enable various modules to fetch their configuration that may have been
  * retrieved from sensOCampus server
diff --git a/neosensor/libraries/neocampus/sensocampus.h b/neosensor/libraries/neocampus/sensocampus.h
index 914a9a1d516fb9f84ebf87deff170b0a9bc8bbc2..9bef67fba414b1fbbd38d273f1cd4bd172ad9e1b 100644
--- a/neosensor/libraries/neocampus/sensocampus.h
+++ b/neosensor/libraries/neocampus/sensocampus.h
@@ -75,11 +75,11 @@ private:
      */
     void _applyDefaults( void );
     bool _parseCredentials( char * );
-    bool _parseConfig( const char * );    // VERY IMPORTANT 'const' as it force ArduinoJson to create a copy
-    bool _loadConfig( JsonObject );       // interprets JSON buffer from config file
-    bool _saveConfig( JsonObject );       // fill JSON buffer with things to save to config file
-    bool _NVSgetLogin( & );               // [NVS] retrieve sensOCampus mqtt_login from NonVolatileStorage
-    bool _NVSgetPasswd( & );              // [NVS] retrieve sensOCampus mqtt_passwd from NonVolatileStorage
+    bool _parseConfig( const char * );        // VERY IMPORTANT 'const' as it force ArduinoJson to create a copy
+    bool _loadConfig( JsonObject );           // interprets JSON buffer from config file
+    bool _saveConfig( JsonObject );           // fill JSON buffer with things to save to config file
+    bool _getNVScredentials( const char * );  // [NVS] retrieve sensOCampus mqtt login/passwd from Non Volatile Storage
+                                              // if they match the (JSON mqtt_login) parameter
 
     /*
      * private attributes
diff --git a/neosensor/libraries/neocampus/wifiParametersMgt.cpp b/neosensor/libraries/neocampus/wifiParametersMgt.cpp
index f15c37b149cf00938359dfd2436239cb3475fdab..093d9806b4ebc53076850de39e7e3eda9b4f0c50 100644
--- a/neosensor/libraries/neocampus/wifiParametersMgt.cpp
+++ b/neosensor/libraries/neocampus/wifiParametersMgt.cpp
@@ -364,19 +364,19 @@ void wifiParametersMgt::_applyDefaults( void ) {
    * [may.23] now trying to access wifi credentials from NVS namespace
    */
 #ifdef ESP32
-  Preferences nvs_wifi;
-  if( nvs_wifi.begin(WIFI_NVS_NAMESPACE,true) ) {  // readonly mode
+  Preferences _nvs;
+  if( _nvs.begin(WIFI_NVS_NAMESPACE,true) ) {  // readonly mode
     log_debug(F("\n[wifiParams] opened NVS WiFi credentials namespace ..."));log_flush();
-    if( nvs_wifi.isKey(WIFI_NVS_SSID_KEY) ) {
-      nvs_wifi.getBytes(WIFI_NVS_SSID_KEY, _ssid, sizeof(_ssid));
+    if( _nvs.isKey(WIFI_NVS_SSID_KEY) ) {
+      _nvs.getBytes(WIFI_NVS_SSID_KEY, _ssid, sizeof(_ssid));
       log_debug(F("\n\t[NVS] SSID :"));log_debug(_ssid);log_flush();
     }
-    if( nvs_wifi.isKey(WIFI_NVS_PASS_KEY) ) {
-      nvs_wifi.getBytes(WIFI_NVS_PASS_KEY, _pass, sizeof(_pass));
+    if( _nvs.isKey(WIFI_NVS_PASS_KEY) ) {
+      _nvs.getBytes(WIFI_NVS_PASS_KEY, _pass, sizeof(_pass));
       log_debug(F("\n\t[NVS] PASS :"));log_debug(_pass);log_flush();
     }
     // close NVS namespace
-    nvs_wifi.end();
+    _nvs.end();
   }
 #elif defined (ESP8266)
   #warning "[ESP8266] retrieving WiFi credentials from WiFi library is experimental"
@@ -414,18 +414,18 @@ bool wifiParametersMgt::_saveConfig( JsonObject root ) {
     root["pass"] = _pass;
 #ifdef ESP32
     // save WiFi credentials to NVS
-    Preferences nvs_wifi;
-    if( nvs_wifi.begin(WIFI_NVS_NAMESPACE,false) ) {  // R/W mode
+    Preferences _nvs;
+    if( _nvs.begin(WIFI_NVS_NAMESPACE,false) ) {  // R/W mode
       log_debug(F("\n[wifiParams] save WiFi credentials to NVS namespace '"));log_debug(WIFI_NVS_NAMESPACE);log_debug(F("' ... "));log_flush();
 
-      if( nvs_wifi.putBytes(WIFI_NVS_SSID_KEY,_ssid,strlen(_ssid)+1) != strlen(_ssid)+1 ) {
+      if( _nvs.putBytes(WIFI_NVS_SSID_KEY,_ssid,strlen(_ssid)+1) != strlen(_ssid)+1 ) {
         log_error(F("\n[wifiParams] ERROR while saving SSID to NVS ?!?!"));log_flush();
       }
-      if( nvs_wifi.putBytes(WIFI_NVS_PASS_KEY,_pass,strlen(_pass)+1) != strlen(_pass)+1 ) {
-        log_error(F("\n[[wifiParams] ERROR while saving PASS to NVS ?!?!"));log_flush();
+      if( _nvs.putBytes(WIFI_NVS_PASS_KEY,_pass,strlen(_pass)+1) != strlen(_pass)+1 ) {
+        log_error(F("\n[wifiParams] ERROR while saving PASS to NVS ?!?!"));log_flush();
       }
       // close NVS namespace
-      nvs_wifi.end();
+      _nvs.end();
     }
     else {
       log_error(F("\n[wifiParams] unable to create WiFi credentials namespace in NVS ?!?!"));log_flush();