diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs
index 2186fcc56fdae68d5cf222fbdfcde97aae7581a0..80fa7ba23e0ebc843331c96c223c5ae371b5e35a 100644
--- a/native/dubp_rs/src/dewif.rs
+++ b/native/dubp_rs/src/dewif.rs
@@ -117,7 +117,7 @@ pub(super) fn sign_several(
     }
 }
 
-fn log_n(system_memory: i64) -> u8 {
+pub(crate) fn log_n(system_memory: i64) -> u8 {
     if system_memory > 3_000_000_000 {
         15
     } else {
diff --git a/native/dubp_rs/src/legacy.rs b/native/dubp_rs/src/legacy.rs
index b5d649bcd1c05bda385df8cf5c6c5f9a3d6fdea1..049b6d17ae7e5d6aee23989dc7362a4f586f3f19 100644
--- a/native/dubp_rs/src/legacy.rs
+++ b/native/dubp_rs/src/legacy.rs
@@ -16,6 +16,25 @@
 use crate::*;
 use dup_crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword};
 
+pub(super) fn gen_dewif_from_legacy(
+    currency: &str,
+    salt: String,
+    password: String,
+    member_wallet: bool,
+    secret_code_type: SecretCodeType,
+    system_memory: i64,
+) -> Result<Vec<String>, DubpError> {
+    let currency = parse_currency(currency)?;
+    let keypair = KeyPairFromSaltedPasswordGenerator::with_default_parameters()
+        .generate(SaltedPassword::new(salt, password));
+
+    let log_n = crate::dewif::log_n(system_memory);
+    let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?;
+    let dewif = dup_crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code);
+    let pubkey = keypair.public_key().to_base58();
+    Ok(vec![dewif, secret_code, pubkey])
+}
+
 pub(super) fn get_pubkey(salt: &str, password: &str) -> String {
     KeyPairFromSaltedPasswordGenerator::with_default_parameters()
         .generate(SaltedPassword::new(salt.to_owned(), password.to_owned()))
diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs
index 7530a96568f5a79438d28c8ffd9e6082310e1548..91a2811419bd152247f9a0cbed961beef196cb40 100644
--- a/native/dubp_rs/src/lib.rs
+++ b/native/dubp_rs/src/lib.rs
@@ -122,6 +122,46 @@ pub extern "C" fn gen_dewif(
     )
 }
 
+#[no_mangle]
+pub extern "C" fn gen_dewif_from_legacy(
+    port: i64,
+    currency: *const raw::c_char,
+    salt: *const raw::c_char,
+    password: *const raw::c_char,
+    member_wallet: u32,
+    secret_code_type: u32,
+    system_memory: i64,
+) {
+    exec_async(
+        port,
+        || {
+            let currency = char_ptr_to_str(currency)?;
+            let salt = char_ptr_to_str(salt)?.to_owned();
+            let password = char_ptr_to_str(password)?.to_owned();
+            let member_wallet = member_wallet != 0;
+            let secret_code_type = SecretCodeType::from(secret_code_type);
+            Ok((
+                currency,
+                salt,
+                password,
+                member_wallet,
+                secret_code_type,
+                system_memory,
+            ))
+        },
+        |(currency, salt, password, member_wallet, secret_code_type, system_memory)| {
+            legacy::gen_dewif_from_legacy(
+                currency,
+                salt,
+                password,
+                member_wallet,
+                secret_code_type,
+                system_memory,
+            )
+        },
+    )
+}
+
 #[no_mangle]
 pub extern "C" fn gen_mnemonic(port: i64, language: u32) {
     exec_async(port, || u32_to_language(language), mnemonic::gen_mnemonic)
diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart
index 6332ea36d979be45d210f7a59fc212b627820cb1..7aa5c26cb10708006ea5a12d7ddb84af6232f071 100644
--- a/packages/dubp_rs/lib/dubp.dart
+++ b/packages/dubp_rs/lib/dubp.dart
@@ -49,6 +49,32 @@ class DubpRust {
     print("DUBP_RS Setup Done");
   }
 
+  /// Change the secret code that encrypts the `dewif` keypair.
+  static Future<NewWallet> changeDewifPin({
+    String currency = "g1",
+    String dewif,
+    String oldPin,
+    SecretCodeType secretCodeType = SecretCodeType.letters,
+  }) async {
+    int ram = SysInfo.getTotalPhysicalMemory();
+
+    final completer = Completer<List<String>>();
+    final sendPort = singleCompletePort<List<String>, List>(completer,
+        callback: _handleErrList);
+    native.change_dewif_secret_code(
+      sendPort.nativePort,
+      Utf8.toUtf8(currency),
+      Utf8.toUtf8(dewif),
+      Utf8.toUtf8(oldPin),
+      0,
+      secretCodeType.index,
+      ram,
+    );
+    List<String> newWallet = await completer.future;
+
+    return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
+  }
+
   /// Generate a random mnemonic
   static Future<String> genMnemonic({Language language = Language.english}) {
     final completer = Completer<String>();
@@ -61,23 +87,26 @@ class DubpRust {
     return completer.future;
   }
 
-  /// Change the secret code that encrypts the `dewif` keypair.
-  static Future<NewWallet> changeDewifPin({
+  /// Generate a wallet from a deprecated salt + password couple.
+  ///
+  /// This deprecated method must be used only for compatibility purpose !
+  static Future<NewWallet> genWalletFromDeprecatedSaltPassword({
     String currency = "g1",
-    String dewif,
-    String oldPin,
+    String salt,
+    String password,
     SecretCodeType secretCodeType = SecretCodeType.letters,
   }) async {
     int ram = SysInfo.getTotalPhysicalMemory();
+    print('ram=$ram');
 
     final completer = Completer<List<String>>();
     final sendPort = singleCompletePort<List<String>, List>(completer,
         callback: _handleErrList);
-    native.change_dewif_secret_code(
+    native.gen_dewif_from_legacy(
       sendPort.nativePort,
       Utf8.toUtf8(currency),
-      Utf8.toUtf8(dewif),
-      Utf8.toUtf8(oldPin),
+      Utf8.toUtf8(salt),
+      Utf8.toUtf8(password),
       0,
       secretCodeType.index,
       ram,
@@ -87,6 +116,7 @@ class DubpRust {
     return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
   }
 
+
   /// Generate a wallet from a mnemonic phrase.
   ///
   /// If the mnemonic is not in English, you must indicate the language of
@@ -120,30 +150,32 @@ class DubpRust {
     return Future.value(NewWallet._(newWallet[0], newWallet[1], newWallet[2]));
   }
 
-  /// Get public key (in base 58) of legacy wallet (password + salt)
-  static Future<String> getLegacyPublicKey({String password, String salt}) {
+  /// Get public key (in base 58) of `dewif` keypair.
+  static Future<String> getDewifPublicKey(
+      {String currency = "g1", String dewif, String pin}) async {
     final completer = Completer<String>();
     final sendPort =
         singleCompletePort<String, String>(completer, callback: _handleErr);
-    native.get_legacy_pubkey(
+    native.get_dewif_pubkey(
       sendPort.nativePort,
-      Utf8.toUtf8(password),
-      Utf8.toUtf8(salt),
+      Utf8.toUtf8(currency),
+      Utf8.toUtf8(dewif),
+      Utf8.toUtf8(pin),
     );
     return completer.future;
   }
 
-  /// Get public key (in base 58) of `dewif` keypair.
-  static Future<String> getDewifPublicKey(
-      {String currency = "g1", String dewif, String pin}) async {
+  /// Get public key (in base 58) of legacy wallet (password + salt)
+  ///
+  /// This deprecated method must be used only for compatibility purpose !
+  static Future<String> getLegacyPublicKey({String password, String salt}) {
     final completer = Completer<String>();
     final sendPort =
         singleCompletePort<String, String>(completer, callback: _handleErr);
-    native.get_dewif_pubkey(
+    native.get_legacy_pubkey(
       sendPort.nativePort,
-      Utf8.toUtf8(currency),
-      Utf8.toUtf8(dewif),
-      Utf8.toUtf8(pin),
+      Utf8.toUtf8(password),
+      Utf8.toUtf8(salt),
     );
     return completer.future;
   }
@@ -167,6 +199,8 @@ class DubpRust {
   }
 
   /// Sign the message `message` with legacy wallet (password + salt)
+  ///
+  /// This deprecated method must be used only for compatibility purpose !
   static Future<String> signLegacy(
       {String password, String salt, String message}) {
     final completer = Completer<String>();